CFEL - ASG Software Suite  2.5.0
CASS
httpserver.h
Go to the documentation of this file.
1 // Copyright (C) 2010 Stephan Kassemeyer
2 
3 /**
4  * @file httpserver.h a httpserver for serving histograms of cass
5  *
6  * @author Stephan Kassemeyer
7  */
8 
9 #include <microhttpd.h>
10 #include <iostream>
11 #include <string>
12 
13 #include "histogram_getter.h"
14 
15 #define HTTP_PORT 8000
16 #define ADDR_HIST2DImage "hst2im"
17 #define ADDR_HIST2DPage "hst2pg"
18 #define ADDR_HIST1DImage "hst1im"
19 #define ADDR_HIST1DPage "hst1pg"
20 
21 class httpServer;
22 
24 {
25  public:
26  requestType(MHD_Connection* connection, const char* address, httpServer& server) : _connection(connection), _address(address), _responseBuffer(""), _server(server) {}
27  virtual ~requestType() {
28  MHD_destroy_response(_response);
29  }
30  void sendResponse() { // public interface function: wrap response in http and send it.
32  _response = MHD_create_response_from_buffer(_responseBuffer.size(), (void*) _responseBuffer.c_str(), MHD_RESPMEM_MUST_COPY); // TODO: need something more clever than just copying to keep data around... maybe a queue like in soap server.
33  /*int ret = */MHD_queue_response(_connection, MHD_HTTP_OK, _response);
34  //MHD_destroy_response(_response); // TODO: segfault!?
35  }
36  protected:
37  virtual void createResponseBuffer() = 0; // virtual function, has to provide (i.e. fill into _responseBuffer) the data that is about to be send.
38  std::string _address;
39  std::string _responseBuffer;
40  MHD_Response * _response;
41  MHD_Connection* _connection;
43 };
44 
45 
47 {
48  public:
49  req_histogram2DImage(MHD_Connection* connection, const char* address, httpServer& server) :requestType(connection, address, server){}
50  private:
51  virtual void createResponseBuffer();
52 };
54 {
55  public:
56  req_histogram2DPage(MHD_Connection* connection, const char* address, httpServer& server) :requestType(connection, address, server){}
57  private:
58  virtual void createResponseBuffer();
59 };
61 {
62  public:
63  req_histogram1DImage(MHD_Connection* connection, const char* address, httpServer& server) :requestType(connection, address, server){}
64  private:
65  virtual void createResponseBuffer();
66 };
68 {
69  public:
70  req_histogram1DPage(MHD_Connection* connection, const char* address, httpServer& server) :requestType(connection, address, server){}
71  private:
72  virtual void createResponseBuffer();
73 };
75 {
76  public:
77  req_overviewPage(MHD_Connection* connection, const char* address, httpServer& server) :requestType(connection, address, server){}
78  private:
79  virtual void createResponseBuffer();
80 };
81 
82 
84 {
85  public:
86  httpServer(cass::HistogramGetter& histogram_getter):_histogram_getter(histogram_getter) {}
88  void start() { _daemon = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, HTTP_PORT, NULL, NULL,
89  &httpServer::handle_request_callback, (void*)this, MHD_OPTION_END); }
90  void stop() { MHD_stop_daemon(_daemon); }
91  cass::HistogramGetter& histogram_getter() {return _histogram_getter;}
92  // serve functions:
93  // handle_request is called from server thread. It passes a MHD_Connection
94  // and address to the serve functions, lets parseAddress create
95  // a request object and let the request object serve itself.
96  int handle_request(void *cls, struct MHD_Connection *connection, const char *address,
97  const char *method, const char *version, const char *upload_data,
98  size_t *upload_data_size, void **con_cls);
99  static int handle_request_callback(void *cls, struct MHD_Connection *connection, const char *address,
100  const char *method, const char *version, const char *upload_data,
101  size_t *upload_data_size, void **con_cls);
102  requestType* parseAddress(const char* address, MHD_Connection* connection);
103 
104  private:
105  struct MHD_Daemon *_daemon;
106  cass::HistogramGetter& _histogram_getter;
107 };
108 
req_histogram1DImage(MHD_Connection *connection, const char *address, httpServer &server)
Definition: httpserver.h:63
struct MHD_Daemon * _daemon
Definition: httpserver.h:105
void stop()
Definition: httpserver.h:90
#define HTTP_PORT
Definition: httpserver.h:15
virtual void createResponseBuffer()
Definition: httpserver.cpp:17
virtual void createResponseBuffer()
Definition: httpserver.cpp:68
static int handle_request_callback(void *cls, struct MHD_Connection *connection, const char *address, const char *method, const char *version, const char *upload_data, size_t *upload_data_size, void **con_cls)
Definition: httpserver.cpp:106
httpServer(cass::HistogramGetter &histogram_getter)
Definition: httpserver.h:86
virtual ~requestType()
Definition: httpserver.h:27
void sendResponse()
Definition: httpserver.h:30
void start()
Definition: httpserver.h:88
MHD_Connection * _connection
Definition: httpserver.h:41
cass::HistogramGetter & _histogram_getter
Definition: httpserver.h:106
requestType(MHD_Connection *connection, const char *address, httpServer &server)
Definition: httpserver.h:26
req_histogram2DImage(MHD_Connection *connection, const char *address, httpServer &server)
Definition: httpserver.h:49
virtual void createResponseBuffer()=0
requestType * parseAddress(const char *address, MHD_Connection *connection)
Definition: httpserver.cpp:114
MHD_Response * _response
Definition: httpserver.h:40
req_overviewPage(MHD_Connection *connection, const char *address, httpServer &server)
Definition: httpserver.h:77
int handle_request(void *cls, struct MHD_Connection *connection, const char *address, const char *method, const char *version, const char *upload_data, size_t *upload_data_size, void **con_cls)
Definition: httpserver.cpp:96
req_histogram1DPage(MHD_Connection *connection, const char *address, httpServer &server)
Definition: httpserver.h:70
virtual void createResponseBuffer()
Definition: httpserver.cpp:78
std::string _address
Definition: httpserver.h:38
cass::HistogramGetter & histogram_getter()
Definition: httpserver.h:91
httpServer & _server
Definition: httpserver.h:42
req_histogram2DPage(MHD_Connection *connection, const char *address, httpServer &server)
Definition: httpserver.h:56
virtual void createResponseBuffer()
Definition: httpserver.cpp:61
std::string _responseBuffer
Definition: httpserver.h:39
virtual void createResponseBuffer()
Definition: httpserver.cpp:40