MCPcopy Create free account
hub / github.com/KikoPlayProject/KikoPlay / processFile

Method processFile

LANServer/filehandler.cpp:90–141  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

88}
89
90void FileHandler::processFile(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response, const QString &path)
91{
92 QFile file(path);
93 if(!file.exists())
94 {
95 response.setStatus(stefanfrings::HttpResponse::NotFound);
96 return;
97 }
98 if (!file.open(QIODevice::ReadOnly))
99 {
100 response.setStatus(stefanfrings::HttpResponse::InternalServerError);
101 return;
102 }
103 qint64 fileSize = file.size();
104 QByteArray rangeHeader = request.getHeader("Range");
105
106 bool rangeValid = false;
107 qint64 from = 0, to = fileSize - 1;
108
109 if (!rangeHeader.isEmpty() && rangeHeader.startsWith("bytes="))
110 {
111 // Skiping 'bytes=' - first 6 chars and spliting ranges by comma
112 QList<QByteArray> rangeList = rangeHeader.mid(6).split(',');
113 // Taking only first range, as multiple ranges require multipart
114 // reply support
115 rangeValid = getRange(QString(rangeList.at(0)), fileSize, from, to);
116 //emit message(QString("range request: %1-%2/%3, length=%4, %5").
117 // arg(from).arg(to).arg(fileSize).arg(to-from+1).arg(rangeValid));
118 if(from >= fileSize)
119 {
120 response.setStatus(stefanfrings::HttpResponse::RequestedRangeNotSatisfiable);
121 return;
122 }
123 }
124 response.setHeader("Content-Type", database.mimeTypeForFile(path).name().toUtf8());
125 response.setHeader("Accept-Ranges", "bytes");
126 if(rangeValid)
127 {
128 response.setStatus(stefanfrings::HttpResponse::PartialContent);
129 QString rangeStr = QString("%1-%2/%3").arg(QString::number(from), QString::number(to), QString::number(fileSize));
130 response.setHeader("Content-Range", QByteArray("bytes ") + rangeStr.toLatin1());
131 }
132 Logger::logger()->log(Logger::LANServer, QString("[%1]Media%3: %2").arg(request.getPeerAddress().toString(), path, rangeValid?"(Range)":""));
133
134 file.seek(from);
135 // Return the file content, do not store in cache
136 while (!file.atEnd() && !file.error() && file.pos() <= to && response.isConnected())
137 {
138 qint64 blockSize = qMin<qint64>(65536, to - file.pos() + 1);
139 response.write(file.read(blockSize), file.atEnd());
140 }
141}
142
143bool FileHandler::getRange(const QString &range, qint64 fileSize, qint64 &from, qint64 &to)
144{

Callers

nothing calls this directly

Calls 15

QStringClass · 0.85
existsMethod · 0.80
openMethod · 0.80
getHeaderMethod · 0.80
splitMethod · 0.80
setHeaderMethod · 0.80
logMethod · 0.80
getPeerAddressMethod · 0.80
atEndMethod · 0.80
errorMethod · 0.80
isConnectedMethod · 0.80
setStatusMethod · 0.45

Tested by

no test coverage detected