From 16b3ed8e2541024286b855089e5ca263cfe33817 Mon Sep 17 00:00:00 2001 From: "craig.p.drummond" Date: Thu, 2 Jan 2014 19:03:20 +0000 Subject: [PATCH] When MPD seeks a Cantata HTTP stream, set the Content-Range header field. BUG: 368 --- ChangeLog | 1 + http/httpsocket.cpp | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index d439acb19..0eb45c35b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -37,6 +37,7 @@ be added. 8. If Ctrl-F is activated again whilst search widget is visible, then select all current text. +9. When MPD seeks a Cantata HTTP stream, set the Content-Range header field. 1.2.1 ----- diff --git a/http/httpsocket.cpp b/http/httpsocket.cpp index c8065bbe8..8705921af 100644 --- a/http/httpsocket.cpp +++ b/http/httpsocket.cpp @@ -113,16 +113,24 @@ static QString detectMimeType(const QString &file) return QString(); } -static void writeMimeType(const QString &mimeType, QTcpSocket *socket, qint32 size, bool allowSeek) +static void writeMimeType(const QString &mimeType, QTcpSocket *socket, qint32 from, qint32 size, bool allowSeek) { if (!mimeType.isEmpty()) { QTextStream os(socket); os.setAutoDetectUnicode(true); if (allowSeek) { - os << "HTTP/1.0 200 OK" - << "\r\nAccept-Ranges: bytes" - << "\r\nContent-Length: " << QString::number(size) - << "\r\nContent-Type: " << mimeType << "\r\n\r\n"; + if (0==from) { + os << "HTTP/1.0 200 OK" + << "\r\nAccept-Ranges: bytes" + << "\r\nContent-Length: " << QString::number(size) + << "\r\nContent-Type: " << mimeType << "\r\n\r\n"; + } else { + os << "HTTP/1.0 200 OK" + << "\r\nAccept-Ranges: bytes" + << "\r\nContent-Range: bytes " << QString::number(from) << "-" << QString::number(size-1) << "/" << QString::number(size) + << "\r\nContent-Length: " << QString::number(size-from) + << "\r\nContent-Type: " << mimeType << "\r\n\r\n"; + } DBUG << mimeType << QString::number(size) << "Can seek"; } else { os << "HTTP/1.0 200 OK" @@ -376,7 +384,7 @@ void HttpSocket::readClient() // } cdparanoia.seek(firstSector, SEEK_SET); ok=true; - writeMimeType(QLatin1String("audio/x-wav"), socket, totalSize+ExtractJob::constWavHeaderSize, false); + writeMimeType(QLatin1String("audio/x-wav"), socket, readBytesFrom, totalSize+ExtractJob::constWavHeaderSize, false); if (0==readBytesFrom) { // Only write header if we are not seeking... ExtractJob::writeWavHeader(*socket, totalSize); } @@ -421,7 +429,7 @@ void HttpSocket::readClient() if (f.open(QIODevice::ReadOnly)) { qint32 totalBytes = f.size(); - writeMimeType(detectMimeType(song.file), socket, totalBytes, true); + writeMimeType(detectMimeType(song.file), socket, readBytesFrom, totalBytes, true); ok=true; static const int constChunkSize=32768; char buffer[constChunkSize];