CFEL - ASG Software Suite  2.5.0
CASS
httpserver.cpp
Go to the documentation of this file.
1 // Copyright (C) 2010 Stephan Kassemeyer
2 
3 /**
4  * @file httpserver.cpp a httpserver for serving histograms of cass
5  *
6  * @author Stephan Kassemeyer
7  */
8 
9 #include "httpserver.h"
10 #include "processor.h"
11 #include "histogram.h"
12 #include "id_list.h"
13 #include "cass_exceptions.h"
14 
15 
16 
18 {
19  _responseBuffer = "";
20  // todo: parse address (histogram name) and get requested histogram
21  // todo: fill buffer with image of histogram
22  int dotpos = _address.find_last_of(".");
23  std::string type( _address.substr(0, dotpos));
24  std::cout << "DING:\n";
25  std::cout << _address << std::endl;
26  std::cout << type << std::endl;
27  try {
28  std::vector<JOCTET>* buffer(_server.histogram_getter().jpegImage(cass::HistogramParameter(type)));
29  std::cout << "req_histogram2DImage::createResponseBuffer: buffer size: " << buffer->size() << std::endl;
30  for (int ii=0;ii<buffer->size();++ii)
31  _responseBuffer += (*buffer)[ii];
32  // todo: can this be done without copying?
33  }
34  catch (cass::InvalidPostProcessorError& e)
35  {
36  std::cout << "requested invalid histogram: " << e.what() << std::endl;
37  }
38 }
39 
41 {
42  _responseBuffer = "";
43  _responseBuffer += "<html><head> <meta http-equiv=\"refresh\" content=\"1\"></head><body>\n";
44  //_responseBuffer += "<html><head><title>2D Histogram</title></head><body>\n";
45 
46  std::string imageFileName( ADDR_HIST2DImage );
47  int dotpos = _address.find_last_of(".");
48  imageFileName += _address.substr( 0, dotpos );
49  imageFileName += ".jpg";
50  _responseBuffer += "<html><body>\n";
51  _responseBuffer += "<img src=\"";
52  _responseBuffer += imageFileName;
53  _responseBuffer += "\" alt=\"";
54  _responseBuffer += imageFileName;
55  _responseBuffer += "\"></p>";
56  _responseBuffer += imageFileName;
57  _responseBuffer += "\n";
58  _responseBuffer += "</body></html>\n";
59 }
60 
62 {
63  _responseBuffer = "";
64  // todo: parse address (histogram name) and get requested histogram
65  // todo: fill buffer with image of histogram
66 }
67 
69 {
70  _responseBuffer = "";
71  //_responseBuffer += "<html><head> <meta http-equiv=\"refresh\" content=\"5\"></head><body>\n";
72  //_responseBuffer += "<html><head><title>2D Histogram</title></head><body>\n";
73  _responseBuffer += "<html><body>\n";
74  _responseBuffer += "plot to be inserted here...\n";
75  _responseBuffer += "</body></html>\n";
76 }
77 
79 {
80  // get list of published (=visible/unhidden) histograms
81  cass::PostProcessors *pp(cass::PostProcessors::instance(""));
82  cass::IdList* idlist(pp->getIdList());
83  cass::PostProcessors::keyList_t list = idlist->getList();
84  _responseBuffer = "";
85  _responseBuffer += "<html><body>\n";
86  _responseBuffer += "List of active and published processors:\n";
87  for (cass::PostProcessors::keyList_t::const_iterator it=list.begin(); it!=list.end(); ++it)
88  _responseBuffer += "<li><a href=\"" + std::string(ADDR_HIST2DPage) + *it + ".html\">" + *it + "</a></li>\n";
89  _responseBuffer += "end of list.\n";
90  _responseBuffer += "</body></html>\n";
91 }
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 httpServer::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 {
100  requestType* reqOb = parseAddress(address, connection);
101  reqOb->sendResponse();
102  delete reqOb;
103  std::cout << "handle_request connection: " << connection << std::endl;
104  return 1;
105 }
106 int httpServer::handle_request_callback(void *cls, struct MHD_Connection *connection, const char *address,
107  const char *method, const char *version, const char *upload_data,
108  size_t *upload_data_size, void **con_cls)
109 {
110  httpServer* _this = (httpServer*) cls;
111  std::cout << "handle_request_callback connection: " << connection << std::endl;
112  return _this->handle_request(cls, connection, address, method, version, upload_data, upload_data_size, con_cls);
113 }
114 requestType* httpServer::parseAddress(const char* address, MHD_Connection* connection)
115 {
116  int begin = strlen(address); // offset of address substring
117  // look for lowest level in address:
118  while (begin>0) {
119  if (address[begin-1]=='/') break;
120  --begin;
121  }
122  std::cout << "parseAddress: " << address << std::endl;
123  std::cout << "parseAddress2: " << address+begin << std::endl;
124  if (!strncmp(address+begin, ADDR_HIST2DImage, strlen(ADDR_HIST2DImage))) return new req_histogram2DImage(connection, address+begin+strlen(ADDR_HIST2DImage), *this);
125  if (!strncmp(address+begin, ADDR_HIST2DPage, strlen(ADDR_HIST2DPage))) return new req_histogram2DPage(connection, address+begin+strlen(ADDR_HIST2DPage), *this);
126  if (!strncmp(address+begin, ADDR_HIST1DImage, strlen(ADDR_HIST1DImage))) return new req_histogram1DImage(connection, address+begin+strlen(ADDR_HIST1DImage), *this);
127  if (!strncmp(address+begin, ADDR_HIST1DPage, strlen(ADDR_HIST1DPage))) return new req_histogram1DPage(connection, address+begin+strlen(ADDR_HIST1DPage), *this);
128  return new req_overviewPage(connection, address+begin, *this);
129 }
130 
#define ADDR_HIST1DImage
Definition: httpserver.h:18
#define ADDR_HIST2DPage
Definition: httpserver.h:17
#define ADDR_HIST2DImage
Definition: httpserver.h:16
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
a httpserver for serving histograms of cass
void sendResponse()
Definition: httpserver.h:30
requestType * parseAddress(const char *address, MHD_Connection *connection)
Definition: httpserver.cpp:114
file contains processors baseclass declaration
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
virtual void createResponseBuffer()
Definition: httpserver.cpp:78
#define ADDR_HIST1DPage
Definition: httpserver.h:19
const Processor::names_t & getList()
getter for the internal list
std::string _address
Definition: httpserver.h:38
cass::HistogramGetter & histogram_getter()
Definition: httpserver.h:91
httpServer & _server
Definition: httpserver.h:42
virtual void createResponseBuffer()
Definition: httpserver.cpp:61
std::string _responseBuffer
Definition: httpserver.h:39
virtual void createResponseBuffer()
Definition: httpserver.cpp:40