RTBKit  0.9
Open-source framework to create real-time ad bidding systems.
soa/service/chunked_http_endpoint.h
00001 /* chunked_http_endpoint.h                                          -*- C++ -*-
00002    Jeremy Barnes, 26 April 2012
00003    Copyright (c) 2012 Datacratic.  All rights reserved.
00004 
00005 */
00006 
00007 #pragma once
00008 
00009 #include "soa/service/http_endpoint.h"
00010 #include "soa/service/stats_events.h"
00011 
00012 namespace Datacratic {
00013 
00014 class ChunkedHttpEndpoint;
00015 
00016 
00017 /*****************************************************************************/
00018 /* CHUNKED HTTP HANDLER                                                      */
00019 /*****************************************************************************/
00020 
00021 struct ChunkedHttpHandler
00022     : public HttpConnectionHandler,
00023       public std::enable_shared_from_this<ChunkedHttpHandler> {
00024 
00025     ChunkedHttpHandler();
00026     virtual ~ChunkedHttpHandler();
00027 
00029     virtual void onGotTransport();
00030 
00031     ChunkedHttpEndpoint * endpoint;
00032 
00034     virtual void handleHttpChunk(const HttpHeader & httpHeader,
00035                                  const std::string & chunkHeader,
00036                                  const std::string & chunk);
00037 
00039     virtual void handleDisconnect();
00040 
00041     virtual std::string status() const;
00042 
00044     virtual void handleError(const std::string & message);
00045 
00046     void doEvent(const char * eventName,
00047                  EventType type = ET_COUNT,
00048                  float value = 1.0,
00049                  const char * units = "");
00050 
00051     std::shared_ptr<ChunkedHttpHandler> makeNewHandlerShared();
00052     
00053     static long created;
00054     static long destroyed;
00055 };
00056 
00057 
00058 
00059 /*****************************************************************************/
00060 /* CHUNKED HTTP ENDPOINT                                                     */
00061 /*****************************************************************************/
00062 
00063 struct ChunkedHttpEndpoint: public HttpEndpoint {
00064 
00066     typedef boost::function<void (const HttpHeader & header,
00067                                   const std::string & chunkHeader,
00068                                   const std::string & chunkData)>
00069         OnChunk;
00070     OnChunk onChunk;
00071     
00072     ChunkedHttpEndpoint(const std::string & name, OnChunk onChunk);
00073     virtual ~ChunkedHttpEndpoint();
00074 
00081     typedef boost::function<void (std::string,
00082                                   EventType,
00083                                   float,
00084                                   const char *)> OnEvent;
00085     OnEvent onEvent;
00086     
00087 protected:
00088     void doEvent(const std::string & eventName,
00089                  EventType type = ET_COUNT,
00090                  float value = 1.0,
00091                  const char * units = "")
00092     {
00093         if (!onEvent) return;
00094         onEvent(eventName, type, value, units);
00095     }
00096     
00097     virtual std::shared_ptr<ConnectionHandler> makeNewHandler();
00098     virtual std::shared_ptr<ChunkedHttpHandler> makeNewHandlerShared();
00099 
00100 private:
00101     friend class ChunkedHttpHandler;
00102 };
00103 
00104 
00105 } // namespace Datacratic
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator