aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/decode.c4
-rw-r--r--src/inputStream_http.c41
2 files changed, 27 insertions, 18 deletions
diff --git a/src/decode.c b/src/decode.c
index b25cff105..153ad003b 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -285,7 +285,6 @@ static void decodeStart(PlayerControl * pc, OutputBuffer * cb,
return;
}
- dc->seekable = inStream.seekable;
dc->state = DECODE_STATE_START;
dc->start = 0;
@@ -295,6 +294,9 @@ static void decodeStart(PlayerControl * pc, OutputBuffer * cb,
my_usleep(1000);
}
+ /* for http streams, seekable is determined in bufferInputStream */
+ dc->seekable = inStream.seekable;
+
if (dc->stop) {
dc->state = DECODE_STATE_STOP;
dc->stop = 0;
diff --git a/src/inputStream_http.c b/src/inputStream_http.c
index f56417ca0..5eb06a086 100644
--- a/src/inputStream_http.c
+++ b/src/inputStream_http.c
@@ -480,11 +480,11 @@ static int finishHTTPInit(InputStream * inStream)
snprintf(request, 2048, "GET %s HTTP/1.0\r\n" "Host: %s\r\n"
/*"Connection: close\r\n" */
"User-Agent: %s/%s\r\n"
- /*"Range: bytes=%ld-\r\n" */
+ "Range: bytes=%ld-\r\n"
"%s" /* authorization */
"Icy-Metadata:1\r\n"
"\r\n", data->path, data->host, PACKAGE_NAME, PACKAGE_VERSION,
- /*inStream->offset, */
+ inStream->offset,
data->proxyAuth ? data->proxyAuth :
(data->httpAuth ? data->httpAuth : "")
);
@@ -681,9 +681,6 @@ static int getHTTPHello(InputStream * inStream)
data->prebuffer = 1;
- /*mark as unseekable till we actually implement seeking */
- inStream->seekable = 0;
-
return 0;
}
@@ -714,21 +711,31 @@ int inputStream_httpOpen(InputStream * inStream, char *url)
int inputStream_httpSeek(InputStream * inStream, long offset, int whence)
{
- /* hack to reopen an HTTP stream if we're trying to seek to
- * the beginning */
- if ((whence == SEEK_SET) && (offset == 0)) {
- InputStreamHTTPData *data;
+ if (!inStream->seekable)
+ return -1;
- data = (InputStreamHTTPData *) inStream->data;
- close(data->sock);
- data->connState = HTTP_CONN_STATE_REOPEN;
- data->buflen = 0;
- inStream->offset = 0;
- return 0;
+ switch (whence) {
+ case SEEK_SET:
+ inStream->offset = offset;
+ break;
+ case SEEK_CUR:
+ inStream->offset += offset;
+ break;
+ case SEEK_END:
+ inStream->offset = inStream->size + offset;
+ break;
+ default:
+ return -1;
}
- /* otherwise, we don't know how to seek in HTTP yet */
- return -1;
+ InputStreamHTTPData *data = (InputStreamHTTPData *)inStream->data;
+ close(data->sock);
+ data->connState = HTTP_CONN_STATE_REOPEN;
+ data->buflen = 0;
+
+ inputStream_httpBuffer(inStream);
+
+ return 0;
}
static void parseIcyMetadata(InputStream * inStream, char *metadata, int size)