38 #include <QtConcurrent> 39 #include <QNetworkAccessManager> 40 #include <QHostAddress> 41 #include <qhttpserver.h> 42 #include <qhttprequest.h> 43 #include <qhttpresponse.h> 51 #include <QJsonObject> 52 #include <QJsonDocument> 55 #include <QApplication> 66 mRequests.push_front(RequestType(req,resp));
68 connect(req, SIGNAL(
end()),
this, SLOT(onRequestSuccessful()));
71 void HttpRequestHandler::onRequestSuccessful()
73 for (QList<RequestType>::iterator iter = mRequests.begin(); iter!=mRequests.end(); )
75 if (iter->req->successful())
78 iter = mRequests.erase(iter);
102 CX_LOG_DEBUG() << QString(
"Web server request [%1] from [%2]")
104 .arg(req->remoteAddress());
106 if (req->path() ==
"/")
110 else if (req->path().startsWith(
"/screen"))
114 else if (req->path().startsWith(
"/layout"))
126 CX_ASSERT(req->path().startsWith(
"/layout"));
128 if (req->path() ==
"/layout")
132 else if (req->path()==
"/layout/display/stream")
136 else if (req->path() ==
"/layout/display")
150 if (req->method()==QHttpRequest::HTTP_GET)
162 CX_ASSERT(req->path()==
"/layout/display/stream");
164 if (req->method()==QHttpRequest::HTTP_PUT)
168 else if (req->method()==QHttpRequest::HTTP_DELETE)
180 CX_ASSERT(req->path()==
"/layout/display");
182 if (req->method()==QHttpRequest::HTTP_GET)
186 else if (req->method()==QHttpRequest::HTTP_PUT)
190 else if (req->method()==QHttpRequest::HTTP_DELETE)
203 QStringList layouts =
mApi->getAvailableLayouts();
213 root.insert(
"Layouts", QJsonArray::fromStringList(layouts));
214 QByteArray ba = QJsonDocument(root).toJson();
216 resp->setHeader(
"Content-Type",
"application/json");
217 resp->setHeader(
"Content-Length", QString::number(ba.size()));
218 resp->writeHead(200);
225 QImage image =
mApi->grabLayout();
226 QByteArray ba = this->generatePNGEncoding(image);
228 resp->setHeader(
"Content-Type",
"image/png");
229 resp->setHeader(
"Content-Length", QString::number(ba.size()));
230 resp->writeHead(200);
240 QJsonDocument doc = QJsonDocument::fromJson(req->body());
243 size.setWidth(doc.object()[
"width"].toInt());
244 size.setHeight(doc.object()[
"height"].toInt());
245 QString layout = doc.object()[
"layout"].toString();
247 CX_LOG_CHANNEL_DEBUG(
"CA") <<
"size " << size.width() <<
"," << size.height() <<
", layout " << layout;
249 mApi->createLayoutWidget(size, layout);
251 resp->writeHead(200);
257 mApi->closeLayoutWidget();
260 QByteArray HttpRequestHandler::generatePNGEncoding(QImage image)
264 buffer.open(QIODevice::WriteOnly);
265 image.save(&buffer,
"PNG");
283 if (req->method()==QHttpRequest::HTTP_GET)
295 QString body(
"</body>" 298 "Arguments are passed using JSON format." 301 "<table border=\"1\">" 302 "<tr><th>method</th><th>resource</th><th>description</th><th>arguments</th></tr>" 304 "<tr><td>GET</td><td>/</td><td>main page: short server info</td><td>html page</td></tr>" 305 "<tr><td>GET</td><td>/layout</td><td>return list of all layouts</td><td>layouts</td></tr>" 308 "<td>PUT</td><td>/layout/display</td>" 309 "<td>create layout display of given size and layout.</td>" 310 "<td>width=(int),height=(int),layout=(uid)</td>" 312 "<tr><td>GET</td><td>/layout/display</td><td>get image of layout</td><td>png image</td></tr>" 313 "<tr><td>DELETE</td><td>/layout/display</td><td>delete display</td></tr>" 321 .arg(qApp->applicationDisplayName())
324 QByteArray ba = body.toUtf8();
326 resp->setHeader(
"Content-Type",
"text/html");
327 resp->setHeader(
"Content-Length", QString::number(ba.size()));
328 resp->writeHead(200);
335 CX_ASSERT(req->path().startsWith(
"/screen"));
337 if (req->path() ==
"/screen")
349 resp->writeHead(404);
350 resp->end(QByteArray(
"Not found"));
355 resp->writeHead(405);
356 resp->end(QByteArray(
"Method Not Allowed"));
377 QImage image =
mApi->grabScreen();
378 QByteArray ba = this->generatePNGEncoding(image);
380 resp->setHeader(
"Content-Type",
"image/png");
381 resp->setHeader(
"Content-Length", QString::number(ba.size()));
382 resp->writeHead(200);
void process_mainpage(QHttpRequest *req, QHttpResponse *resp)
void handle_request(QHttpRequest *req, QHttpResponse *resp)
virtual QString getAdditionalMainPageDescription() const
void handle_layout(QHttpRequest *req, QHttpResponse *resp)
virtual void create_stream(QHttpRequest *req, QHttpResponse *resp)
#define CX_ASSERT(statement)
void handle_complete_request(QHttpRequest *req, QHttpResponse *resp)
void reply_method_not_allowed(QHttpResponse *resp)
void process_stream(QHttpRequest *req, QHttpResponse *resp)
void handle_screen(QHttpRequest *req, QHttpResponse *resp)
virtual void delete_stream(QHttpResponse *resp)
void reply_screenshot(QHttpResponse *resp)
boost::shared_ptr< class RemoteAPI > RemoteAPIPtr
#define CX_LOG_CHANNEL_DEBUG(channel)
void get_display_image(QHttpResponse *resp)
void reply_notfound(QHttpResponse *resp)
void process_display(QHttpRequest *req, QHttpResponse *resp)
void process_screen(QHttpRequest *req, QHttpResponse *resp)
void process_layout(QHttpRequest *req, QHttpResponse *resp)
void create_display(QHttpRequest *req, QHttpResponse *resp)
HttpRequestHandler(RemoteAPIPtr api)
void reply_layout_list(QHttpResponse *resp)
void reply_mainpage(QHttpResponse *resp)
Namespace for all CustusX production code.
void delete_display(QHttpResponse *resp)