00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef INC_MI32_HTTPSERVER_H
00029 #define INC_MI32_HTTPSERVER_H
00030
00031 #ifndef INC_MI32_HTTPCLIENT_H
00032 #include <mi32/httpclient.h>
00033 #endif
00034
00035 #ifndef INC_MI32_FILEPATH_H
00036 #include <mi32/filepath.h>
00037 #endif
00038
00039 #ifdef MISYSTEMDLL
00040 #define CLASSLIBEXPORT MI_DLLCLASSEXPORT
00041 #else
00042 #define CLASSLIBEXPORT MI_DLLCLASSIMPORT
00043 #endif
00044
00045
00046 class CLASSLIBEXPORT HTTPSERVER {
00047 public:
00048
00049 class PATH;
00050 class HANDLER;
00051 class FILEHANDLER;
00052 class UPLOADHANDLER;
00053 class CLIENT;
00054
00055 HTTPSERVER();
00056 virtual ~HTTPSERVER();
00057
00061 ERRVALUE AddListenSocket (
00062 const MISOCKET::ADDR& address
00063 );
00064
00071 ERRVALUE AddListenSocket (
00072 MISOCKET* sock,
00073 bool bTakeOwnership = true
00074 );
00075
00078 ERRVALUE AddMIMEType (
00079 const char* extn,
00080 const char* mimetype
00081 );
00082
00086 ERRVALUE AddHandler (
00087 HANDLER* handler
00088 );
00089
00093 ERRVALUE AddPath (
00094 PATH* path
00095 );
00096
00098 void GenerateStatusPage (
00099 MISTRING& mistr
00100 );
00101
00102
00103
00104
00105 const char* FindMIMEType (
00106 const FILEPATH& filepath
00107 );
00108
00111 PATH* FindPath (
00112 const HTTPMESSAGE& msg
00113 );
00114
00117 void Shutdown (
00118 );
00119
00120 private:
00121 #ifndef GENERATING_DOXYGEN_OUTPUT
00122 struct MIMEEXTN {
00123 char* extn;
00124 char* mime;
00125 };
00126
00127 class LISTENER;
00128 friend class LISTENER;
00129 friend class CLIENT;
00130 friend class PATH;
00131
00132
00133 void AddClient (
00134 CLIENT* client
00135 );
00136
00137
00138 void RemoveClient (
00139 CLIENT* client
00140 );
00141
00142
00143 void RemoveListener (
00144 LISTENER* listener
00145 );
00146 #endif
00147
00150 virtual HTTPSERVER::CLIENT* v_AllocateClient (
00151 MISOCKET* sock
00152 );
00153
00155 virtual void v_OnClientConnect (
00156 CLIENT* client
00157 );
00158
00161 virtual void v_OnClientDisconnect (
00162 CLIENT* client
00163 );
00164 #ifndef GENERATING_DOXYGEN_OUTPUT
00165
00166
00167 HTTPSERVER(const HTTPSERVER&);
00168 HTTPSERVER& operator=(const HTTPSERVER&);
00169
00170 static const MIMEEXTN s_BuiltInMIMETypes[];
00171 SIMPLE_ARRAY<LISTENER*> m_Listeners;
00172 SIMPLE_ARRAY<CLIENT*> m_Clients;
00173 SIMPLE_ARRAY<PATH*> m_Paths;
00174 SIMPLE_ARRAY<HANDLER*> m_Handlers;
00175 SIMPLE_ARRAY<MIMEEXTN> m_MIMETypes;
00176 bool m_bShuttingDown;
00177
00178 #endif
00179
00180 };
00181
00182
00183
00184
00189 class CLASSLIBEXPORT HTTPSERVER::PATH {
00190 public:
00191 PATH (
00192 HTTPSERVER& server,
00193 const char* virtualpath
00194 );
00195
00196 virtual ~PATH();
00197
00202 ERRVALUE AddHandler (
00203 HTTPSERVER::HANDLER* handler
00204 );
00205
00208 bool Matches (
00209 const char* path
00210 ) const;
00211
00212 HTTPSERVER& GetServer (
00213 );
00214
00215 const char* GetVirtualPath (
00216 ) const;
00217
00220 bool ProcessRequest (
00221 HTTPSERVER::CLIENT* client,
00222 const HTTPMESSAGE& request
00223 );
00224
00227 void SetMethodAllowed (
00228 HTTPMESSAGE::METHOD method,
00229 bool bIsAllowed = true
00230 );
00231
00232 private:
00233
00234 HTTPSERVER& m_Server;
00235 STRUTF8 m_VirtualPath;
00236 SIMPLE_ARRAY<HTTPSERVER::HANDLER*> m_Handlers;
00237 bool m_AllowedMethods[HTTPMESSAGE::METHOD_NUM_METHODS];
00238
00242 virtual bool v_ProcessRequest (
00243 HTTPSERVER::CLIENT* client,
00244 const HTTPMESSAGE& request
00245 );
00246
00247 };
00248
00249
00254 class CLASSLIBEXPORT HTTPSERVER::HANDLER {
00255 public:
00256 HANDLER (
00257 HTTPSERVER& server,
00258 const char* name
00259 );
00260
00261 virtual ~HANDLER();
00262
00263
00264 const char* GetName (
00265 );
00266
00267 HTTPSERVER& GetServer (
00268 );
00269
00274 int Matches (
00275 const HTTPMESSAGE& request
00276 ) const;
00277
00282 bool ProcessRequest (
00283 HTTPSERVER::CLIENT* client,
00284 const HTTPMESSAGE& request
00285 );
00286
00287
00288 bool CanHandleMethod (
00289 HTTPMESSAGE::METHOD method
00290 ) const;
00291
00292 protected:
00293
00294 private:
00295
00296
00297
00298
00299
00300 virtual bool v_CanHandleMethod (
00301 HTTPMESSAGE::METHOD method
00302 ) const = 0;
00303
00310 virtual int v_Matches (
00311 const HTTPMESSAGE& request
00312 ) const = 0;
00313
00318 virtual bool v_ProcessRequest (
00319 HTTPSERVER::CLIENT* client,
00320 const HTTPMESSAGE& request
00321 ) = 0;
00322
00323 HTTPSERVER& m_Server;
00324 const char* m_name;
00325
00326 };
00327
00328
00337 class CLASSLIBEXPORT HTTPSERVER::FILEHANDLER : public HTTPSERVER::HANDLER {
00338 public:
00339
00340 FILEHANDLER (
00341 HTTPSERVER& server,
00342 const FILEPATH& DocumentRoot
00343 );
00344
00345 virtual ~FILEHANDLER();
00346
00347 private:
00348 #ifndef GENERATING_DOXYGEN_OUTPUT
00349 virtual int v_Matches (
00350 const HTTPMESSAGE& request
00351 ) const;
00352
00353 virtual bool v_CanHandleMethod (
00354 HTTPMESSAGE::METHOD method
00355 ) const;
00356
00357 virtual bool v_ProcessRequest (
00358 HTTPSERVER::CLIENT* client,
00359 const HTTPMESSAGE& request
00360 );
00361
00362 FILEPATH m_DocumentRoot;
00363 #endif
00364 };
00365
00366
00376 class CLASSLIBEXPORT HTTPSERVER::UPLOADHANDLER : public HTTPSERVER::HANDLER {
00377 public:
00378
00379 UPLOADHANDLER (
00380 HTTPSERVER& server,
00381 const FILEPATH& DocumentRoot
00382 );
00383
00384 virtual ~UPLOADHANDLER();
00385
00386 private:
00387 #ifndef GENERATING_DOXYGEN_OUTPUT
00388 virtual int v_Matches (
00389 const HTTPMESSAGE& request
00390 ) const;
00391
00392 virtual bool v_CanHandleMethod (
00393 HTTPMESSAGE::METHOD method
00394 ) const;
00395
00396 virtual bool v_ProcessRequest (
00397 HTTPSERVER::CLIENT* client,
00398 const HTTPMESSAGE& request
00399 );
00400
00401 FILEPATH m_DocumentRoot;
00402 #endif
00403 };
00404
00405
00406
00407
00411 class CLASSLIBEXPORT HTTPSERVER::CLIENT : public HTTPCLIENT {
00412 public:
00413 CLIENT (
00414 HTTPSERVER& server,
00415 MISOCKET* sock
00416 );
00417
00418 ~CLIENT();
00419
00420
00421
00422 void SendErrorReply (
00423 HTTPMESSAGE::STATUS status,
00424 const HTTPMESSAGE& request,
00425 ERRVALUE err = 0
00426 );
00427
00428
00429 private:
00430
00431
00432
00433 void v_OnClose (
00434 );
00435
00436
00437
00438 void v_OnMessage (
00439 const HTTPMESSAGE&
00440 );
00441
00442 HTTPSERVER& m_Server;
00443 bool m_bDestroying;
00444 };
00445
00446
00447 #undef CLASSLIBEXPORT
00448
00449
00450 #endif // INC_MI32_HTTPSERVER_H