diff options
author | Alexey Yakovenko <wakeroid@gmail.com> | 2009-11-06 20:11:12 +0100 |
---|---|---|
committer | Alexey Yakovenko <wakeroid@gmail.com> | 2009-11-06 20:11:12 +0100 |
commit | 63a606b4592acacf7adb76587c3177b0676d3886 (patch) | |
tree | 716cbec4aef5721d9052fbfd3c86d4ea1fff8f02 | |
parent | accb46582f9dafee80b536c625ede316c03da0f5 (diff) |
slightly better icy header parser
-rw-r--r-- | plugins/vfs_curl/vfs_curl.c | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/plugins/vfs_curl/vfs_curl.c b/plugins/vfs_curl/vfs_curl.c index 997d639a..e467692e 100644 --- a/plugins/vfs_curl/vfs_curl.c +++ b/plugins/vfs_curl/vfs_curl.c @@ -56,6 +56,7 @@ typedef struct { intptr_t mutex; int gotheader; int icyheader; + int nheaderpackets; char *content_type; uint8_t status; } HTTP_FILE; @@ -69,7 +70,7 @@ http_content_header_handler (void *ptr, size_t size, size_t nmemb, void *stream) static size_t http_curl_write (void *ptr, size_t size, size_t nmemb, void *stream) { - trace ("http_curl_write %d bytes\n", size * nmemb); +// trace ("http_curl_write %d bytes\n", size * nmemb); int avail = size * nmemb; HTTP_FILE *fp = (HTTP_FILE *)stream; if (!fp->gotheader) { @@ -77,13 +78,31 @@ http_curl_write (void *ptr, size_t size, size_t nmemb, void *stream) { if (!fp->icyheader && avail >= 10 && !memcmp (ptr, "ICY 200 OK", 10)) { trace ("icy headers in the stream\n"); fp->icyheader = 1; - avail = 0; - } - else if (fp->icyheader) { - http_content_header_handler (ptr, size, nmemb, stream); - if (fp->gotheader) { - fp->icyheader = 0; + if (fp->icyheader) { + if (fp->nheaderpackets > 10) { + fprintf (stderr, "vfs_curl: warning: seems like stream has unterminated ICY headers\n"); + fp->gotheader = 1; + } + else { + trace ("parsing icy headers:\n%s\n", ptr); + fp->nheaderpackets++; + http_content_header_handler (ptr, size, nmemb, stream); + if (fp->gotheader) { + fp->gotheader = 0; // don't reset icy header + } + uint8_t *p = ptr; + int i; + for (i = 0; i < avail-3; i++) { + const char end[4] = { 0x0d, 0x0a, 0x0d, 0x0a }; + if (!memcmp (p, end, 4)) { + trace ("icy headers end\n"); + fp->gotheader = 1; + break; + } + p++; + } + avail = 0; } } else { @@ -289,7 +308,7 @@ http_close (DB_FILE *stream) { static size_t http_read (void *ptr, size_t size, size_t nmemb, DB_FILE *stream) { - trace ("http_read %d\n", size*nmemb); +// trace ("http_read %d\n", size*nmemb); assert (stream); assert (ptr); HTTP_FILE *fp = (HTTP_FILE *)stream; |