Changeset 4582:c38c091bd002 in roaraudio for libroar
- Timestamp:
- 11/05/10 00:30:10 (14 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/vio_proto.c
r3795 r4582 247 247 return 0; 248 248 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; 249 256 } 250 257 … … 258 265 return -1; 259 266 267 if ( self->content_type != NULL ) 268 roar_mm_free(self->content_type); 269 260 270 roar_mm_free(self); 261 271 … … 263 273 } 264 274 275 static 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 348 static 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 } 265 361 266 362 int roar_vio_open_proto_http (struct roar_vio_calls * calls, struct roar_vio_calls * dst, char * host, char * file) { 363 struct roar_keyval kv; 267 364 struct roar_vio_proto * self; 268 365 struct roar_buffer * bufbuf; … … 270 367 char * buf; 271 368 char * endofheader = NULL; 369 char * p; 272 370 char b0[80], b1[80]; 273 371 int status; 274 372 int len; 373 int oeflen = 4; 374 int aligned = 1; 275 375 276 376 ROAR_DBG("roar_vio_open_proto_http(calls=%p, dst=%p, host='%s', file='%s') = ?", calls, dst, host, file); … … 329 429 330 430 endofheader = strstr(buf, "\r\n\r\n"); 431 if ( endofheader == NULL ) { 432 endofheader = strstr(buf, "\n\n"); 433 oeflen = 2; 434 } 331 435 332 436 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); 333 442 334 443 while ( endofheader == NULL ) { … … 338 447 buf[len] = 0; 339 448 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 340 460 ROAR_DBG("roar_vio_open_proto_http(*): endofheader=%p\n", endofheader); 341 461 } … … 344 464 ROAR_DBG("roar_vio_open_proto_http(*): buf=%p\n", buf); 345 465 346 if ( (endofheader - buf) == (len - 4) ) {466 if ( (endofheader - buf) == (len - oeflen) ) { 347 467 roar_buffer_free(bufbuf); 348 468 bufbuf = NULL; … … 350 470 351 471 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); 354 474 } 355 475 self->reader.buffer = bufbuf;
Note: See TracChangeset
for help on using the changeset viewer.