![]() |
RTBKit
0.9
Open-source framework to create real-time ad bidding systems.
|
00001 /* http_endpoint.h -*- C++ -*- 00002 Jeremy Barnes, 18 February 2011 00003 Copyright (c) 2011 Datacratic. All rights reserved. 00004 00005 Endpoint for generic HTTP connections. 00006 */ 00007 00008 #pragma once 00009 00010 #include "soa/service//passive_endpoint.h" 00011 #include "soa/types/date.h" 00012 #include "http_header.h" 00013 #include <boost/make_shared.hpp> 00014 #include <boost/algorithm/string.hpp> 00015 00016 namespace Datacratic { 00017 00018 00019 class HttpEndpoint; 00020 00021 00022 /*****************************************************************************/ 00023 /* HTTP RESPONSE */ 00024 /*****************************************************************************/ 00025 00030 struct HttpResponse { 00031 HttpResponse(int responseCode, 00032 std::string contentType, 00033 std::string body, 00034 std::vector<std::pair<std::string, std::string> > extraHeaders 00035 = std::vector<std::pair<std::string, std::string> >()) 00036 : responseCode(responseCode), 00037 responseStatus(getResponseReasonPhrase(responseCode)), 00038 contentType(contentType), 00039 body(body), 00040 extraHeaders(extraHeaders) 00041 { 00042 } 00043 00044 HttpResponse(int responseCode, 00045 Json::Value body, 00046 std::vector<std::pair<std::string, std::string> > extraHeaders 00047 = std::vector<std::pair<std::string, std::string> >()) 00048 : responseCode(responseCode), 00049 responseStatus(getResponseReasonPhrase(responseCode)), 00050 contentType("application/json"), 00051 body(boost::trim_copy(body.toString())), 00052 extraHeaders(extraHeaders) 00053 { 00054 } 00055 00056 int responseCode; 00057 std::string responseStatus; 00058 std::string contentType; 00059 std::string body; 00060 std::vector<std::pair<std::string, std::string> > extraHeaders; 00061 }; 00062 00063 00064 /*****************************************************************************/ 00065 /* HTTP CONNECTION HANDLER */ 00066 /*****************************************************************************/ 00067 00075 struct HttpConnectionHandler : public PassiveConnectionHandler { 00076 00077 HttpConnectionHandler(); 00078 00079 enum ReadState { 00080 INVALID, 00081 HEADER, 00082 PAYLOAD, // non chunk only 00083 CHUNK_HEADER, // chunk only 00084 CHUNK_BODY, // chunk only 00085 DONE 00086 } readState; 00087 00089 std::string headerText; 00090 00092 HttpHeader header; 00093 00095 std::string payload; 00096 00098 std::string chunkHeader; 00099 size_t chunkSize; 00100 std::string chunkBody; 00101 00103 Date firstData; 00104 00105 HttpEndpoint * httpEndpoint; 00106 00107 virtual void onGotTransport(); 00108 00113 std::shared_ptr<ConnectionHandler> makeNewHandlerShared(); 00114 00115 //virtual void handleNewConnection(); 00116 virtual void handleData(const std::string & data); 00117 virtual void handleSendFinished(); 00118 virtual void handleError(const std::string & message); 00119 virtual void onCleanup(); 00120 00124 virtual void handleHttpHeader(const HttpHeader & header); 00125 00130 virtual void handleHttpData(const std::string & data); 00131 00135 virtual void handleHttpPayload(const HttpHeader & header, 00136 const std::string & payload); 00137 00141 virtual void handleHttpChunk(const HttpHeader & header, 00142 const std::string & chunkHeader, 00143 const std::string & chunk); 00144 00147 void sendHttpChunk(const std::string & chunk, 00148 NextAction next = NEXT_CONTINUE, 00149 OnWriteFinished onWriteFinished = OnWriteFinished()); 00150 00155 virtual void putResponseOnWire(HttpResponse response, 00156 std::function<void ()> onSendFinished 00157 = std::function<void ()>()); 00158 00159 }; 00160 00161 00162 /*****************************************************************************/ 00163 /* HTTP ENDPOINT */ 00164 /*****************************************************************************/ 00165 00168 struct HttpEndpoint: public PassiveEndpointT<SocketTransport> { 00169 00170 HttpEndpoint(const std::string & name); 00171 00172 virtual ~HttpEndpoint(); 00173 00174 typedef std::function<std::shared_ptr<ConnectionHandler> ()> 00175 HandlerFactory; 00176 00177 HandlerFactory handlerFactory; 00178 00179 virtual std::shared_ptr<ConnectionHandler> 00180 makeNewHandler() 00181 { 00182 if (handlerFactory) 00183 return handlerFactory(); 00184 return std::make_shared<HttpConnectionHandler>(); 00185 } 00186 }; 00187 00188 } // namespace Datacratic