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 }