Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2313965
  • 博文数量: 252
  • 博客积分: 5472
  • 博客等级: 大校
  • 技术积分: 3107
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-17 18:39
文章分类

全部博文(252)

文章存档

2012年(96)

2011年(156)

分类: LINUX

2012-03-14 15:59:36

nginx字符串的数据类型的表示

nginx对c语言的字符串类型进行了简单的封装, core/ngx_string.h/c 里面包含这些封装的内容

其中定义了 ngx_str_t ,ngx_keyval_t, ngx_variable_value_t

这几个基础类型的定义如下


  1. typedef struct {
  2. size_t len;
  3. u_char *data;
  4. } ngx_str_t;


  5. typedef struct {
  6. ngx_str_t key;
  7. ngx_str_t value;
  8. } ngx_keyval_t;


  9. typedef struct {
  10. unsigned len:28;

  11. unsigned valid:1;
  12. unsigned no_cacheable:1;
  13. unsigned not_found:1;
  14. unsigned escape:1;

  15. u_char *data;
  16. } ngx_variable_value_t;

可以看出 ngx_str_t 在原有的uchar* 的基础上加入的字符串长度的附加信息, 初始化使用ngx_string宏进行,他的定义为:


  1. #define ngx_string(str) { sizeof(str) - 1, (u_char *) str }

测试字符串的代码 demo/basic_types/basic_types_str.c


  1. #include
  2. #include "ngx_config.h"
  3. #include "ngx_conf_file.h"
  4. #include "nginx.h"
  5. #include "ngx_core.h"
  6. #include "ngx_string.h"
  7. #include "ngx_string.h"

  8. volatile ngx_cycle_t *ngx_cycle;

  9. void
  10. ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
  11. const char *fmt, ...)
  12. {
  13. }

  14. int main()
  15. {
  16. u_char* p = NULL;
  17. ngx_uint_t size;
  18. ngx_str_t dst;
  19. ngx_str_t mystr = ngx_string("hello, world !");
  20. ngx_keyval_t pair = {ngx_string("url"), ngx_string("")};
  21. int dst_len =ngx_base64_encoded_length(mystr.len);
  22. printf("source length is %d, destination length is %d\n", mystr.len, dst_len );
  23. p = malloc( ngx_base64_encoded_length(mystr.len) + 1);
  24. dst.data = p;
  25. ngx_encode_base64(&dst, &mystr);
  26. printf("source str is %s\ndestination str is %s\n", mystr.data, dst.data);
  27. free(p);
  28. size = pair.value.len + 2 * ngx_escape_uri(NULL, pair.value.data, pair.value.len, NGX_ESCAPE_URI);
  29. p = malloc (size * sizeof(u_char));
  30. ngx_escape_uri(p, pair.value.data, pair.value.len, NGX_ESCAPE_URI);
  31. printf("escaped %s is : %s (%d)\noriginal url size is %d\n", pair.key.data, p, size, pair.value.len);
  32. free(p);
  33. return 0;

  34. }

编译运行


  1. gcc -c -O -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Wunused-function -Wunused-variable -Wunused-value -Werror -g -I ../../../objs/ -I ../../os/unix/ basic_types_str.c -I../../core/ -I../../event/ -I../../os/ -o basic_types_str.o
  2. gcc -o basic_types_str basic_types_str.o ../../../objs/src/core/ngx_{string,palloc}.o ../../../objs/src/os/unix/ngx_alloc.o -lcrypt -lpcre  -lz
  3. ./basic_types_str
ubuntu的测试环境  我去掉了参数 -lcrypto
测试结果:
  1. source length is 14, destination length is 20
  2. source str is hello, world !
  3. destination str is aGVsbG8sIHdvcmxkICE=
  4. escaped url is : %3ftest=1 (34)
  5. original url size is 32


core/ngx_string.h/c 中同时也封装了一批字符/字符串处理的函数和宏,他们的使用大多数情况下和c标准库中的类似,只是在内存分配相关的函数中有一定的区别。

比如 u_char *ngx_pstrdup(ngx_pool_t *pool, ngx_str_t *src); 除了源字符串驻外,还要传入ngx_pool_t的指针作为参数,使用nginx自己的内存分配方式进行内存的分配。

除了标准的字符串操作外, nginx还实现了例如:


  1. // base64 编码/解码函数和宏

  2. #define ngx_base64_encoded_length(len) (((len + 2) / 3) * 4)
  3. #define ngx_base64_decoded_length(len) (((len + 3) / 4) * 3)

  4. void ngx_encode_base64(ngx_str_t *dst, ngx_str_t *src);
  5. ngx_int_t ngx_decode_base64(ngx_str_t *dst, ngx_str_t *src);

  6. //utf-8 编码/解码相关函数

  7. uint32_t ngx_utf8_decode(u_char **p, size_t n);
  8. size_t ngx_utf8_length(u_char *p, size_t n);
  9. u_char *ngx_utf8_cpystrn(u_char *dst, u_char *src, size_t n, size_t len);

  10. // urlencode和html实体的编码解码
  11. uintptr_t ngx_escape_uri(u_char *dst, u_char *src, size_t size,
  12. ngx_uint_t type);
  13. void ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type);
  14. uintptr_t ngx_escape_html(u_char *dst, u_char *src, size_t size);

等对于http服务有帮助的宏和函数

阅读(5829) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~