Mercurial > hg > nginx-vendor-0-7
comparison src/core/ngx_string.c @ 150:50bd986c5d63 NGINX_0_3_22
nginx 0.3.22
*) Feature: the ngx_http_perl_module supports the $r->args and
$r->unescape methods.
*) Feature: the method $r->query_string of ngx_http_perl_module was
canceled.
*) Bugfix: segmentation fault was occurred if the "none" or "blocked"
values was specified in the "valid_referers" directive; bug appeared
in 0.3.18.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Tue, 17 Jan 2006 00:00:00 +0300 |
parents | 8e6d4d96ec4c |
children | 6be073125f2e |
comparison
equal
deleted
inserted
replaced
149:cec6fdbfe9da | 150:50bd986c5d63 |
---|---|
929 return (uintptr_t) dst; | 929 return (uintptr_t) dst; |
930 } | 930 } |
931 | 931 |
932 | 932 |
933 void | 933 void |
934 ngx_unescape_uri(u_char **dst, u_char **src, size_t size) | 934 ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type) |
935 { | 935 { |
936 u_char *d, *s, ch, c, decoded; | 936 u_char *d, *s, ch, c, decoded; |
937 enum { | 937 enum { |
938 sw_usual = 0, | 938 sw_usual = 0, |
939 sw_quoted, | 939 sw_quoted, |
950 | 950 |
951 ch = *s++; | 951 ch = *s++; |
952 | 952 |
953 switch (state) { | 953 switch (state) { |
954 case sw_usual: | 954 case sw_usual: |
955 if (ch == '?') { | 955 if (ch == '?' && type == NGX_UNESCAPE_URI) { |
956 *d++ = ch; | 956 *d++ = ch; |
957 goto done; | 957 goto done; |
958 } | 958 } |
959 | 959 |
960 if (ch == '%') { | 960 if (ch == '%') { |
993 state = sw_usual; | 993 state = sw_usual; |
994 | 994 |
995 if (ch >= '0' && ch <= '9') { | 995 if (ch >= '0' && ch <= '9') { |
996 ch = (u_char) ((decoded << 4) + ch - '0'); | 996 ch = (u_char) ((decoded << 4) + ch - '0'); |
997 | 997 |
998 if (ch > '%' && ch < 0x7f) { | 998 if (type == NGX_UNESCAPE_URI) { |
999 *d++ = ch; | 999 if (ch > '%' && ch < 0x7f) { |
1000 *d++ = ch; | |
1001 break; | |
1002 } | |
1003 | |
1004 *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1); | |
1005 | |
1000 break; | 1006 break; |
1001 } | 1007 } |
1002 | 1008 |
1003 *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1); | 1009 *d++ = ch; |
1004 | 1010 |
1005 break; | 1011 break; |
1006 } | 1012 } |
1007 | 1013 |
1008 c = (u_char) (ch | 0x20); | 1014 c = (u_char) (ch | 0x20); |
1009 if (c >= 'a' && c <= 'f') { | 1015 if (c >= 'a' && c <= 'f') { |
1010 ch = (u_char) ((decoded << 4) + c - 'a' + 10); | 1016 ch = (u_char) ((decoded << 4) + c - 'a' + 10); |
1011 | 1017 |
1012 if (ch == '?') { | 1018 if (type == NGX_UNESCAPE_URI) { |
1013 *d++ = ch; | 1019 if (ch == '?') { |
1014 goto done; | 1020 *d++ = ch; |
1015 } | 1021 goto done; |
1016 | 1022 } |
1017 if (ch > '%' && ch < 0x7f) { | 1023 |
1018 *d++ = ch; | 1024 if (ch > '%' && ch < 0x7f) { |
1025 *d++ = ch; | |
1026 break; | |
1027 } | |
1028 | |
1029 *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1); | |
1019 break; | 1030 break; |
1020 } | 1031 } |
1021 | 1032 |
1022 *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1); | 1033 *d++ = ch; |
1023 | 1034 |
1024 break; | 1035 break; |
1025 } | 1036 } |
1026 | 1037 |
1027 /* the invalid quoted character */ | 1038 /* the invalid quoted character */ |