ResponseHeader.cpp

Go to the documentation of this file.
00001 /*
00002 
00003 Copyright (C) 2005-2007 by Peter Dimov.
00004 
00005 This file is part of Calitko (http://www.calitko.org).
00006 
00007 Calitko is free software; you can redistribute it and/or modify
00008 it under the terms of the GNU General Public License as published by
00009 the Free Software Foundation; either version 2 of the License, or
00010 (at your option) any later version.
00011 
00012 Calitko is distributed in the hope that it will be useful,
00013 but WITHOUT ANY WARRANTY; without even the implied warranty of
00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015 GNU General Public License for more details.
00016 
00017 You should have received a copy of the GNU General Public License
00018 along with Calitko; if not, write to the Free Software
00019 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
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 } // namespace Http;
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 }