• Main Page
  • Classes
  • Files
  • File List
  • File Members

lib/bfHttpServer/src/httpresponse.cpp

Go to the documentation of this file.
00001 
00006 #include "httpresponse.h"
00007 
00008 HttpResponse::HttpResponse(QTcpSocket* socket) {
00009     this->socket=socket;
00010     statusCode=200;
00011     statusText="OK";
00012     sentHeaders=false;
00013     sentLastPart=false;
00014 }
00015 
00016 void HttpResponse::setHeader(QByteArray name, QByteArray value) {
00017     Q_ASSERT(sentHeaders==false);
00018     headers.insert(name,value);
00019 }
00020 
00021 void HttpResponse::setHeader(QByteArray name, int value) {
00022     Q_ASSERT(sentHeaders==false);
00023     headers.insert(name,QByteArray::number(value));
00024 }
00025 
00026 QMap<QByteArray,QByteArray>& HttpResponse::getHeaders() {
00027     return headers;
00028 }
00029 
00030 void HttpResponse::setStatus(int statusCode, QByteArray description) {
00031     this->statusCode=statusCode;
00032     statusText=description;
00033 }
00034 
00035 void HttpResponse::writeHeaders() {
00036     Q_ASSERT(sentHeaders==false);
00037     QByteArray buffer;
00038     buffer.append("HTTP/1.1 ");
00039     buffer.append(QByteArray::number(statusCode));
00040     buffer.append(' ');
00041     buffer.append(statusText);
00042     buffer.append("\r\n");
00043     foreach(QByteArray name, headers.keys()) {
00044         buffer.append(name);
00045         buffer.append(": ");
00046         buffer.append(headers.value(name));
00047         buffer.append("\r\n");
00048     }
00049     foreach(HttpCookie cookie,cookies.values()) {
00050         buffer.append("Set-Cookie: ");
00051         buffer.append(cookie.toByteArray());
00052         buffer.append("\r\n");
00053     }
00054     buffer.append("\r\n");
00055     writeToSocket(buffer);
00056     sentHeaders=true;
00057 }
00058 
00059 void HttpResponse::writeToSocket(QByteArray data) {
00060     int remaining=data.size();
00061     char* ptr=data.data();
00062     while (socket->isOpen() && remaining>0) {
00063         int written=socket->write(data);
00064         ptr+=written;
00065         remaining-=written;
00066     }
00067 }
00068 
00069 void HttpResponse::write(QByteArray data, bool lastPart) {
00070     Q_ASSERT(sentLastPart==false);
00071     if (sentHeaders==false) {
00072         QByteArray connectionMode=headers.value("Connection");
00073         if (!headers.contains("Content-Length") && !headers.contains("Transfer-Encoding") && connectionMode!="close" && connectionMode!="Close") {
00074             if (!lastPart) {
00075                 headers.insert("Transfer-Encoding","chunked");
00076             }
00077             else {
00078                 headers.insert("Content-Length",QByteArray::number(data.size()));
00079             }
00080         }
00081         writeHeaders();
00082     }
00083     bool chunked=headers.value("Transfer-Encoding")=="chunked" || headers.value("Transfer-Encoding")=="Chunked";
00084     if (chunked) {
00085         if (data.size()>0) {
00086             QByteArray buffer=QByteArray::number(data.size(),16);
00087             buffer.append("\r\n");
00088             writeToSocket(buffer);
00089             writeToSocket(data);
00090             writeToSocket("\r\n");
00091         }
00092     }
00093     else {
00094         writeToSocket(data);
00095     }
00096     if (lastPart) {
00097         if (chunked) {
00098             writeToSocket("0\r\n\r\n");
00099         }
00100         else if (!headers.contains("Content-Length")) {
00101             socket->disconnectFromHost();
00102         }
00103         sentLastPart=true;
00104     }
00105 }
00106 
00107 
00108 bool HttpResponse::hasSentLastPart() const {
00109     return sentLastPart;
00110 }
00111 
00112 
00113 void HttpResponse::setCookie(const HttpCookie& cookie) {
00114     Q_ASSERT(sentHeaders==false);
00115     if (!cookie.getName().isEmpty()) {
00116         cookies.insert(cookie.getName(),cookie);
00117     }
00118 }
00119 
00120 QMap<QByteArray,HttpCookie>& HttpResponse::getCookies() {
00121     return cookies;
00122 }

Generated on Mon Dec 26 2011 12:09:22 for QtWebApp by  doxygen 1.7.1