Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #ifndef WOB_SERVER_H
00007 #define WOB_SERVER_H
00008
00009 #include <QObject>
00010 #include <QHostAddress>
00011 #include <QMap>
00012 #include <QMetaType>
00013
00014 class QTcpServer;
00015 class QLocalServer;
00016 class WInterface;
00017
00018 class WServerRequest
00019 {
00020 public:
00021 WServerRequest();
00022 WServerRequest(const WServerRequest&);
00023
00024 WServerRequest& operator=(const WServerRequest&);
00025
00026 bool hasHeader(const QString&)const;
00027 bool hasCgiHeader(const QString&)const;
00028 QByteArray header(const QString&)const;
00029 QByteArray cgiHeader(const QString&)const;
00030
00031 QByteArray bodyData()const;
00032
00033 bool isValid()const;
00034
00035 QByteArray dump()const;
00036
00037 QString pathInfo()const;
00038
00039 protected:
00040 WServerRequest(const QByteArray&);
00041 void setBody(const QByteArray&);
00042 friend class WServer;
00043 friend class WServerReceiver;
00044
00045 private:
00046 QMap<QByteArray,QByteArray>mhead;
00047 QByteArray mbody;
00048 };
00049 Q_DECLARE_METATYPE(WServerRequest);
00050
00051 class WServerReply
00052 {
00053 public:
00054 WServerReply();
00055 WServerReply(const WServerReply&);
00056 WServerReply& operator=(const WServerReply&);
00057
00058 bool setStatus(short code,QString str);
00059 bool setHeader(const QString&,const QString&);
00060 void setBody(const QString&);
00061 void setBody(const QByteArray&);
00062
00063 protected:
00064 friend class WServer;
00065 QByteArray toWireFormat()const;
00066 private:
00067 short mStatCode;
00068 QByteArray mStatStr,mBody;
00069 QMap<QString,QPair<QString,QString> >mHead;
00070 };
00071
00074 class WServer:public QObject
00075 {
00076 Q_OBJECT
00077 public:
00078 WServer(const QString&,QObject*parent=0);
00079 WServer(const QHostAddress&,unsigned short,QObject*parent=0);
00080 virtual ~WServer();
00081
00082 bool isActive()const{return tcpserv!=0 || locserv!=0;}
00083
00084 int receiveTimeout()const{return mrecvtimeout;}
00085 public slots:
00086 void registerInterface(const QString&,WInterface*);
00087 void registerStatic(const QString&,const QString&);
00088 void unregisterPath(const QString&);
00089 void register404(const QString&);
00090 void register400(const QString&);
00091 void setReceiveTimeout(int);
00092 void restrictSourceHosts(const QPair<QHostAddress,int>&);
00093 void enableDebugUrl(bool enable=true);
00094
00095 private slots:
00096 void newConnection();
00097 void handleConnection(QIODevice*);
00098 void handleRequest(WServerRequest,QIODevice*);
00099 private:
00100 void handleRequestHelper(WServerRequest,QIODevice*);
00101 QTcpServer*tcpserv;
00102 QLocalServer*locserv;
00103 QMap<QString,WInterface*>iface;
00104 QMap<QString,QString>statcontent;
00105 QString err404,err400;
00106 int mrecvtimeout;
00107 QPair<QHostAddress,int>sourcehost;
00108 bool mdebugenabled;
00109 };
00110
00111 #endif