Added support for buffering in HTTP library. Turned off by default.
This commit is contained in:
parent
ac3b43c188
commit
d93fb0c4dc
2 changed files with 22 additions and 8 deletions
|
@ -17,6 +17,7 @@ void HTTP::Parser::Clean() {
|
||||||
seenReq = false;
|
seenReq = false;
|
||||||
getChunks = false;
|
getChunks = false;
|
||||||
doingChunk = 0;
|
doingChunk = 0;
|
||||||
|
bufferChunks = false;
|
||||||
method = "GET";
|
method = "GET";
|
||||||
url = "/";
|
url = "/";
|
||||||
protocol = "HTTP/1.1";
|
protocol = "HTTP/1.1";
|
||||||
|
@ -135,10 +136,10 @@ void HTTP::Parser::SendResponse(std::string code, std::string message, Socket::C
|
||||||
/// \param message The HTTP response message. Usually you want "OK".
|
/// \param message The HTTP response message. Usually you want "OK".
|
||||||
/// \param request The HTTP request to respond to.
|
/// \param request The HTTP request to respond to.
|
||||||
/// \param conn The connection to send over.
|
/// \param conn The connection to send over.
|
||||||
void HTTP::Parser::StartResponse(std::string code, std::string message, HTTP::Parser & request, Socket::Connection & conn) {
|
void HTTP::Parser::StartResponse(std::string code, std::string message, HTTP::Parser & request, Socket::Connection & conn, bool bufferAllChunks) {
|
||||||
std::string prot = request.protocol;
|
std::string prot = request.protocol;
|
||||||
std::string contentType = GetHeader("Content-Type");
|
std::string contentType = GetHeader("Content-Type");
|
||||||
sendingChunks = (protocol == "HTTP/1.1" && request.GetHeader("Connection")!="close");
|
sendingChunks = (!bufferAllChunks && protocol == "HTTP/1.1" && request.GetHeader("Connection")!="close");
|
||||||
Clean();
|
Clean();
|
||||||
protocol = prot;
|
protocol = prot;
|
||||||
if (contentType.size()){
|
if (contentType.size()){
|
||||||
|
@ -147,10 +148,13 @@ void HTTP::Parser::StartResponse(std::string code, std::string message, HTTP::Pa
|
||||||
if (sendingChunks){
|
if (sendingChunks){
|
||||||
SetHeader("Transfer-Encoding", "chunked");
|
SetHeader("Transfer-Encoding", "chunked");
|
||||||
} else {
|
} else {
|
||||||
SetBody("");
|
SetHeader("Connection", "close");
|
||||||
}
|
}
|
||||||
|
bufferChunks = bufferAllChunks;
|
||||||
|
if (!bufferAllChunks){
|
||||||
SendResponse(code, message, conn);
|
SendResponse(code, message, conn);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Creates and sends a valid HTTP 1.0 or 1.1 response, based on the given request.
|
/// Creates and sends a valid HTTP 1.0 or 1.1 response, based on the given request.
|
||||||
/// The headers must be set before this call is made.
|
/// The headers must be set before this call is made.
|
||||||
|
@ -158,8 +162,8 @@ void HTTP::Parser::StartResponse(std::string code, std::string message, HTTP::Pa
|
||||||
/// This call simply calls StartResponse("200", "OK", request, conn)
|
/// This call simply calls StartResponse("200", "OK", request, conn)
|
||||||
/// \param request The HTTP request to respond to.
|
/// \param request The HTTP request to respond to.
|
||||||
/// \param conn The connection to send over.
|
/// \param conn The connection to send over.
|
||||||
void HTTP::Parser::StartResponse(HTTP::Parser & request, Socket::Connection & conn) {
|
void HTTP::Parser::StartResponse(HTTP::Parser & request, Socket::Connection & conn, bool bufferAllChunks) {
|
||||||
StartResponse("200", "OK", request, conn);
|
StartResponse("200", "OK", request, conn, bufferAllChunks);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// After receiving a header with this object, this function call will:
|
/// After receiving a header with this object, this function call will:
|
||||||
|
@ -550,6 +554,15 @@ void HTTP::Parser::Chunkify(const std::string & bodypart, Socket::Connection & c
|
||||||
/// \param conn The connection to use for sending.
|
/// \param conn The connection to use for sending.
|
||||||
void HTTP::Parser::Chunkify(const char * data, unsigned int size, Socket::Connection & conn) {
|
void HTTP::Parser::Chunkify(const char * data, unsigned int size, Socket::Connection & conn) {
|
||||||
static char hexa[] = "0123456789abcdef";
|
static char hexa[] = "0123456789abcdef";
|
||||||
|
if (bufferChunks){
|
||||||
|
if (size){
|
||||||
|
body.append(data, size);
|
||||||
|
}else{
|
||||||
|
SetHeader("Content-Length", body.length());
|
||||||
|
SendResponse("200", "OK", conn);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (sendingChunks) {
|
if (sendingChunks) {
|
||||||
//prepend the chunk size and \r\n
|
//prepend the chunk size and \r\n
|
||||||
if (!size){
|
if (!size){
|
||||||
|
|
|
@ -29,8 +29,8 @@ namespace HTTP {
|
||||||
std::string & BuildResponse(std::string code, std::string message);
|
std::string & BuildResponse(std::string code, std::string message);
|
||||||
void SendRequest(Socket::Connection & conn);
|
void SendRequest(Socket::Connection & conn);
|
||||||
void SendResponse(std::string code, std::string message, Socket::Connection & conn);
|
void SendResponse(std::string code, std::string message, Socket::Connection & conn);
|
||||||
void StartResponse(std::string code, std::string message, Parser & request, Socket::Connection & conn);
|
void StartResponse(std::string code, std::string message, Parser & request, Socket::Connection & conn, bool bufferAllChunks = false);
|
||||||
void StartResponse(Parser & request, Socket::Connection & conn);
|
void StartResponse(Parser & request, Socket::Connection & conn, bool bufferAllChunks = false);
|
||||||
void Chunkify(const std::string & bodypart, Socket::Connection & conn);
|
void Chunkify(const std::string & bodypart, Socket::Connection & conn);
|
||||||
void Chunkify(const char * data, unsigned int size, Socket::Connection & conn);
|
void Chunkify(const char * data, unsigned int size, Socket::Connection & conn);
|
||||||
void Proxy(Socket::Connection & from, Socket::Connection & to);
|
void Proxy(Socket::Connection & from, Socket::Connection & to);
|
||||||
|
@ -43,6 +43,7 @@ namespace HTTP {
|
||||||
std::string protocol;
|
std::string protocol;
|
||||||
unsigned int length;
|
unsigned int length;
|
||||||
bool headerOnly; ///< If true, do not parse body if the length is a known size.
|
bool headerOnly; ///< If true, do not parse body if the length is a known size.
|
||||||
|
bool bufferChunks;
|
||||||
private:
|
private:
|
||||||
bool seenHeaders;
|
bool seenHeaders;
|
||||||
bool seenReq;
|
bool seenReq;
|
||||||
|
|
Loading…
Add table
Reference in a new issue