Changeset 4582:c38c091bd002 in roaraudio


Ignore:
Timestamp:
11/05/10 00:30:10 (12 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added support for content type handling in HTTP module

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • include/libroar/vio_proto.h

    r3517 r4582  
    5656  struct roar_buffer * mdbuf; 
    5757 } metadata; 
     58 char * content_type; 
    5859}; 
    5960 
  • libroar/vio_proto.c

    r3795 r4582  
    247247    return 0; 
    248248   break; 
     249  case ROAR_VIO_CTL_GET_MIMETYPE: 
     250    if ( data == NULL ) 
     251     return -1; 
     252 
     253    *(char**)data = self->content_type; 
     254    return 0; 
     255   break; 
    249256 } 
    250257 
     
    258265  return -1; 
    259266 
     267 if ( self->content_type != NULL ) 
     268  roar_mm_free(self->content_type); 
     269 
    260270 roar_mm_free(self); 
    261271 
     
    263273} 
    264274 
     275static int _parse_header(struct roar_keyval * kv, char ** buf, int * aligned) { 
     276 char * p = *buf; 
     277 char   c = 0; 
     278 
     279 if ( !(*aligned) ) { 
     280  for (; *p != 0 && *p != '\r' && *p != '\n'; p++); 
     281  p++; 
     282  if ( *p == '\n' ) 
     283   p++; 
     284 } 
     285 
     286 kv->key = p; 
     287 
     288 for (; *p != 0 && *p != '\r' && *p != '\n' && *p != ':'; p++); 
     289 
     290 if ( *p == 0 ) 
     291  return -1; 
     292 
     293 c = *p; 
     294 *p = 0; 
     295 
     296 if ( c == '\r' && *(p+1) == '\n' ) 
     297  p++; 
     298 
     299 p++; 
     300 
     301 if ( c == '\r' || c == '\n' ) { 
     302  if ( *(kv->key) == '\r' || *(kv->key) == '\n' ) 
     303   return 0; 
     304//  printf("Key-only\n"); 
     305  kv->value = kv->key; 
     306  kv->key   = NULL; 
     307  *buf = p; 
     308  return 1; 
     309 } 
     310 
     311 for (; *p == ' '; p++); 
     312 
     313 if ( *p == 0 ) 
     314  return -1; 
     315 
     316 kv->value = p; 
     317 
     318 for (; *p != 0 && *p != '\r' && *p != '\n'; p++); 
     319 
     320 if ( *p == 0 ) 
     321  return -1; 
     322 
     323 c = *p; 
     324 *p = 0; 
     325 
     326 if ( c == '\r' && *(p+1) == '\n' ) 
     327  p++; 
     328 
     329 p++; 
     330 
     331 *buf = p; 
     332 
     333 if ( c == '\r' || c == '\n' ) { 
     334//  printf("aligned\n"); 
     335  *aligned = 1; 
     336  p++; 
     337 } else { 
     338//  printf("non-aligned(c=0x%x)\n", (int)c); 
     339  *aligned = 0; 
     340 } 
     341 
     342 if ( *(kv->key) != 0 ) 
     343  return 1; 
     344 
     345 return 0; 
     346} 
     347 
     348static void _handle_header (struct roar_vio_proto * self, struct roar_keyval * kv) { 
     349 ROAR_DBG("_handle_header(*): Header: key='%s', value='%s'", kv->key, kv->value); 
     350 
     351 if ( kv->key == NULL || kv->value == NULL ) 
     352  return; 
     353 
     354 if ( !strcasecmp(kv->key, "Content-Type") ) { 
     355  if ( self->content_type != NULL ) 
     356   roar_mm_free(self->content_type); 
     357 
     358  self->content_type = roar_mm_strdup(kv->value); 
     359 } 
     360} 
    265361 
    266362int roar_vio_open_proto_http   (struct roar_vio_calls * calls, struct roar_vio_calls * dst, char * host, char * file) { 
     363 struct roar_keyval kv; 
    267364 struct roar_vio_proto * self; 
    268365 struct roar_buffer * bufbuf; 
     
    270367 char * buf; 
    271368 char * endofheader = NULL; 
     369 char * p; 
    272370 char b0[80], b1[80]; 
    273371 int  status; 
    274372 int  len; 
     373 int  oeflen = 4; 
     374 int  aligned = 1; 
    275375 
    276376 ROAR_DBG("roar_vio_open_proto_http(calls=%p, dst=%p, host='%s', file='%s') = ?", calls, dst, host, file); 
     
    329429 
    330430 endofheader = strstr(buf, "\r\n\r\n"); 
     431 if ( endofheader == NULL ) { 
     432  endofheader = strstr(buf, "\n\n"); 
     433  oeflen = 2; 
     434 } 
    331435 
    332436 ROAR_DBG("roar_vio_open_proto_http(*): endofheader=%p\n", endofheader); 
     437 
     438 p = buf; 
     439 while ( _parse_header(&kv, &p, &aligned) > 0 ) 
     440  if ( aligned ) 
     441   _handle_header(self, &kv); 
    333442 
    334443 while ( endofheader == NULL ) { 
     
    338447  buf[len] = 0; 
    339448  endofheader = strstr(buf, "\r\n\r\n"); 
     449  if ( endofheader == NULL ) { 
     450   endofheader = strstr(buf, "\n\n"); 
     451   oeflen = 2; 
     452  } 
     453 
     454/* Doesn't work good. 
     455  while ( _parse_header(&kv, &p, &aligned) > 0 ) 
     456   if ( aligned ) 
     457    _handle_header(self, &kv); 
     458*/ 
     459 
    340460  ROAR_DBG("roar_vio_open_proto_http(*): endofheader=%p\n", endofheader); 
    341461 } 
     
    344464 ROAR_DBG("roar_vio_open_proto_http(*): buf=%p\n", buf); 
    345465 
    346  if ( (endofheader - buf) == (len - 4) ) { 
     466 if ( (endofheader - buf) == (len - oeflen) ) { 
    347467  roar_buffer_free(bufbuf); 
    348468  bufbuf = NULL; 
     
    350470 
    351471 if ( bufbuf != NULL ) { 
    352   roar_buffer_set_offset(bufbuf, endofheader - buf + 4); 
    353   roar_buffer_set_len(bufbuf,    len - (endofheader - buf + 4) - 1); 
     472  roar_buffer_set_offset(bufbuf, endofheader - buf + oeflen); 
     473  roar_buffer_set_len(bufbuf,    len - (endofheader - buf + oeflen) - 1); 
    354474 } 
    355475 self->reader.buffer = bufbuf; 
Note: See TracChangeset for help on using the changeset viewer.