ResponseHeader.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "Qt.h"
00024 #include "ResponseHeader.h"
00025
00026 using namespace Http;
00027
00028 namespace Http {
00029
00030 class ResponseHeaderPrivate
00031 {
00032 public:
00033 int statusCode;
00034 QString reasonPhrase;
00035 int majorVersion;
00036 int minorVersion;
00037
00038 ResponseHeaderPrivate()
00039 : statusCode (0), reasonPhrase(), majorVersion (0), minorVersion (0)
00040 {}
00041 };
00042
00043 }
00044
00048 ResponseHeader::ResponseHeader()
00049 : d (new ResponseHeaderPrivate)
00050 {
00051 setValid(false);
00052 }
00053
00057 ResponseHeader::ResponseHeader (const ResponseHeader &header)
00058 : Header (header), d (new ResponseHeaderPrivate)
00059 {
00060 d->statusCode = header.d->statusCode;
00061 d->reasonPhrase = header.d->reasonPhrase;
00062 d->majorVersion = header.d->majorVersion;
00063 d->minorVersion = header.d->minorVersion;
00064 }
00065
00067 ResponseHeader::~ResponseHeader()
00068 {
00069 }
00070
00074 ResponseHeader & ResponseHeader::operator= (const ResponseHeader &header)
00075 {
00076 Header::operator= (header);
00077 d->statusCode = header.d->statusCode;
00078 d->reasonPhrase = header.d->reasonPhrase;
00079 d->majorVersion = header.d->majorVersion;
00080 d->minorVersion = header.d->minorVersion;
00081 return *this;
00082 }
00083
00092 ResponseHeader::ResponseHeader (const QString &str)
00093 : d (new ResponseHeaderPrivate)
00094 {
00095 parse(str);
00096 }
00097
00098 ResponseHeader::ResponseHeader (int statusCode,
00099 const QString &reasonPhrase,
00100 int majorVersion,
00101 int minorVersion)
00102 : d()
00103 {
00104 setStatusLine (statusCode, reasonPhrase, majorVersion, minorVersion);
00105 }
00106
00113 void ResponseHeader::setStatusLine (int statusCode,
00114 const QString &reasonPhrase,
00115 int majorVersion,
00116 int minorVersion)
00117 {
00118 setValid(true);
00119 d->statusCode = statusCode;
00120 d->reasonPhrase = reasonPhrase;
00121 d->majorVersion = majorVersion;
00122 d->minorVersion = minorVersion;
00123 }
00124
00130 int ResponseHeader::statusCode() const
00131 {
00132 return d->statusCode;
00133 }
00134
00140 QString ResponseHeader::reasonPhrase() const
00141 {
00142 return d->reasonPhrase;
00143 }
00144
00150 int ResponseHeader::majorVersion() const
00151 {
00152 return d->majorVersion;
00153 }
00154
00160 int ResponseHeader::minorVersion() const
00161 {
00162 return d->minorVersion;
00163 }
00164
00167 bool ResponseHeader::parseLine(const QString &line, int number)
00168 {
00169 if (number != 0)
00170 return Header::parseLine(line, number);
00171
00172 QString l = line.simplified();
00173 if (l.length() < 10)
00174 return false;
00175
00176 if (l.left(5) == "HTTP/" && l[5].isDigit() && l[6] == '.' &&
00177 l[7].isDigit() && l[8] == ' ' && l[9].isDigit()) {
00178 d->majorVersion = l[5].toLatin1() - '0';
00179 d->minorVersion = l[7].toLatin1() - '0';
00180
00181 int pos = l.indexOf(' ', 9);
00182 if (pos != -1) {
00183 d->reasonPhrase = l.mid(pos + 1);
00184 d->statusCode = l.mid(9, pos - 9).toInt();
00185 } else {
00186 d->statusCode = l.mid(9).toInt();
00187 d->reasonPhrase.clear();
00188 }
00189 } else {
00190 return false;
00191 }
00192
00193 return true;
00194 }
00195
00198 QString ResponseHeader::toString() const
00199 {
00200 QString format("HTTP/%1.%2 %3 %4\r\n%5\r\n");
00201 return format.arg(d->majorVersion)
00202 .arg(d->minorVersion)
00203 .arg(d->statusCode)
00204 .arg(d->reasonPhrase)
00205 .arg(Header::toString());
00206 }