Changeset 5726:4a15c13827a8 in roaraudio


Ignore:
Timestamp:
11/03/12 00:23:14 (11 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

allow passing GET parameters thru uste

File:
1 edited

Legend:

Unmodified
Added
Removed
  • plugins/universal/protocol-http.c

    r5725 r5726  
    154154 return root; 
    155155} 
     156 
     157static inline int __is_hex(char c) { 
     158 if ( c >= '0' && c <= '9' ) 
     159  return 1; 
     160 if ( c >= 'a' && c <= 'f' ) 
     161  return 1; 
     162 if ( c >= 'A' && c <= 'F' ) 
     163  return 1; 
     164 return 0; 
     165} 
     166 
     167static inline int __hex2num(char c) { 
     168 if ( c >= '0' && c <= '9' ) 
     169  return c - '0'; 
     170 if ( c >= 'a' && c <= 'f' ) 
     171  return c - 'a' + 10; 
     172 if ( c >= 'A' && c <= 'F' ) 
     173  return c - 'A' + 10; 
     174 return 0; 
     175} 
     176 
     177static void __res_vio_handle_uste_uridecode(char * str) { 
     178 const char * c = str; 
     179 
     180 for (; *c; c++) { 
     181  if ( *c == '%' && __is_hex(c[1]) && __is_hex(c[2]) ) { 
     182   *str = __hex2num(c[1])*16 + __hex2num(c[2]); 
     183   str++; 
     184   c += 2; 
     185  } else { 
     186   *str = *c; 
     187   str++; 
     188  } 
     189 } 
     190 *str = *c; 
     191} 
     192 
     193static void __res_vio_handle_uste_keyify(char * str) { 
     194 if ( *str == '#' ) 
     195  *str = '_'; 
     196 for (;*str; str++) 
     197  if (*str == '.') 
     198   *str = '_'; 
     199} 
     200 
     201static uste_var_t __res_vio_handle_uste_build_getparams(struct http_client * self) { 
     202 uste_var_t root = uste_var_new_kv(); 
     203 uste_var_t subroot; 
     204 uste_var_t var; 
     205 char * qs_buffer; 
     206 char * cur; 
     207 char * state; 
     208 char * key, * value; 
     209 
     210 if ( root == NULL ) 
     211  return NULL; 
     212 
     213 uste_var_set_key(root, "get"); 
     214 if ( self->query_string == NULL ) 
     215  return root; 
     216 
     217 qs_buffer = roar_mm_strdup(self->query_string); 
     218 
     219 // do better handling here. 
     220 if ( qs_buffer == NULL ) 
     221  return root; 
     222 
     223 cur = roar_mm_strtok_r(qs_buffer, "&", &state); 
     224 
     225 while (cur != NULL) { 
     226  printf("cur='%s'\n", cur); 
     227  key = cur; 
     228  value = strstr(cur, "="); 
     229  if ( value != NULL ) { 
     230   *value = 0; 
     231   value++; 
     232   __res_vio_handle_uste_uridecode(value); 
     233  } 
     234  __res_vio_handle_uste_uridecode(key); 
     235  __res_vio_handle_uste_keyify(key); 
     236 
     237  if ( value == NULL ) { 
     238   var = uste_var_new_undef(); 
     239  } else { 
     240   var = uste_var_new_str(value); 
     241  } 
     242 
     243  subroot = uste_var_pull(root, key); 
     244  if ( subroot == NULL ) { 
     245   subroot = uste_var_new_array(); 
     246   if ( subroot != NULL ) { 
     247    uste_var_set_key(subroot, key); 
     248    uste_var_push(root, subroot); 
     249   } 
     250  } 
     251 
     252  if ( subroot != NULL ) { 
     253   uste_var_push(subroot, var); 
     254   uste_var_unref(subroot); 
     255  } 
     256  uste_var_unref(var); 
     257  cur = roar_mm_strtok_r(NULL, "&", &state); 
     258 } 
     259 
     260 roar_mm_free(qs_buffer); 
     261 return root; 
     262} 
     263 
    156264static uste_var_t __res_vio_handle_uste_build_rootkv(struct http_client * self) { 
    157265 uste_var_t root = uste_var_new_kv(); 
     
    193301 
    194302   var = __res_vio_handle_uste_build_headers(self); 
     303   uste_var_push(subsubroot, var); 
     304   uste_var_unref(var); 
     305 
     306   var = __res_vio_handle_uste_build_getparams(self); 
    195307   uste_var_push(subsubroot, var); 
    196308   uste_var_unref(var); 
Note: See TracChangeset for help on using the changeset viewer.