ITPub博客

首页 > > > 初探nginx-将src的前n个字符转换成小写存放在dst字符串当中

初探nginx-将src的前n个字符转换成小写存放在dst字符串当中

作者:longmanma 时间:2019-12-13 17:37:07 0 删除 编辑

将src的前n个字符转换成小写存放在dst字符串当中,调用者需要保证dst指向的空间大于等于n,且指向的空间必须可写。操作不会对原字符串产生变动。如要更改原字符串,可以:

ngx_strlow(str->data, str->data, str->len);

ngx_strncmp(s1,s2,n)

区分大小写的字符串比较,只比较前n个字符。

ngx_strcmp(s1,s2)

区分大小写的不带长度的字符串比较。

ngx_int_t ngx_strcasecmp(u_char *s1, u_char *s2);

不区分大小写的不带长度的字符串比较。

ngx_int_t ngx_strncasecmp(u_char *s1, u_char *s2, size_t n);

不区分大小写的带长度的字符串比较,只比较前n个字符。

u_char * ngx_cdecl ngx_sprintf(u_char *buf, const char *fmt, ...);

u_char * ngx_cdecl ngx_snprintf(u_char *buf, size_t max, const char *fmt, ...);

u_char * ngx_cdecl ngx_slprintf(u_char *buf, u_char *last, const char *fmt, ...);

上面这三个函数用于字符串格式化,ngx_snprintf的第二个参数max指明buf的空间大小,ngx_slprintf则通过last来指明buf空间的大小。推荐使用第二个或第三个函数来格式化字符串,ngx_sprintf函数还是比较危险的,容易产生缓冲区溢出漏洞。在这一系列函数中,nginx在兼容glibc中格式化字符串的形式之外,还添加了一些方便格式化nginx类型的一些转义字符,比如%V用于格式化ngx_str_t结构。在nginx源文件的ngx_string.c中有说明:

/*

* supported formats:

* %[0][width][x][X]O off_t

* %[0][width]T time_t

* %[0][width][u][x|X]z ssize_t/size_t

* %[0][width][u][x|X]d int/u_int

* %[0][width][u][x|X]l long

* %[0][width|m][u][x|X]i ngx_int_t/ngx_uint_t

* %[0][width][u][x|X]D int32_t/uint32_t

* %[0][width][u][x|X]L int64_t/uint64_t

* %[0][width|m][u][x|X]A ngx_atomic_int_t/ngx_atomic_uint_t

* %[0][width][.width]f double, max valid number fits to %18.15f

* %P ngx_pid_t

* %M ngx_msec_t

* %r rlim_t

* %p void *

* %V ngx_str_t *

* %v ngx_variable_value_t *

* %s null-terminated string

* %*s length and string

* %Z '\0'

* %N '\n'

* %c char

* %% %

*

* reserved:

* %t ptrdiff_t

* %S null-terminated wchar string

* %C wchar

*/

这里特别要提醒的是,我们最常用于格式化ngx_str_t结构,其对应的转义符是%V,传给函数的一定要是指针类型,否则程序就会coredump掉。这也是我们最容易犯的错。比如:

ngx_str_tstr=ngx_string("hello world");charbuffer[1024];ngx_snprintf(buffer,1024,"%V",&str);// 注意,str取地址

void ngx_encode_base64(ngx_str_t *dst, ngx_str_t *src);

ngx_int_t ngx_decode_base64(ngx_str_t *dst, ngx_str_t *src);

这两个函数用于对str进行base64编码与解码,调用前,需要保证dst中有足够的空间来存放结果,如果不知道具体大小,可先调用ngx_base64_encoded_length与ngx_base64_decoded_length来预估最大占用空间。

uintptr_t ngx_escape_uri(u_char *dst, u_char *src, size_t size,

ngx_uint_t type);

对src进行编码,根据type来按不同的方式进行编码,如果dst为NULL,则返回需要转义的字符的数量,由此可得到需要的空间大小。type的类型可以是:

#define NGX_ESCAPE_URI 0

#define NGX_ESCAPE_ARGS 1

#define NGX_ESCAPE_HTML 2

#define NGX_ESCAPE_REFRESH 3

#define NGX_ESCAPE_MEMCACHED 4

#define NGX_ESCAPE_MAIL_AUTH 5

void ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type);

对src进行反编码,type可以是0、NGX_UNESCAPE_URI、NGX_UNESCAPE_REDIRECT这三个值。如果是0,则表示src中的所有字符都要进行转码。如果是NGX_UNESCAPE_URI与NGX_UNESCAPE_REDIRECT,则遇到’?’后就结束了,后面的字符就不管了。而NGX_UNESCAPE_URI与NGX_UNESCAPE_REDIRECT之间的区别是NGX_UNESCAPE_URI对于遇到的需要转码的字符,都会转码,而NGX_UNESCAPE_REDIRECT则只会对非可见字符进行转码。

uintptr_t ngx_escape_html(u_char *dst, u_char *src, size_t size);

对html标签进行编码。

当然,我这里只介绍了一些常用的api的使用,大家可以先熟悉一下,在实际使用过程中,遇到不明白的,最快最直接的方法就是去看源码,看api的实现或看nginx自身调用api的地方是怎么做的,代码就是最好的文档。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2730/viewspace-3156644/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 初探nginx- pipe
请登录后发表评论 登录
全部评论

注册时间:2019-12-18

  • 博文量
    492
  • 访问量
    11993