switch( scan_urlencoded_query( &c, data = c, SCAN_SEARCHPATH_PARAM ) ) {
case -2: scanon = 0; break; /* TERMINATOR */
case -1: HTTPERROR_400_PARAM; /* PARSE ERROR */
- default: scan_urlencoded_query( &c, NULL, SCAN_SEARCHPATH_VALUE ); break;
+ default: scan_urlencoded_skipvalue( &c ); break;
case 9:
if(byte_diff(data,9,"changeset")) {
- scan_urlencoded_query( &c, NULL, SCAN_SEARCHPATH_VALUE );
+ scan_urlencoded_skipvalue( &c );
continue;
}
/* ignore this, when we dont at least see "d4:syncdee" */
switch( scan_urlencoded_query( &c, data = c, SCAN_SEARCHPATH_PARAM ) ) {
case -2: scanon = 0; break; /* TERMINATOR */
case -1: HTTPERROR_400_PARAM; /* PARSE ERROR */
- default: scan_urlencoded_query( &c, NULL, SCAN_SEARCHPATH_VALUE ); break;
+ default: scan_urlencoded_skipvalue( &c ); break;
case 4:
if( byte_diff(data,4,"mode")) {
- scan_urlencoded_query( &c, NULL, SCAN_SEARCHPATH_VALUE );
+ scan_urlencoded_skipvalue( &c );
continue;
}
if( scan_urlencoded_query( &c, data = c, SCAN_SEARCHPATH_VALUE ) != 4 ) HTTPERROR_400_PARAM;
switch( scan_urlencoded_query( &c, data = c, SCAN_SEARCHPATH_PARAM ) ) {
case -2: scanon = 0; break; /* TERMINATOR */
case -1: HTTPERROR_400_PARAM; /* PARSE ERROR */
- default: scan_urlencoded_query( &c, NULL, SCAN_SEARCHPATH_VALUE ); break;
+ default: scan_urlencoded_skipvalue( &c ); break;
case 9:
if(byte_diff(data,9,"info_hash")) {
- scan_urlencoded_query( &c, NULL, SCAN_SEARCHPATH_VALUE );
+ scan_urlencoded_skipvalue( &c );
continue;
}
/* ignore this, when we have less than 20 bytes */
switch( scan_urlencoded_query( &c, data = c, SCAN_SEARCHPATH_PARAM ) ) {
case -2: scanon = 0; break; /* TERMINATOR */
case -1: HTTPERROR_400_PARAM; /* PARSE ERROR */
- default: scan_urlencoded_query( &c, NULL, SCAN_SEARCHPATH_VALUE ); break;
+ default: scan_urlencoded_skipvalue( &c ); break;
#ifdef WANT_IP_FROM_QUERY_STRING
case 2:
if(!byte_diff(data,2,"ip")) {
if( ( len <= 0 ) || scan_fixed_ip( data, len, ip ) ) HTTPERROR_400_PARAM;
OT_SETIP( &peer, ip );
} else
- scan_urlencoded_query( &c, NULL, SCAN_SEARCHPATH_VALUE );
+ scan_urlencoded_skipvalue( &c );
break;
#endif
case 4:
if( scan_fixed_int( data, len, &tmp ) ) tmp = 0;
if( !tmp ) OT_FLAG( &peer ) |= PEER_FLAG_SEEDING;
} else
- scan_urlencoded_query( &c, NULL, SCAN_SEARCHPATH_VALUE );
+ scan_urlencoded_skipvalue( &c );
break;
case 5:
if( byte_diff( data, 5, "event" ) )
- scan_urlencoded_query( &c, NULL, SCAN_SEARCHPATH_VALUE );
+ scan_urlencoded_skipvalue( &c );
else switch( scan_urlencoded_query( &c, data = c, SCAN_SEARCHPATH_VALUE ) ) {
case -1:
HTTPERROR_400_PARAM;
if( ( len <= 0 ) || scan_fixed_int( data, len, &tmp ) ) HTTPERROR_400_PARAM;
if( !tmp ) HTTPERROR_400_COMPACT;
} else
- scan_urlencoded_query( &c, NULL, SCAN_SEARCHPATH_VALUE );
+ scan_urlencoded_skipvalue( &c );
break;
case 9:
if(byte_diff(data,9,"info_hash")) {
- scan_urlencoded_query( &c, NULL, SCAN_SEARCHPATH_VALUE );
+ scan_urlencoded_skipvalue( &c );
continue;
}
/* ignore this, when we have less than 20 bytes */
*/
static const unsigned char is_unreserved[256] = {
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,1,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,
- 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,
- 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,
+ 8,0,0,0,0,0,0,0,0,0,8,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 8,7,0,0,0,7,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,7,6,
+ 0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,7,
+ 0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,0,0,7,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
return 0xff;
}
-ssize_t scan_urlencoded_query(char **string, char *deststring, int flags) {
+void scan_urlencoded_skipvalue( char **string ) {
+ const unsigned char* s=*(const unsigned char**) string;
+ unsigned char f;
+
+ while( ( f = is_unreserved[ *s++ ] ) & SCAN_SEARCHPATH_VALUE );
+ if( f & SCAN_SEARCHPATH_TERMINATOR ) --s;
+ *string = (char*)s;
+}
+
+ssize_t scan_urlencoded_query(char **string, char *deststring, SCAN_SEARCHPATH_FLAG flags) {
const unsigned char* s=*(const unsigned char**) string;
unsigned char *d = (unsigned char*)deststring;
- register unsigned char b, c;
+ unsigned char b, c, f;
-retry_parsing:
- while( is_unreserved[ c = *s++ ] ) {
+ while( ( f = is_unreserved[ c = *s++ ] ) & flags ) {
if( c=='%') {
if( ( b = fromhex(*s++) ) == 0xff ) return -1;
if( ( c = fromhex(*s++) ) == 0xff ) return -1;
c|=(b<<4);
}
- if( d ) *d++ = c;
+ *d++ = c;
}
switch( c ) {
case 0: case '\r': case '\n': case ' ':
- if( d && ( d == (unsigned char*)deststring ) ) return -2;
+ if( d == (unsigned char*)deststring ) return -2;
--s;
break;
case '?':
- if( flags != SCAN_PATH ) {
- if( d ) *d++ = c;
- goto retry_parsing;
- }
break;
case '=':
if( flags != SCAN_SEARCHPATH_PARAM ) return -1;