Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #4
0
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;
	}
}
Exemple #5
0
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 );
}