void HTTPConnection::respond(const char* code, const QByteArray& content, const char* contentType, const Headers& headers) { _socket->write("HTTP/1.1 "); _socket->write(code); _socket->write("\r\n"); int csize = content.size(); for (Headers::const_iterator it = headers.constBegin(), end = headers.constEnd(); it != end; it++) { _socket->write(it.key()); _socket->write(": "); _socket->write(it.value()); _socket->write("\r\n"); } if (csize > 0) { _socket->write("Content-Length: "); _socket->write(QByteArray::number(csize)); _socket->write("\r\n"); _socket->write("Content-Type: "); _socket->write(contentType); _socket->write("\r\n"); } _socket->write("Connection: close\r\n\r\n"); if (csize > 0) { _socket->write(content); } // make sure we receive no further read notifications _socket->disconnect(SIGNAL(readyRead()), this); _socket->disconnectFromHost(); }
bool HttpServerResponse::writeHead(int statusCode, const QByteArray &reasonPhrase, const Headers &headers) { if (priv->formattingState != Priv::STATUS_LINE) return false; if (priv->options.testFlag(HttpServerResponse::HTTP_1_0)) { static const char chunk[] = "HTTP/1.0 "; priv->device.write(chunk, sizeof(chunk) - 1); } else { static const char chunk[] = "HTTP/1.1 "; priv->device.write(chunk, sizeof(chunk) - 1); } priv->device.write(QByteArray::number(statusCode)); priv->device.write(" ", 1); priv->device.write(reasonPhrase); priv->device.write(CRLF); for (Headers::const_iterator i = headers.constBegin() ;i != headers.end();++i) { priv->device.write(i.key()); priv->device.write(": ", 2); priv->device.write(i.value()); priv->device.write(CRLF); } priv->formattingState = Priv::HEADERS; return true; }
void HTTPConnection::respondWithStatusAndHeaders(const char* code, const char* contentType, const Headers& headers, qint64 contentLength) { _socket->write("HTTP/1.1 "); _socket->write(code); _socket->write("\r\n"); for (Headers::const_iterator it = headers.constBegin(), end = headers.constEnd(); it != end; it++) { _socket->write(it.key()); _socket->write(": "); _socket->write(it.value()); _socket->write("\r\n"); } if (contentLength > 0) { _socket->write("Content-Length: "); _socket->write(QByteArray::number(contentLength)); _socket->write("\r\n"); _socket->write("Content-Type: "); _socket->write(contentType); _socket->write("\r\n"); } _socket->write("Connection: close\r\n\r\n"); }
bool HttpServerResponse::addTrailers(const Headers &headers) { if (priv->options.testFlag(HttpServerResponse::HTTP_1_0)) return false; switch (priv->formattingState) { case Priv::STATUS_LINE: case Priv::END: case Priv::HEADERS: return false; case Priv::MESSAGE_BODY: priv->device.write("0\r\n"); priv->formattingState = Priv::TRAILERS; case Priv::TRAILERS: { for (Headers::const_iterator i = headers.constBegin() ;i != headers.end();++i) { priv->device.write(i.key()); priv->device.write(": ", 2); priv->device.write(i.value()); priv->device.write(CRLF); } } } // switch (priv->formattingState) return true; }