diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-02-19 22:40:59 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-02-19 22:40:59 +0000 |
commit | c18fc9cc0f5d3de75e813a138d12361637f71570 (patch) | |
tree | f5c9808c9b9829946fc305b50401145b67f0f7b7 | |
parent | a87a4f475c2758ef0112d95a0906bc99a8408520 (diff) | |
download | rspamd-c18fc9cc0f5d3de75e813a138d12361637f71570.tar.gz rspamd-c18fc9cc0f5d3de75e813a138d12361637f71570.zip |
Add uri unescape from nginx.
-rw-r--r-- | src/libserver/url.c | 96 | ||||
-rw-r--r-- | src/libutil/printf.c | 4 |
2 files changed, 98 insertions, 2 deletions
diff --git a/src/libserver/url.c b/src/libserver/url.c index b20c23dae..6fdc53ef0 100644 --- a/src/libserver/url.c +++ b/src/libserver/url.c @@ -1,5 +1,7 @@ /* - * Copyright (c) 2009-2012, Vsevolod Stakhov + * Copyright (c) 2009-2015, Vsevolod Stakhov + * Copyright (C) 2002-2015 Igor Sysoev + * Copyright (C) 2011-2015 Nginx, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -736,6 +738,98 @@ enum { #define is_urlsafe(x) ((url_scanner_table[(guchar)(x)] & (IS_ALPHA | IS_DIGIT | \ IS_URLSAFE)) != 0) +void +rspamd_unescape_uri (u_char **dst, u_char **src, size_t size) +{ + u_char *d, *s, ch, c, decoded; + enum { + sw_usual = 0, + sw_quoted, + sw_quoted_second + } state; + + d = *dst; + s = *src; + + state = 0; + decoded = 0; + + while (size--) { + + ch = *s++; + + switch (state) { + case sw_usual: + if (ch == '?') { + *d++ = ch; + goto done; + } + + if (ch == '%') { + state = sw_quoted; + break; + } + + *d++ = ch; + break; + + case sw_quoted: + + if (ch >= '0' && ch <= '9') { + decoded = (u_char) (ch - '0'); + state = sw_quoted_second; + break; + } + + c = (u_char) (ch | 0x20); + if (c >= 'a' && c <= 'f') { + decoded = (u_char) (c - 'a' + 10); + state = sw_quoted_second; + break; + } + + /* the invalid quoted character */ + + state = sw_usual; + + *d++ = ch; + + break; + + case sw_quoted_second: + + state = sw_usual; + + if (ch >= '0' && ch <= '9') { + ch = (u_char) ((decoded << 4) + ch - '0'); + *d++ = ch; + + break; + } + + c = (u_char) (ch | 0x20); + if (c >= 'a' && c <= 'f') { + ch = (u_char) ((decoded << 4) + c - 'a' + 10); + + if (ch == '?') { + *d++ = ch; + goto done; + } + + *d++ = ch; + break; + } + + /* the invalid quoted character */ + break; + } + } + + done: + + *dst = d; + *src = s; +} const gchar * rspamd_url_strerror (enum uri_errno err) diff --git a/src/libutil/printf.c b/src/libutil/printf.c index 26fc174e8..5a04dc432 100644 --- a/src/libutil/printf.c +++ b/src/libutil/printf.c @@ -1,4 +1,6 @@ -/* Copyright (c) 2010, Vsevolod Stakhov +/* Copyright (c) 2010-2015, Vsevolod Stakhov + * Copyright (C) 2002-2015 Igor Sysoev + * Copyright (C) 2011-2015 Nginx, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without |