bool HttpClientHandler::sendFile(HttpResponseHeader & hdr,const QString & full_path) { // Out(SYS_WEB|LOG_DEBUG) << "Sending file " << full_path << endl; setResponseHeaders(hdr); // first look in cache MMapFile* c = srv->cacheLookup(full_path); if (!c) { // not in cache so load it c = new MMapFile(); if (!c->open(full_path,QIODevice::ReadOnly)) { delete c; Out(SYS_WEB|LOG_DEBUG) << "Failed to open file " << full_path << endl; return false; } srv->insertIntoCache(full_path,c); } // Out(SYS_WEB|LOG_DEBUG) << "HTTP header : " << endl; // Out(SYS_WEB|LOG_DEBUG) << hdr.toString() << endl; QByteArray data((const char*)c->getDataPointer(),c->getSize()); hdr.setValue("Content-Length",QString::number(data.size())); output_buffer.append(hdr.toString().toUtf8()); output_buffer.append(data); sendOutputBuffer(); // Out(SYS_WEB|LOG_DEBUG) << "Finished sending " << full_path << " (" << written << " bytes)" << endl; return true; }
bool HttpClientHandler::sendFile(HttpResponseHeader & hdr,const QString & full_path) { // Out(SYS_WEB|LOG_DEBUG) << "Sending file " << full_path << endl; // first look in cache MMapFile* c = srv->cacheLookup(full_path); if (!c) { // not in cache so load it c = new MMapFile(); if (!c->open(full_path,MMapFile::READ)) { delete c; Out(SYS_WEB|LOG_DEBUG) << "Failed to open file " << full_path << endl; return false; } srv->insertIntoCache(full_path,c); } hdr.setValue("Content-Length",QString::number(c->getSize())); // Out(SYS_WEB|LOG_DEBUG) << "HTTP header : " << endl; // Out(SYS_WEB|LOG_DEBUG) << hdr.toString() << endl; QCString d = hdr.toString().utf8(); client->writeBlock(d.data(),d.length()); Uint32 written = 0; Uint32 total = c->getSize(); const char* data = (const char*)c->getDataPointer(); while (written < total) { Uint32 w = client->writeBlock(data + written,total - written); written += w; } client->flush(); // Out(SYS_WEB|LOG_DEBUG) << "Finished sending " << full_path << " (" << written << " bytes)" << endl; return true; }