comparison http.c @ 5544:fc48f8bfbf2e libavformat

restore old buffer content when seek failed in http protocol, fix issue #1631
author bcoudurier
date Wed, 13 Jan 2010 23:27:52 +0000
parents 2d0a0d3e5df1
children 7c7fe75728dd
comparison
equal deleted inserted replaced
5543:fbedfacb36ed 5544:fc48f8bfbf2e
392 static int64_t http_seek(URLContext *h, int64_t off, int whence) 392 static int64_t http_seek(URLContext *h, int64_t off, int whence)
393 { 393 {
394 HTTPContext *s = h->priv_data; 394 HTTPContext *s = h->priv_data;
395 URLContext *old_hd = s->hd; 395 URLContext *old_hd = s->hd;
396 int64_t old_off = s->off; 396 int64_t old_off = s->off;
397 uint8_t old_buf[BUFFER_SIZE];
398 int old_buf_size;
397 399
398 if (whence == AVSEEK_SIZE) 400 if (whence == AVSEEK_SIZE)
399 return s->filesize; 401 return s->filesize;
400 else if ((s->filesize == -1 && whence == SEEK_END) || h->is_streamed) 402 else if ((s->filesize == -1 && whence == SEEK_END) || h->is_streamed)
401 return -1; 403 return -1;
402 404
403 /* we save the old context in case the seek fails */ 405 /* we save the old context in case the seek fails */
406 old_buf_size = s->buf_end - s->buf_ptr;
407 memcpy(old_buf, s->buf_ptr, old_buf_size);
404 s->hd = NULL; 408 s->hd = NULL;
405 if (whence == SEEK_CUR) 409 if (whence == SEEK_CUR)
406 off += s->off; 410 off += s->off;
407 else if (whence == SEEK_END) 411 else if (whence == SEEK_END)
408 off += s->filesize; 412 off += s->filesize;
409 s->off = off; 413 s->off = off;
410 414
411 /* if it fails, continue on old connection */ 415 /* if it fails, continue on old connection */
412 if (http_open_cnx(h) < 0) { 416 if (http_open_cnx(h) < 0) {
417 memcpy(s->buffer, old_buf, old_buf_size);
418 s->buf_ptr = s->buffer;
419 s->buf_end = s->buffer + old_buf_size;
413 s->hd = old_hd; 420 s->hd = old_hd;
414 s->off = old_off; 421 s->off = old_off;
415 return -1; 422 return -1;
416 } 423 }
417 url_close(old_hd); 424 url_close(old_hd);