int ts_url_decode(const char *src, int src_len, char *dst, int dst_len, int is_form_url_encoded) { int i, j, a, b; for (i = j = 0; i < src_len && j < dst_len - 1; i++, j++) { if (src[i] == '%') { if (i < src_len - 2 && isxdigit(*(const unsigned char *)(src + i + 1)) && isxdigit(*(const unsigned char *)(src + i + 2))) { a = tolower(*(const unsigned char *)(src + i + 1)); b = tolower(*(const unsigned char *)(src + i + 2)); dst[j] = (char)((HEXTOI(a) << 4) | HEXTOI(b)); i += 2; } else { return -1; } } else if (is_form_url_encoded && src[i] == '+') { dst[j] = ' '; } else { dst[j] = src[i]; } } dst[j] = '\0'; /* Null-terminate the destination */ return i >= src_len ? j : -1; }
size_t CHTTP::urlDecode(const char *src, size_t src_len, char *dst, size_t dst_len, bool is_form_url_encoded) { size_t i, j; int a, b; #define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W') for(i = j = 0; i < src_len && j < dst_len - 1; i++, j++) { if(src[i] == '%' && isxdigit(*(unsigned char *)(src + i + 1)) && isxdigit(*(unsigned char *)(src + i + 2))) { a = tolower(*(unsigned char *)(src + i + 1)); b = tolower(*(unsigned char *)(src + i + 2)); dst[j] = ((HEXTOI(a) << 4) | HEXTOI(b)) & 0xFF; i += 2; } else if (is_form_url_encoded && src[i] == '+') { dst[j] = ' '; } else { dst[j] = src[i]; } } dst[j] = '\0'; return j; }
static size_t url_decode(const char *src, size_t src_len, char *dst, size_t dst_len, int is_form_url_encoded) { size_t i, j; int a, b; #define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W') for (i = j = 0; i < src_len && j < dst_len - 1; i++, j++) { if (src[i] == '%' && isxdigit(* (const unsigned char *) (src + i + 1)) && isxdigit(* (const unsigned char *) (src + i + 2))) { a = tolower(* (const unsigned char *) (src + i + 1)); b = tolower(* (const unsigned char *) (src + i + 2)); dst[j] = (char) ((HEXTOI(a) << 4) | HEXTOI(b)); i += 2; } else if (is_form_url_encoded && src[i] == '+') { dst[j] = ' '; } else { dst[j] = src[i]; } } dst[j] = '\0'; // Null-terminate the destination return j; }
static void qu_var_new_form_url__(void* shangji,const char* url, int is_form_url_encoded,int* err){ std::string value,name; bool is2=false; int a, b; #define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W') for(int i=0;;i++){ char c=url[i]; if(c=='&'||!c){ if(is2){ std::string value2; for(size_t i1=0;i1<value.length();i1++){ char c=value[i1]; if(c == '%' && i1+2<value.length() && isxdigit(value[i1+1]) && isxdigit(value[i1+2])){ a = tolower(value[i1+1]); b = tolower(value[i1+2]); value2+= (char) ((HEXTOI(a) << 4) | HEXTOI(b)); i1 += 2; } else if (is_form_url_encoded && c == '+') { value2+= ' '; } else { value2+=c; } } *err=var_new_(jsq_,shangji,name.c_str(),value2.c_str(),false,vartype_var_,false); if(*err) return; if(!c) break; is2=false; } name.clear(); continue; } if(c=='='){ is2=true; value.clear(); continue; } if(is2) value+=c; else name+=c; } }
static void ParseKeyValueString( DaoProcess *proc, DaoMap *mulmap, DaoMap *map, const char *data ) { const char *end = data + strlen( data ); DaoValue *vk = (DaoValue*) DaoProcess_NewString( proc, NULL, 0 ); DaoValue *vv = (DaoValue*) DaoProcess_NewString( proc, NULL, 0 ); DString *key = DaoString_Get( DaoValue_CastString( vk ) ); DString *value = DaoString_Get( DaoValue_CastString( vv ) ); DString *buffer = key; buffer->size = 0; for(; data < end; ++data) { if( buffer->size >= buffer->bufSize ) DString_Reserve( buffer, 1.5*buffer->size + 8 ); if( *data == '=' ) { buffer->chars[ buffer->size ] = 0; buffer = value; buffer->size = 0; } else if( *data == '&' || *data == ';' ) { buffer->chars[ buffer->size ] = 0; InsertKeyValue( proc, mulmap, map, vk, vv ); DString_Reset( key, 0 ); /* also detaching shared memory; */ DString_Reset( value, 0 ); /* also detaching shared memory; */ buffer = key; } else if( *data != ' ' ) { if( *data == '%' ) { char a = tolower( data[1] ); char b = tolower( data[2] ); buffer->chars[ buffer->size ++ ] = (char) ((HEXTOI(a) << 4) | HEXTOI(b)); data += 2; } else if( *data == '+' ) { buffer->chars[ buffer->size ++ ] = ' '; } else { buffer->chars[ buffer->size ++ ] = *data; } } } if( key->size ) InsertKeyValue( proc, mulmap, map, vk, vv ); }