diff options
| author | erdgeist <> | 2009-01-05 18:05:39 +0000 |
|---|---|---|
| committer | erdgeist <> | 2009-01-05 18:05:39 +0000 |
| commit | 779d6c235ff8fe5284fd10dc82a9b99e7fa38d06 (patch) | |
| tree | 043369d2a98a45b902e5d0968e28d78c1771b143 /scan_urlencoded_query.c | |
| parent | 8bdc0d73f6f0bcaf83b7fb3d39e79e8fa4e6050d (diff) | |
* http and udp routines now use thread local buffers passed in workstruct containers. In other words they do not use static_buffer anymore and are considered to be thread safe.
* the new workstruct also introduces a well defined buffer and result passing path
* a new function scan_find_keywords is a wrapper around scan_urlencoded_query that maps keys in url to values passed in an array of ot_keywords structs
* this new function cleans up much of url parameter parsing work, where read_ptr and write_ptr have been introduced rather than the confusing char *c, *data variables
* I now use memcmp instead of byte_diff to allow compiler to optimize constant size string compares
* got rid of UTORRENT_1600_WORKAROUND
* livesync_ticker is now only called from one (currently main) thread to avoid race conditions
Diffstat (limited to 'scan_urlencoded_query.c')
| -rw-r--r-- | scan_urlencoded_query.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/scan_urlencoded_query.c b/scan_urlencoded_query.c index a17db2a..c3acefc 100644 --- a/scan_urlencoded_query.c +++ b/scan_urlencoded_query.c | |||
| @@ -9,6 +9,9 @@ | |||
| 9 | /* Libwofat */ | 9 | /* Libwofat */ |
| 10 | #include "scan.h" | 10 | #include "scan.h" |
| 11 | 11 | ||
| 12 | /* System */ | ||
| 13 | #include <string.h> | ||
| 14 | |||
| 12 | /* Idea is to do a in place replacement or guarantee at least | 15 | /* Idea is to do a in place replacement or guarantee at least |
| 13 | strlen( string ) bytes in deststring | 16 | strlen( string ) bytes in deststring |
| 14 | watch http://www.ietf.org/rfc/rfc2396.txt | 17 | watch http://www.ietf.org/rfc/rfc2396.txt |
| @@ -64,6 +67,22 @@ void scan_urlencoded_skipvalue( char **string ) { | |||
| 64 | *string = (char*)s; | 67 | *string = (char*)s; |
| 65 | } | 68 | } |
| 66 | 69 | ||
| 70 | int scan_find_keywords( const ot_keywords * keywords, char **string, SCAN_SEARCHPATH_FLAG flags) { | ||
| 71 | char *deststring = *string; | ||
| 72 | ssize_t match_length = scan_urlencoded_query(string, deststring, flags ); | ||
| 73 | |||
| 74 | if( match_length < 0 ) return match_length; | ||
| 75 | if( match_length == 0 ) return -3; | ||
| 76 | |||
| 77 | while( keywords->key ) { | ||
| 78 | if( !memcmp( keywords->key, deststring, match_length ) ) | ||
| 79 | return keywords->value; | ||
| 80 | keywords++; | ||
| 81 | } | ||
| 82 | |||
| 83 | return -3; | ||
| 84 | } | ||
| 85 | |||
| 67 | ssize_t scan_urlencoded_query(char **string, char *deststring, SCAN_SEARCHPATH_FLAG flags) { | 86 | ssize_t scan_urlencoded_query(char **string, char *deststring, SCAN_SEARCHPATH_FLAG flags) { |
| 68 | const unsigned char* s=*(const unsigned char**) string; | 87 | const unsigned char* s=*(const unsigned char**) string; |
| 69 | unsigned char *d = (unsigned char*)deststring; | 88 | unsigned char *d = (unsigned char*)deststring; |
| @@ -95,9 +114,7 @@ ssize_t scan_urlencoded_query(char **string, char *deststring, SCAN_SEARCHPATH_F | |||
| 95 | --s; | 114 | --s; |
| 96 | break; | 115 | break; |
| 97 | case '?': | 116 | case '?': |
| 98 | /* XXX to help us parse path?param=value?param=value?... sent by µTorrent 1600 | 117 | if( flags != SCAN_PATH ) return -1; |
| 99 | do not return an error but silently terminate | ||
| 100 | if( flags != SCAN_PATH ) return -1; */ | ||
| 101 | break; | 118 | break; |
| 102 | case '=': | 119 | case '=': |
| 103 | if( flags != SCAN_SEARCHPATH_PARAM ) return -1; | 120 | if( flags != SCAN_SEARCHPATH_PARAM ) return -1; |
