RTBKit  0.9
Open-source framework to create real-time ad bidding systems.
soa/service/http_endpoint.h
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
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator