[Interest] Cross platform Web services server

Jason H scorp1us at yahoo.com
Fri Mar 7 22:19:41 CET 2014


I've written several http[s] servers in Qt.

You can have a look at the very simple qmlwebmodelserver at https://github.com/jhihn/qmlwebmodelserver It's quick, dirty, but done right. It's not as nice as inheriting from a class, but it is pretty easy. It does not use SSL yet, but the changes from QTcpSocket to QSslSocket are trivial. It supports HTTP1.1 and will do chuncked length encoded returns as needed, and uses a thread pool

Basically, you take that project, delete the CsvFile, ModelMapper classes, provide your own version of ModelMapper (request handler) and you are done.

Your server application code goes in to your replacement for ModelMapper, and things are set up as in ServerThread::run() (included below)
Basically, to return stuff back through the server to the client, your class **emits** one or more of the following:
A httpResponse(QHttpResponseHeader,QByteArray) - the response header to return and a QByteArray

OR
A httpResponseHead(QHttpResponseHeader), followed by 0 or more:

httpResponseContent(QByteArray) x N, (chunk-length encoded) followed by a:

httpResponseClose() x 1


Note that httpResponseClose() doesn't actually close if it is HTTP1.1.


void ServerThread::run()
{
SlotSocket *socket = new SlotSocket();
RequestParser *httpParser = new RequestParser();
ModelMapper *modelMapper = new ModelMapper();
if (!socket->setSocketDescriptor(m_socketDescriptor))
{
qDebug() << Q_FUNC_INFO <<"cannot set setSocketDescriptor";
return;
}
QObject::connect(socket, SIGNAL(read(QByteArray)), httpParser, SLOT(read(QByteArray)));
QObject::connect(httpParser, SIGNAL(write(QByteArray)), socket, SLOT(write(QByteArray)));
QObject::connect(httpParser, SIGNAL(httpGet(QHttpRequestHeader)), modelMapper, SLOT(getModel(QHttpRequestHeader)));
QObject::connect(httpParser, SIGNAL(httpPost(QHttpRequestHeader,QByteArray)), modelMapper, SLOT(postModel(QHttpRequestHeader,QByteArray)));
QObject::connect(modelMapper, SIGNAL(httpResponse(QHttpResponseHeader,QByteArray)), httpParser, SLOT(httpResponse(QHttpResponseHeader,QByteArray)));
QObject::connect(modelMapper, SIGNAL(httpResponseHead(QHttpResponseHeader)), httpParser, SLOT(httpResponseHead(QHttpResponseHeader)));
QObject::connect(modelMapper, SIGNAL(httpResponseContent(QByteArray)), httpParser, SLOT(httpResponseContent(QByteArray)));
QObject::connect(modelMapper, SIGNAL(httpResponseClose()), httpParser, SLOT(httpResponseClose()));

#ifdef USETHREADPOOL
QEventLoop loop;
loop.exec();
#else
exec();
#endif

if (socket) socket->deleteLater();
if (httpParser) httpParser->deleteLater();
if (modelMapper) modelMapper->deleteLater();
}




________________________________
 From: Daniel Bowen <qtmailinglist1 at bowensite.com>
To: interest at qt-project.org 
Sent: Thursday, March 6, 2014 4:22 PM
Subject: [Interest] Cross platform Web services server
 

Cross platform Web services server
I’m wondering what other people are usingthese daysfor providing web services from a server point of viewfor embedded devices,where the server code isintegrated as a shared libraryand geared more toward providing RESTful servicesfor a limited number of clients on the local network. Something that’s also cross-platform. Ideally,you’dbe able tohave different handlers fordifferent base paths.  For example, registeringaCcallback or handlerC++class/interfaceor Qt signal/slotfor“/path1”, and if a request came in for“/path1/thing1?a=b”, then the registered hander could deal with that.
SSL integration (withQSsl and friends, or openssl)andauthentication supportare important too.
Thanks!
-Daniel
_______________________________________________
Interest mailing list
Interest at qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20140307/207d43f1/attachment.html>


More information about the Interest mailing list