00001 #ifndef __si_web_httpserv_h__65934665_d2e9_4f6b_81d5_3dfcd6197554
00002 #define __si_web_httpserv_h__65934665_d2e9_4f6b_81d5_3dfcd6197554
00003
00013 #include <si_std/string.h>
00014 #include <si_std/listt.h>
00015 #include <pthread.h>
00016
00020 typedef struct sc_httpDocument sc_httpDocument;
00021 typedef struct sc_httpRequest sc_httpRequest;
00022 typedef struct sc_httpResponse sc_httpResponse;
00023 typedef struct sc_httpUpload sc_httpUpload;
00029 sm_listDecl(sc_httpDocument);
00030
00038 typedef struct sc_httpServer
00039 {
00040 int listenSock;
00041 int die[2];
00042 pthread_t serverThread;
00043 s_int32 started;
00044 s_uint16 port;
00046 sc_httpDocumentList documents;
00048 } sc_httpServer;
00049
00050
00051 sc_status sc_httpServer_construct(sc_httpServer* psrv, s_uint16 port);
00061 sc_status sc_httpServer_destruct(sc_httpServer* pserver);
00066 sc_status sc_httpServer_addDocument(sc_httpServer* psrv,
00067 sc_httpDocument* pdoc);
00077 sc_status sc_httpServer_start(sc_httpServer* psrv);
00085 sc_status sc_httpServer_stop(sc_httpServer* psrv);
00091 sc_status sc_httpResponse_write(sc_httpResponse* presp, const char* pstr);
00101 sc_status sc_httpResponse_writeBinary(sc_httpResponse* presp,
00102 const s_uint8* pbuff,
00103 s_uint32 buffSize);
00117 typedef enum sc_httpRequestType {
00118 sc_httpRequestType_GET = 1,
00119 sc_httpRequestType_PUT = 2,
00120 sc_httpRequestType_POST = 3,
00121 sc_httpRequestType_INV = 0
00122 } sc_httpRequestType;
00123
00126 typedef enum sc_httpRequest_argType {
00127 sc_httpRequest_argType_unknown = -1,
00128 sc_httpRequest_argType_normal = 0,
00129 sc_httpRequest_argType_upload = 1,
00130 } sc_httpRequest_argType;
00131
00132 const char* sc_httpRequest_getBody(const sc_httpRequest* preq);
00142 sc_httpRequestType sc_httpRequest_getRequestType(const sc_httpRequest* preq);
00150 int sc_httpRequest_getArgCount(const sc_httpRequest* preq);
00157 const char* sc_httpRequest_getArgName(const sc_httpRequest* preq,
00158 s_uint32 aidx);
00170 sc_httpRequest_argType sc_httpRequest_getArgType(const sc_httpRequest* preq,
00171 const char* argName);
00182 int sc_httpRequest_getArgTypeByIndex(const sc_httpRequest* preq,
00183 s_uint32 aidx);
00193 const char* sc_httpRequest_getArgValue(const sc_httpRequest* preq,
00194 const char* argName);
00208 const char* sc_httpRequest_getArgValueByIndex(const sc_httpRequest* preq,
00209 s_uint32 aidx);
00223 const sc_httpUpload*
00224 sc_httpRequest_getArgUploadValue(const sc_httpRequest* preq,
00225 const char* argName);
00241 const sc_httpUpload*
00242 sc_httpRequest_getArgUploadValueByIndex(const sc_httpRequest* preq,
00243 s_uint32 aidx);
00261 s_uint32 sc_httpUpload_getContentSize(const sc_httpUpload* upl);
00266 const char* sc_httpUpload_getContentType(const sc_httpUpload* upl);
00271 const char* sc_httpUpload_getContentFilename(const sc_httpUpload* upl);
00276 sc_status sc_httpUpload_getContent(const sc_httpUpload* upl,
00277 s_uint8* pOutBuf);
00286 typedef int (*sc_httpDocumentCallback)(const sc_httpRequest* req,
00287 sc_httpResponse* resp);
00288
00290 struct sc_httpDocument {
00291 char* name;
00292 sc_httpDocumentCallback callback;
00294 };
00295
00296 sc_status sc_httpDocument_construct(sc_httpDocument* doc, const char* name,
00297 sc_httpDocumentCallback callback);
00306 sc_status sc_httpDocument_constructCopy(sc_httpDocument* doc,
00307 sc_httpDocument* oth);
00315 sc_status sc_httpDocument_assign(sc_httpDocument* doc,
00316 sc_httpDocument* rhs);
00325 sc_status sc_httpDocument_destruct(sc_httpDocument* doc);
00332 #define sm_HTTP_DOC_FROM_BUFFER(filename, buffername) \
00333 int dump_##buffername (const sc_httpRequest* preq, sc_httpResponse* presp) \
00334 { \
00335 return sc_httpResponse_writeBinary(presp, buffername, sizeof(buffername)); \
00336 }\
00337 sc_httpDocument http_doc_##buffername = { filename, dump_##buffername }
00338
00339
00340 #endif
00341