summaryrefslogtreecommitdiff
path: root/scan_urlencoded_query.c
diff options
context:
space:
mode:
authorerdgeist <>2009-01-05 18:05:39 +0000
committererdgeist <>2009-01-05 18:05:39 +0000
commit779d6c235ff8fe5284fd10dc82a9b99e7fa38d06 (patch)
tree043369d2a98a45b902e5d0968e28d78c1771b143 /scan_urlencoded_query.c
parent8bdc0d73f6f0bcaf83b7fb3d39e79e8fa4e6050d (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.c23
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
70int 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
67ssize_t scan_urlencoded_query(char **string, char *deststring, SCAN_SEARCHPATH_FLAG flags) { 86ssize_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;