Barracuda Application Server C/C++ Reference
NO
HttpServer.h
1/*
2 * ____ _________ __ _
3 * / __ \___ ____ _/ /_ __(_)___ ___ ___ / / ____ ____ _(_)____
4 * / /_/ / _ \/ __ `/ / / / / / __ `__ \/ _ \/ / / __ \/ __ `/ / ___/
5 * / _, _/ __/ /_/ / / / / / / / / / / / __/ /___/ /_/ / /_/ / / /__
6 * /_/ |_|\___/\__,_/_/ /_/ /_/_/ /_/ /_/\___/_____/\____/\__, /_/\___/
7 * /____/
8 *
9 * Barracuda Embedded Web-Server
10 *
11 ****************************************************************************
12 * HEADER
13 *
14 * $Id: HttpServer.h 5813 2026-06-15 10:15:50Z wini $
15 *
16 * COPYRIGHT: Real Time Logic LLC, 2003 - 2026
17 *
18 * This software is copyrighted by and is the sole property of Real
19 * Time Logic LLC. All rights, title, ownership, or other interests in
20 * the software remain the property of Real Time Logic LLC. This
21 * software may only be used in accordance with the terms and
22 * conditions stipulated in the corresponding license agreement under
23 * which the software has been supplied. Any unauthorized use,
24 * duplication, transmission, distribution, or disclosure of this
25 * software is expressly forbidden.
26 *
27 * This Copyright notice may not be removed or modified without prior
28 * written consent of Real Time Logic LLC.
29 *
30 * Real Time Logic LLC. reserves the right to modify this software
31 * without notice.
32 *
33 * http://www.realtimelogic.com
34 ****************************************************************************
35 *
36 *
37 */
38
39#define BASLIB_VER "5821"
40#define BASLIB_VER_NO 5821
41
74#ifndef __HttpServer_h
75#define __HttpServer_h
76#include "TargConfig.h"
77#include "HttpConnection.h"
78#include "DoubleList.h"
79#include "SoDisp.h"
80#include "SplayTree.h"
81#include "BaErrorCodes.h"
82#include "SplayTree.h"
83#include "BufPrint.h"
84#include "IoIntf.h"
85#include <string.h>
86#include <stddef.h>
87
88/* Used by examples */
89#ifndef BA_STACKSZ
90#define BA_STACKSZ 24000
91#endif
92
93
94/* This ID must match the ID in LoginKey.java */
95#define BA_COOKIE_ID "z9ZAqJtI"
96
97#ifndef __DOXYGEN__
98struct HttpRequest;
99struct HttpResponse;
100struct HttpPage;
101struct HttpServer;
102struct HttpSession;
103struct HttpLinkCon;
104struct HttpDir;
105struct AuthenticatedUser;
106struct UserIntf;
107struct CspReader;
108struct HttpCmdThreadPoolIntf;
109struct AuthUserList;
110struct AuthorizerIntf;
111struct AuthenticatorIntf;
112struct LHttpCommand;
113#endif
114
115
116/* NonBlockingSendBuf is used when sending asynchronous, non-blocking
117 data. A pointer to this buffer is stored in SoDispCon.sslData for
118 HTTP connections; this pointer is not used for anything else for a
119 non-secure socket connection. */
120typedef struct
121{
122 int cursor;
123 int bufLen;
124 int maxBufLen;
125 char buf[1];
126} NonBlockingSendBuf;
127
128
129#ifdef __cplusplus
130extern "C" {
131#endif
132BA_API struct AuthenticatedUser* AuthenticatedUser_get2(
133 struct HttpSession* session);
136BA_API void httpFmtDate(char* buf, U16 bufLen, BaTime t);
137
139#define httpUnescape(s) httpUnescapeInternal(s,FALSE)
140
142#define httpFormUnescape(s) httpUnescapeInternal(s,TRUE)
143
148BA_API char* httpUnescapeInternal(char* from, BaBool isForm);
149
153BA_API char* httpEscape(char* out, const char* in);
154#ifdef __cplusplus
155}
156#endif
157
158
159typedef void (*UserDefinedErrHandler)(BaFatalErrorCodes ecode1,
160 unsigned int ecode2,
161 const char* file,
162 int line);
163
164
190typedef void (*CspInit)(
191 struct HttpDir* cspRoot,struct CspReader* reader);
192 /* end of CSP */
194
195/* no longer used. included for compatibility.
196 */
197struct z_stream_s;
198typedef int (*ZlibInflateInit2)(struct z_stream_s* s, int windowBits,
199 const char *version, int stream_size);
200
201typedef int (*ZlibInflate)(struct z_stream_s* s, int flush);
202typedef int (*ZlibInflateEnd)(struct z_stream_s* s);
203
204
205#ifndef __DOXYGEN__
206
207typedef struct
208{
209 char* buf;
210 U16 size;
211 U16 index;
212} HttpAllocator;
213
214
217typedef struct HttpHeader
218{
219#ifdef __cplusplus
220 const char* name(HttpRequest* req);
221 const char* value(HttpRequest* req);
222#endif
223 U16 nameI;
224 U16 valueI;
225}HttpHeader;
226
227#ifdef __cplusplus
228extern "C" {
229#endif
230BA_API const char* HttpHeader_name(HttpHeader* o, struct HttpRequest* req);
231BA_API const char* HttpHeader_value(HttpHeader* o, struct HttpRequest* req);
232#ifdef __cplusplus
233}
234inline const char* HttpHeader::name(HttpRequest* req) {
235 return HttpHeader_name(this, req); }
236inline const char* HttpHeader::value(HttpRequest* req) {
237 return HttpHeader_value(this, req); }
238#endif
239
240#endif
241
242
243
244
245
246/*===========================================================================
247 *
248 * HttpInData
249 *---------------------------------------------------------------------------
250 * Description:
251 */
252
253#ifndef __DOXYGEN__
254
255typedef enum {
256 HttpInData_ParseHeader,
257 HttpInData_ReadBody,
258 HttpInData_ReadBodyAndParseUrlEncData
259} HttpInData_ParseState;
260#endif
261
262
265typedef struct HttpInData
266{
267#ifdef __cplusplus
270 const char* getBuf();
271
278 S32 getBufSize();
279#endif
280 HttpAllocator allocator;
281 struct HttpRequest* request;
282 U16 lineStartI;
283 U16 lineEndI;
284 S16 maxRequest;
285 U8 parseState; /* HttpInData_ParseState */
286 U8 overflow; /* Used for pipelined requests */
287} HttpInData;
288
289#define HttpAllocator_2Ptr(o, index) ((&(o)->buf[index]))
290#define HttpInData_lineStartPtr(o) \
291 HttpAllocator_2Ptr(&(o)->allocator,(o)->lineStartI)
292
293#define HttpInData_getBufSize(o) \
294 ((o)->lineStartI < (o)->allocator.index ? \
295 (o)->allocator.index-(o)->lineStartI : 0)
296
297#define HttpInData_getBuf(o) HttpInData_lineStartPtr(o)
298BaBool HttpInData_hasMoreData(HttpInData* o);
299
300#ifdef __cplusplus
301inline const char* HttpInData::getBuf() {
302 return HttpInData_getBuf(this); }
304 return HttpInData_getBufSize(this); }
305#endif
306
307
308
364typedef struct HttpParameter
365{
366#ifdef __cplusplus
369 static U32 calculateSize(struct HttpRequest* req);
370
374 static HttpParameter* clone(void* buf, struct HttpRequest* req);
375
384 const char* getParameter(const char* paramName);
385
386 private:
387 HttpParameter() {}
388#endif
389 U16 formLen;
391
392
393#ifdef __cplusplus
394extern "C" {
395#endif
396BA_API U32 HttpParameter_calculateSize(struct HttpRequest* req);
397BA_API HttpParameter* HttpParameter_clone(void* buf, struct HttpRequest* req);
398BA_API const char* HttpParameter_getParameter(
399 HttpParameter* o,const char* paramName);
400
401#ifdef __cplusplus
402}
404 return HttpParameter_calculateSize(req); }
405inline HttpParameter* HttpParameter::clone(void* buf, struct HttpRequest* req){
406 return HttpParameter_clone(buf, req); }
407inline const char* HttpParameter::getParameter(const char* paramName) {
408 return HttpParameter_getParameter(this, paramName); }
409#endif
410
411
440{
441#ifdef __cplusplus
446
453
455 void nextElement();
457 bool hasMoreElements();
459 const char* getName() const { return name; }
461 const char* getValue() const { return value; }
462 private:
463#endif
464 void* formElemBase;
465 U8* dataEntry;
466 U16 pos;
467 U16 formLen;
468 const char* name;
469 const char* value;
470
472
473#ifdef __cplusplus
474extern "C" {
475#endif
476
477BA_API int HttpParameterIterator_constructor(
478 HttpParameterIterator* o, struct HttpRequest* req);
479BA_API int HttpParameterIterator_constructor2(HttpParameterIterator* o,
480 HttpParameter* param);
481BA_API void HttpParameterIterator_nextElement(HttpParameterIterator* o);
482#define HttpParameterIterator_hasMoreElements(o) ((o)->name != 0)
483#define HttpParameterIterator_getName(o) (o)->name
484#define HttpParameterIterator_getValue(o) (o)->value
485
486
487#ifdef __cplusplus
488}
489inline HttpParameterIterator::HttpParameterIterator(HttpRequest* req) {
490 HttpParameterIterator_constructor(this, req); }
491inline HttpParameterIterator::HttpParameterIterator(HttpParameter* param) {
492 HttpParameterIterator_constructor2(this, param); }
494 HttpParameterIterator_nextElement(this); }
495#endif
496
497
523typedef struct HttpCookie
524{
525#ifdef __cplusplus
526 ~HttpCookie();
527
530 const char* getComment() const { return comment; }
531
533 const char* getDomain() const { return domain; }
534
538 BaTime getMaxAge() const { return maxAge; }
539
541 const char* getName() const { return name; }
542
545 const char* getPath() const { return path; }
546
550 bool getSecure() const { return secure ? true : false; }
551
555 bool getHttpOnly() const { return httpOnly ? true : false; }
556
558 const char* getValue() const { return value; }
559
561 void setComment(const char* purpose);
562
564 void setDomain(const char* pattern);
565
573 void setMaxAge(BaTime expiry);
582 void deleteCookie();
583
585 void setPath(const char* uri);
586
590 void setSecure(bool flag);
591
601 void setHttpOnly(bool flag);
602
604 void setValue(const char* newValue);
605
606#if 0
608 int getVersion() const { return version; }
609 /* Sets the version of the cookie protocol this cookie complies with. */
610 void setVersion(int v);
611#endif
612
618 void activate();
619 private:
620 HttpCookie();
621#endif
622 struct HttpCookie* next;
623 char* comment;
624 char* domain;
625 char* name;
626 char* path;
627 char* value;
628 BaTime maxAge;
629 int version;
630 BaBool secure;
631 BaBool httpOnly;
632 BaBool deleteCookieFlag;
633 BaBool activateFlag; /* The cookie will be sent to the client
634 * if this flag is true */
636
637#ifdef __cplusplus
638extern "C" {
639#endif
640BA_API void HttpCookie_destructor(HttpCookie* o);
641BA_API const char* HttpCookie_getComment(HttpCookie* o);
642BA_API const char* HttpCookie_getDomain(HttpCookie* o);
643BA_API BaTime HttpCookie_getMaxAge(HttpCookie* o);
644BA_API const char* HttpCookie_getName(HttpCookie* o);
645BA_API const char* HttpCookie_getPath(HttpCookie* o);
646BA_API BaBool HttpCookie_getSecure(HttpCookie* o);
647BA_API BaBool HttpCookie_getHttpOnly(HttpCookie* o);
648BA_API const char* HttpCookie_getValue(HttpCookie* o);
649BA_API void HttpCookie_setComment(HttpCookie* o, const char* purpose);
650BA_API void HttpCookie_setDomain(HttpCookie* o, const char* pattern);
651BA_API void HttpCookie_setMaxAge(HttpCookie* o, BaTime expiry);
652#define HttpCookie_deleteCookie(o) (o)->deleteCookieFlag = TRUE;
653BA_API void HttpCookie_setPath(HttpCookie* o, const char* uri);
654BA_API void HttpCookie_setSecure(HttpCookie* o, BaBool flag);
655BA_API void HttpCookie_setHttpOnly(HttpCookie* o, BaBool flag);
656BA_API void HttpCookie_setValue(HttpCookie* o, const char* newValue);
657
658#if 0
659int HttpCookie_getVersion(HttpCookie* o);
660void HttpCookie_setVersion(HttpCookie* o, int v);
661#endif
662
663BA_API void HttpCookie_activate(HttpCookie* o);
664#ifdef __cplusplus
665}
666inline HttpCookie::HttpCookie() { baAssert(0); }
667inline HttpCookie::~HttpCookie() { HttpCookie_destructor(this); }
668inline void HttpCookie::setComment(const char* purpose) {
669 HttpCookie_setComment(this, purpose); }
670inline void HttpCookie::setDomain(const char* pattern) {
671 HttpCookie_setDomain(this, pattern); }
672inline void HttpCookie::setMaxAge(BaTime expiry) {
673 HttpCookie_setMaxAge(this, expiry); }
675 HttpCookie_deleteCookie(this); }
676inline void HttpCookie::setPath(const char* uri) {
677 HttpCookie_setPath(this, uri); }
678inline void HttpCookie::setSecure(bool flag) {
679 HttpCookie_setSecure(this, flag ? TRUE : FALSE); }
680inline void HttpCookie::setHttpOnly(bool flag) {
681 HttpCookie_setHttpOnly(this, flag ? TRUE : FALSE); }
682inline void HttpCookie::setValue(const char* newValue) {
683 HttpCookie_setValue(this, newValue); }
684#if 0
685inline void HttpCookie::setVersion(int v) {
686 HttpCookie_setVersion(this, v); }
687#endif
688inline void HttpCookie::activate() {
689 HttpCookie_activate(this); }
690#endif
691
692
696typedef struct HttpStdHeaders
697{
698#ifdef __cplusplus
702 const char* getConnection();
703
711 const char* getHost();
712
718 const char* getDomain();
719
723 const char* getContentType();
724
727 SBaFileSize getContentLength();
728#endif
729 HttpInData* inData;
730 char* domain;
731 BaFileSize contentLength;
732 U16 connectionHOffs;
733 U16 hostHOffs;
734 U16 contentTypeHOffs;
736
737#ifdef __cplusplus
738extern "C" {
739#endif
740BA_API const char* HttpStdHeaders_zzGetValFromOffs(
741 HttpStdHeaders* o, U16 offset);
742BA_API const char* HttpStdHeaders_getDomain(HttpStdHeaders* o);
743#define HttpStdHeaders_getConnection(o) \
744 HttpStdHeaders_zzGetValFromOffs(o,(o)->connectionHOffs)
745#define HttpStdHeaders_getHost(o) \
746 HttpStdHeaders_zzGetValFromOffs(o,(o)->hostHOffs)
747#define HttpStdHeaders_getContentType(o) \
748 HttpStdHeaders_zzGetValFromOffs(o,(o)->contentTypeHOffs)
749#define HttpStdHeaders_getContentLength(o) (o)->contentLength
750
751#ifdef __cplusplus
752}
753inline const char* HttpStdHeaders::getConnection() {
754 return HttpStdHeaders_getConnection(this); }
755inline const char* HttpStdHeaders::getHost() {
756 return HttpStdHeaders_getHost(this); }
757inline const char* HttpStdHeaders::getDomain() {
758 return HttpStdHeaders_getDomain(this); }
759inline const char* HttpStdHeaders::getContentType() {
760 return HttpStdHeaders_getContentType(this); }
762 return HttpStdHeaders_getContentLength(this); }
763
764#endif
765
766
767
768 /*Do not change the HttpMethod type without checking tables in Httpserver.c*/
769
780typedef enum {
781 HttpMethod_Connect =0x00001,
782 HttpMethod_Get =0x00002,
783 HttpMethod_Head =0x00004,
784 HttpMethod_Options =0x00008,
785
786 HttpMethod_Patch =0x00010,
787 HttpMethod_Post =0x00020,
788 HttpMethod_Put =0x00040,
789 HttpMethod_Trace =0x00080,
790
791 /* WebDAV */
792 HttpMethod_Copy =0x00100,
793 HttpMethod_Delete =0x00200,
794 HttpMethod_Lock =0x00400,
795 HttpMethod_Move =0x00800,
796
797 HttpMethod_Mkcol =0x01000,
798 HttpMethod_Propfind =0x02000,
799 HttpMethod_Proppatch =0x04000,
800 HttpMethod_Unlock =0x08000,
801
802 HttpMethod_Unknown =0x10000 /* Must be last */
803} HttpMethod;
804
805
806/* Convert an HTTP method from string value to the type HttpMethod */
807BA_API HttpMethod HttpMethod_a2m(const char* str);
808
809
810
815typedef struct HttpRequest
816{
817#ifdef __cplusplus
818
870 int checkMethods(HttpResponse* resp, U32 methods, bool addDefault=TRUE);
871
884 BaBool checkTime(struct HttpResponse* resp, BaTime time);
885
889
892 const char* getRequestURI();
893
906 const char* getRequestURL(bool forceHttps=false);
907
912
914 const char* getVersion();
915
923 const char* getHeaderValue(const char* name);
924
928 HttpCookie* getCookie(const char* name);
929
936
941 const char* getMethod();
942
946 static const char* getMethod(HttpMethod method);
947
958 const char* getParameter(const char* paramName);
959
964 int wsUpgrade();
965
981 HttpHeader* getHeaders(int* len);
982
983
984
1019#ifndef NO_HTTP_SESSION
1020 HttpSession* getSession(BaBool create=true);
1021#endif
1025
1029
1033
1037
1040
1041
1042 int setUserObj(void* userObj, bool overwrite=false);
1043 void* getUserObj();
1044
1045#endif
1046 HttpStdHeaders stdH;
1047 HttpAllocator headerAlloc;
1048 HttpAllocator formAlloc;
1049 HttpInData inData;
1050 struct HttpServer* server;
1051 void* userObj;
1052 struct HttpSession* session;
1053 HttpMethod methodType;
1054 U16 pathI;
1055 U16 versionI;
1056 U16 headersI;
1057 U16 headerLen;
1058 U16 formsI;
1059 U16 formLen;
1060 BaBool postDataConsumed; /* Set by MultipartUpload and HttpRecData */
1062
1063#ifdef __cplusplus
1064extern "C" {
1065#endif
1066BA_API int HttpRequest_checkMethods(HttpRequest* o, struct HttpResponse* resp,
1067 U32 methods, BaBool addDefault);
1068BA_API int HttpRequest_checkOptions(
1069 HttpRequest* o, struct HttpResponse* resp, int optLen, ...);
1070#define HttpRequest_getAuthenticatedUser(o) \
1071 AuthenticatedUser_get2(HttpRequest_getSession(o,FALSE))
1072#define HttpRequest_getConnection(o) HttpRequest_getCommand(o)->con
1073#define HttpRequest_getMethodType(o) (o)->methodType
1074#define HttpRequest_getMethod(o) HttpRequest_getMethod2((o)->methodType)
1075BA_API const char* HttpRequest_getMethod2(HttpMethod method);
1076#define HttpRequest_getServer(o) (o)->server
1077#define HttpRequest_getResponse(o) (&HttpRequest_getCommand(o)->response)
1078BA_API struct HttpCommand* HttpRequest_getCommand(HttpRequest*);
1079BA_API BaBool HttpRequest_checkTime(
1080 HttpRequest* o, struct HttpResponse* resp, BaTime time);
1081BA_API const char* HttpRequest_getRequestURI(HttpRequest* o);
1082BA_API const char* HttpRequest_getRequestURL(HttpRequest* o,BaBool forceHttps);
1083#define HttpRequest_getStdHeaders(o) (&(o)->stdH)
1084BA_API const char* HttpRequest_getVersion(HttpRequest* o);
1085BA_API const char* HttpRequest_getHeaderValue(HttpRequest* o,const char* name);
1086#define HttpRequest_getNoOfParameters(o) (o)->formLen
1087BA_API HttpCookie* HttpRequest_getCookie(HttpRequest* o, const char* name);
1088#define HttpRequest_getUserObj(o) (o)->userObj
1089BA_API int HttpRequest_setUserObj(
1090 HttpRequest* o, void* userObj, BaBool overwrite);
1091#define HttpRequest_getBuffer(o) (&(o)->inData)
1092BA_API const char* HttpRequest_getParameter(
1093 HttpRequest* o, const char* paramName);
1094BA_API HttpHeader* HttpRequest_getHeaders(HttpRequest* o, int* len);
1095BA_API int HttpRequest_wsUpgrade(HttpRequest* o);
1096BA_API BaBool HttpRequest_enableKeepAlive(HttpRequest* o);
1097BA_API int HttpRequest_pushBackData(HttpRequest* o);
1098#ifndef NO_HTTP_SESSION
1099BA_API struct HttpSession* HttpRequest_getSession(
1100 HttpRequest* o, BaBool create);
1101BA_API struct HttpSession* HttpRequest_session(
1102 HttpRequest* o, const char* val, size_t len, int set);
1103#endif
1104#ifdef __cplusplus
1105}
1106
1108 U32 methods, bool addDefault){
1109 return HttpRequest_checkMethods(this,resp,
1110 methods, addDefault ? TRUE : FALSE);}
1111
1112inline BaBool HttpRequest::checkTime(struct HttpResponse* resp, BaTime time) {
1113 return HttpRequest_checkTime(this, resp, time); }
1115 return HttpRequest_getAuthenticatedUser(this); }
1117 return HttpRequest_getMethodType(this); }
1118inline const char* HttpRequest::getMethod() {
1119 return HttpRequest_getMethod(this); }
1120inline const char* HttpRequest::getMethod(HttpMethod method) {
1121 return HttpRequest_getMethod2(method); }
1123 return HttpRequest_getServer(this); }
1124inline const char* HttpRequest::getRequestURI() {
1125 return HttpRequest_getRequestURI(this); }
1126inline const char* HttpRequest::getRequestURL(bool forceHttps) {
1127 return HttpRequest_getRequestURL(this, forceHttps); }
1129 return HttpRequest_getStdHeaders(this); }
1130inline const char* HttpRequest::getVersion() {
1131 return HttpRequest_getVersion(this); }
1132inline const char* HttpRequest::getHeaderValue(const char* name) {
1133 return HttpRequest_getHeaderValue(this, name); }
1134inline HttpCookie* HttpRequest::getCookie(const char* name) {
1135 return HttpRequest_getCookie(this, name); }
1136inline const char* HttpRequest::getParameter(const char* paramName) {
1137 return HttpRequest_getParameter(this, paramName); }
1139 return HttpRequest_wsUpgrade(this);
1140}
1141inline HttpHeader* HttpRequest::getHeaders(int* len) {
1142 return HttpRequest_getHeaders(this, len); }
1143inline int HttpRequest::setUserObj(void* userObj, bool overwrite) {
1144 return HttpRequest_setUserObj(this, userObj, overwrite); }
1145inline void* HttpRequest::getUserObj() {
1146 return HttpRequest_getUserObj(this); }
1147#ifndef NO_HTTP_SESSION
1148inline HttpSession* HttpRequest::getSession(BaBool create) {
1149 return HttpRequest_getSession(this, create); }
1150#endif
1152 return HttpParameterIterator_hasMoreElements(this); }
1154 return HttpRequest_getBuffer(this); }
1155#endif
1156
1157
1158#ifndef __DOXYGEN__
1159
1160typedef struct
1161{
1162 HttpAllocator data;
1163 U16 maxResponseHeader;
1164} NameValMM;
1165
1166
1167typedef struct
1168{
1169 U8 major;
1170 U8 minor;
1171} HttpProtocol;
1172
1173#endif
1174
1185typedef struct HttpResponse
1186{
1187#ifdef __cplusplus
1188
1191 U32 byteCount();
1192
1193
1197 HttpCookie* createCookie(const char* name);
1198
1209 const char* containsHeader(const char* name);
1210
1219 const char* encodeRedirectURL(const char* pathName);
1220
1230 const char* encodeRedirectURLWithParam(const char* pathName);
1231
1238 const char* encodeUrl(const char* path);
1239
1244 int flush();
1245
1270 int forward(const char* path);
1271
1291 int redirect(const char* path);
1292
1293
1297
1301
1302
1318 int include(const char* path);
1319
1324 bool committed() const;
1325
1329 bool isForward() const;
1330
1333 bool isInclude() const;
1334
1338 bool initial() const;
1339
1343 int resetHeaders();
1344
1349 int resetBuffer();
1350
1362 int sendError(int eCode);
1363
1377 int sendError(int eCode, const char* msg);
1378
1384 int sendBufAsError(int eCode);
1385
1391 int sendBufAsTxtError(int eCode);
1392
1393
1400 int fmtError(int eCode, const char* fmt, ...);
1401
1419 int sendRedirect(const char* url);
1420
1432 int redirect2TLS();
1433
1439 int setContentLength(BaFileSize len);
1440
1446 int setContentType(const char* type);
1447
1457 int setDateHeader(const char* name, BaTime time);
1458
1479 int setHeader(const char* name, const char* value, bool replace=true);
1480
1486 int setMaxAge(BaTime seconds);
1487
1488
1521 char* fmtHeader(const char* name, int valueLen, bool replace=true);
1522
1523
1538 void setStatus(int statusCode);
1539
1543 int printf(const char* fmt, ...);
1544
1552
1561 int write(const void* data, int len, int useBuffering=TRUE);
1562
1570 int write(const char* data, int useBuffering=TRUE);
1571
1576 int send(const void* data, int len);
1577
1584 int setDefaultHeaders();
1585
1605 int setResponseBuf(BufPrint* buf, bool useDefBuffer=true);
1606
1610 int removeResponseBuf();
1611
1612
1613 int setUserObj(void* userObj, bool overwrite=false);
1614#endif
1615 NameValMM nameValMM;
1616 BufPrint headerPrint;
1617 BufPrint defaultBodyPrint;
1618 BufPrint* bodyPrint;
1619 struct HttpDir* currentDir;
1620 char* encodedURL;
1621 char* encodedRedirectURL;
1622 HttpCookie* cookieList;
1623 void* userObj;
1624 int statusCode;
1625 U32 msgLen; /* Used if request is of type HEAD, count total msg len */
1626 HttpProtocol protocol;
1627 U16 includeCounter;
1628 U16 forwardCounter;
1629 char headerSent;
1630 char printAndWriteInitialized;
1631 char useChunkTransfer;
1633
1634#ifdef __cplusplus
1635extern "C" {
1636#endif
1637BA_API HttpCookie* HttpResponse_createCookie(
1638 struct HttpResponse* o,const char* name);
1639BA_API const char* HttpResponse_containsHeader(
1640 HttpResponse* o, const char* name);
1641BA_API int HttpResponse_dataAdded(HttpResponse* o, U32 size);
1642#define HttpResponse_byteCount(o) ((o)->msgLen + (o)->bodyPrint->cursor)
1643BA_API const char* HttpResponse_encodeRedirectURL(
1644 HttpResponse* o, const char* pathName);
1645BA_API const char* HttpResponse_encodeRedirectURLWithParamOrSessionURL(
1646 HttpResponse* o,const char* path,BaBool setUrlCookie);
1647#define HttpResponse_encodeRedirectURLWithParam(o, path) \
1648 HttpResponse_encodeRedirectURLWithParamOrSessionURL(o, path, FALSE)
1649#define HttpResponse_encodeSessionURL(o, path) \
1650 HttpResponse_encodeRedirectURLWithParamOrSessionURL(o, path, TRUE)
1651BA_API const char* HttpResponse_encodeUrl(HttpResponse* o, const char* path);
1652BA_API int HttpResponse_flush(HttpResponse* o);
1653#define HttpResponse_forward(o,path) HttpResponse_incOrForward(o,path,FALSE)
1654#define HttpResponse_getConnection(o) HttpResponse_getCommand(o)->con
1655#define HttpResponse_getRequest(o) (&HttpResponse_getCommand(o)->request)
1656BA_API struct HttpCommand* HttpResponse_getCommand(HttpResponse*);
1657#define HttpResponse_getBuf(o) (o)->bodyPrint->buf
1658#define HttpResponse_getBufSize(o) (o)->bodyPrint->bufSize
1659#define HttpResponse_getBufOffs(o) \
1660 ((o)->bodyPrint->buf + (o)->bodyPrint->cursor)
1661#define HttpResponse_getRemBufSize(o) \
1662 ((o)->bodyPrint->bufSize - (o)->bodyPrint->cursor)
1663#define HttpResponse_getUserObj(o) (o)->userObj
1664BA_API int HttpResponse_incOrForward(
1665 HttpResponse* o, const char* path, BaBool isInc);
1666BA_API int HttpResponse_redirect(HttpResponse* o, const char* path);
1667#define HttpResponse_include(o,path) HttpResponse_incOrForward(o,path,TRUE)
1668#define HttpResponse_isChunkTransfer(o) (o)->useChunkTransfer
1669#define HttpResponse_committed(o) (o)->headerSent
1670#define HttpResponse_isForward(o) ((o)->forwardCounter != 0)
1671#define HttpResponse_isInclude(o) ((o)->includeCounter != 0)
1672#define HttpResponse_initial(o) (!HttpResponse_isForward(o) && \
1673 !HttpResponse_isInclude(o))
1674BA_API int HttpResponse_setResponseBuf(
1675 HttpResponse* o,BufPrint* buf,BaBool useDefBuffer);
1676BA_API int HttpResponse_removeResponseBuf(HttpResponse* o);
1677
1678BA_API int HttpResponse_resetHeaders(HttpResponse* o);
1679BA_API int HttpResponse_resetBuffer(HttpResponse* o);
1680BA_API int HttpResponse_sendError1(HttpResponse* o, int eCode);
1681BA_API int HttpResponse_sendError2(HttpResponse* o,int eCode,const char* msg);
1682BA_API int HttpResponse_sendBufAsError(HttpResponse* o,int eCode);
1683BA_API int HttpResponse_sendBufAsTxtError(HttpResponse* o,int eCode);
1684BA_API int HttpResponse_fmtVError(
1685 HttpResponse* response,
1686 int eCode,
1687 const char* fmt,
1688 va_list varg);
1689BA_API int HttpResponse_fmtError(
1690 HttpResponse* response,
1691 int eCode,
1692 const char* fmt, ...);
1693BA_API int HttpResponse_sendRedirect(HttpResponse* o, const char* url);
1694BA_API int HttpResponse_sendRedirectI(
1695 HttpResponse* o, const char* url, int status);
1696BA_API int HttpResponse_redirect2TLS(HttpResponse* o);
1697#define HttpResponse_forceHttps HttpResponse_redirect2TLS /* Backw. comp. */
1698
1699#define HttpResponse_setBufPos(o, pos) (o)->bodyPrint->cursor = pos
1700BA_API int HttpResponse_setContentLength(HttpResponse* o, BaFileSize len);
1701BA_API int HttpResponse_setContentType(HttpResponse* o, const char* type);
1702BA_API int HttpResponse_checkContentType(HttpResponse* o, const char* type);
1703BA_API int HttpResponse_setDateHeader(
1704 HttpResponse* o, const char* name, BaTime t);
1705BA_API int HttpResponse_setHeader(
1706 HttpResponse* o,const char* name,const char* value, BaBool replace);
1707BA_API int HttpResponse_setMaxAge(HttpResponse* response, BaTime seconds);
1708BA_API char* HttpResponse_fmtHeader(
1709 HttpResponse* o, const char* name, int valueLen, BaBool replace);
1710BA_API int HttpResponse_setStatus(HttpResponse* o, int eCode);
1711BA_API int HttpResponse_vprintf(
1712 HttpResponse* o, const char* fmt, va_list argList);
1713BA_API int HttpResponse_printf(HttpResponse* o, const char* fmt, ...);
1714BA_API int HttpResponse_write(HttpResponse* o, const void* data, int len,
1715 int useBuffering);
1716BA_API BufPrint* HttpResponse_getWriter(HttpResponse* o);
1717BA_API int HttpResponse_send(HttpResponse* o, const void* data, int len);
1718BA_API int HttpResponse_setDefaultHeaders(HttpResponse* o);
1719BA_API int HttpResponse_downgrade(HttpResponse* o);
1720BA_API int HttpResponse_setUserObj(
1721 HttpResponse* o,void* userObj,BaBool overwrite);
1722BA_API int HttpResponse_printAndWriteInit(HttpResponse* o);
1723BA_API int HttpResponse_send100Continue(HttpResponse* o);
1724BA_API int HttpResponse_setChunkEncoding(HttpResponse* o);
1725BA_API const char* HttpResponse_getRespData(HttpResponse* o, int* len);
1726#define HttpResponse_getStatus(o) (o)->statusCode
1727#ifdef __cplusplus
1728}
1729inline HttpCookie* HttpResponse::createCookie(const char* name) {
1730 return HttpResponse_createCookie(this, name); }
1731inline const char* HttpResponse::containsHeader(const char* name) {
1732 return HttpResponse_containsHeader(this, name); }
1734 return HttpResponse_byteCount(this); }
1735inline const char* HttpResponse::encodeRedirectURL(const char* pathName) {
1736 return HttpResponse_encodeRedirectURL(this, pathName); }
1737inline const char* HttpResponse::encodeRedirectURLWithParam(const char* p) {
1738 return HttpResponse_encodeRedirectURLWithParam(this, p); }
1739inline const char* HttpResponse::encodeUrl(const char* path) {
1740 return HttpResponse_encodeUrl(this, path); }
1742 return HttpResponse_flush(this); }
1743inline int HttpResponse::forward(const char* path) {
1744 return HttpResponse_forward(this, path); }
1745inline int HttpResponse::redirect(const char* path) {
1746 return HttpResponse_redirect(this, path); }
1747inline int HttpResponse::include(const char* path) {
1748 return HttpResponse_include(this, path); }
1749inline bool HttpResponse::committed() const {
1750 return HttpResponse_committed(this) ? true : false; }
1751inline bool HttpResponse::isForward() const {
1752 return HttpResponse_isForward(this) ? true : false; }
1753inline bool HttpResponse::isInclude() const {
1754 return HttpResponse_isInclude(this) ? true : false; }
1755inline bool HttpResponse::initial() const {
1756 return HttpResponse_initial(this) ? true : false; }
1757inline int HttpResponse::setResponseBuf(BufPrint* buf, bool useDefBuffer) {
1758 return HttpResponse_setResponseBuf(this, buf, useDefBuffer?TRUE:FALSE); }
1760 return HttpResponse_removeResponseBuf(this); }
1762 return HttpResponse_resetHeaders(this); }
1764 return HttpResponse_resetBuffer(this); }
1765inline int HttpResponse::sendError(int eCode) {
1766 return HttpResponse_sendError1(this, eCode); }
1767inline int HttpResponse::sendError(int eCode, const char* msg) {
1768 return HttpResponse_sendError2(this, eCode, msg); }
1769inline int HttpResponse::sendBufAsError(int eCode) {
1770 return HttpResponse_sendBufAsError(this, eCode); }
1771inline int HttpResponse::sendBufAsTxtError(int eCode) {
1772 return HttpResponse_sendBufAsTxtError(this,eCode);}
1773inline int HttpResponse::fmtError(int eCode,const char* fmt,...) {
1774 int retv; va_list varg;
1775 va_start(varg, fmt);
1776 retv = HttpResponse_fmtVError(this, eCode, fmt, varg);
1777 va_end(varg);
1778 return retv; }
1779inline int HttpResponse::sendRedirect(const char* url) {
1780 return HttpResponse_sendRedirect(this, url); }
1782 return HttpResponse_redirect2TLS(this); }
1783inline int HttpResponse::setContentLength(BaFileSize len) {
1784 return HttpResponse_setContentLength(this, len); }
1785inline int HttpResponse::setContentType(const char* type) {
1786 return HttpResponse_setContentType(this, type); }
1787inline int HttpResponse::setDateHeader(const char* name, BaTime t) {
1788 return HttpResponse_setDateHeader(this, name, t); }
1790 const char* name, const char* value, bool replace) {
1791 return HttpResponse_setHeader(this,name, value, replace?TRUE:FALSE); }
1792inline int HttpResponse::setMaxAge(BaTime seconds) {
1793 return HttpResponse_setMaxAge(this, seconds); }
1795 const char* name, int valueLen, bool replace) {
1796 return HttpResponse_fmtHeader(this, name, valueLen, replace?TRUE:FALSE); }
1797inline void HttpResponse::setStatus(int eCode) {
1798 HttpResponse_setStatus(this, eCode);}
1799
1800inline int HttpResponse::printf(const char* fmt, ...) {
1801 int retv; va_list varg; va_start(varg, fmt);
1802 retv = HttpResponse_vprintf(this, fmt, varg); va_end(varg); return retv;}
1803inline int HttpResponse::write(const char* data, int useBuffering) {
1804 return HttpResponse_write(this, data, iStrlen(data), useBuffering); }
1806 return HttpResponse_getWriter(this); }
1807inline int HttpResponse::write(const void* data, int len, int useBuffering){
1808 return HttpResponse_write(this, data, len, useBuffering); }
1809inline int HttpResponse::send(const void* data, int len) {
1810 return HttpResponse_send(this, data, len); }
1812 return HttpResponse_setDefaultHeaders(this); }
1813inline int HttpResponse::setUserObj(void* userObj, bool overwrite) {
1814 return HttpResponse_setUserObj(this, userObj, overwrite); }
1815
1816#endif
1817
1823typedef struct HttpCommand
1824{
1825#ifdef __cplusplus
1826
1830
1834
1838 struct HttpConnection* getConnection();
1839
1841 struct HttpServer* getServer();
1842
1843 HttpCommand() {}
1844#endif
1845 DoubleLink super;
1846#ifdef __cplusplus
1847 public:
1848#endif
1849 HttpRequest request;
1850 HttpResponse response;
1851 struct HttpConnection* con;
1852 struct LHttpCommand* lcmd; /* Used by LSP plugin */
1853 BaTime requestTime;
1854 BaBool runningInThread;
1856
1857#define HttpCommand_getRequest(o) (&(o)->request)
1858#define HttpCommand_getResponse(o) (&(o)->response)
1859#define HttpCommand_getConnection(o) (o)->con
1860#define HttpCommand_getServer(o) HttpConnection_getServer((o)->con)
1861#ifdef __cplusplus
1863 return HttpCommand_getRequest(this); }
1865 return HttpCommand_getResponse(this); }
1867 return HttpCommand_getConnection(this); }
1869 return HttpCommand_getServer(this);
1870}
1871#endif
1872
1873
1874#ifndef NO_HTTP_SESSION
1875
1876#ifndef __DOXYGEN__
1879#endif
1880
1888 struct HttpSessionAttribute* o);
1889
1918{
1919#ifdef __cplusplus
1925 HttpSessionAttribute(const char* name,
1927
1931#endif
1932 struct HttpSessionAttribute* next;
1933 struct HttpSession* session;
1935 char* name;
1937
1938#ifdef __cplusplus
1939extern "C" {
1940#endif
1941
1942BA_API void HttpSessionAttribute_constructor(
1944 const char* name,
1946BA_API void HttpSessionAttribute_destructor(HttpSessionAttribute* o);
1947#define HttpSessionAttribute_getSession(o) (o)->session
1948#ifdef __cplusplus
1949}
1951 const char* name,
1953 HttpSessionAttribute_constructor(this, name, d); }
1955 return HttpSessionAttribute_getSession(this); }
1956
1957#endif
1958
1964typedef struct HttpSession
1965{
1966#ifdef __cplusplus
1967
1968 void *operator new(size_t s) { return ::baMalloc(s); }
1969 void operator delete(void* d) { if(d) ::baFree(d); }
1970 void *operator new(size_t, void *place) { return place; }
1971 void operator delete(void*, void *) { }
1972
1987 void terminate();
1988
1992 HttpSessionAttribute* getAttribute(const char* name);
1993
1998
2004
2009
2012
2015 int removeAttribute(const char* name);
2016
2020
2024 void setMaxInactiveInterval(BaTime interval);
2025
2031 void incrRefCntr();
2032
2038 void decrRefCntr();
2039
2043 U32 getId();
2044
2048
2051 U32 getUseCounter();
2052
2053
2054 void incrementLock();
2055 void decrementLock();
2056
2057 HttpSession() {}
2058 private:
2059#endif
2060 SplayTreeNode super; /* inherits from SplayTreeNode */
2061 DoubleLink dlink;
2062 HttpSockaddr peer;
2063 HttpSessionAttribute* attrList;
2064 struct HttpSessionContainer* container;
2065 BaTime creationTime;
2066 BaTime lastAccessedTime;
2067 BaTime maxInactiveInterval;
2068 U32 sesrnd1; /* Session random number 1 & 2 */
2069 U32 sesrnd2; /* entropy id+sesrnd1+sesrnd2=96 bits */
2070 U32 useCounter;
2071 int refCounter;
2072 U16 lockCounter;
2073 U8 termPending; /* TRUE if in termination list */
2075
2076
2077#ifdef __cplusplus
2078extern "C" {
2079#endif
2080BA_API HttpSessionAttribute* HttpSession_getAttribute(HttpSession* o,
2081 const char* name);
2082BA_API BaTime HttpSession_getCreationTime(HttpSession* o);
2083BA_API BaTime HttpSession_getLastAccessedTime(HttpSession* o);
2084BA_API BaTime HttpSession_getMaxInactiveInterval(HttpSession* o);
2085BA_API struct HttpServer* HttpSession_getServer(HttpSession* o);
2086BA_API void HttpSession_terminate(HttpSession* o);
2087BA_API BaBool HttpSession_isNew(HttpSession* o);
2088BA_API int HttpSession_removeAttribute(HttpSession* o, const char* name);
2089BA_API int HttpSession_setAttribute(HttpSession* o,
2090 HttpSessionAttribute* value);
2091BA_API void HttpSession_setMaxInactiveInterval(HttpSession* o,BaTime interval);
2092#define HttpSession_incrRefCntr(o) (o)->refCounter++
2093BA_API void HttpSession_decrRefCntr(HttpSession* o);
2094#define HttpSession_incrementLock(o) (o)->lockCounter++
2095#define HttpSession_decrementLock(o) do {\
2096 baAssert((o)->lockCounter > 0);\
2097 (o)->lockCounter--; } while(0)
2098BA_API int HttpSession_fmtSessionId(HttpSession* o, U8* buf, size_t bufSize);
2099#define HttpSession_getId(o) \
2100 ((U32)((ptrdiff_t)SplayTreeNode_getKey((SplayTreeNode*)(o))))
2101#define HttpSession_getAuthenticatedUser(o) AuthenticatedUser_get2((o))
2102#define HttpSession_getUseCounter(o) (o)->useCounter
2103#define HttpSession_getPeerName(o) (&(o)->peer)
2104#ifdef __cplusplus
2105}
2107 return HttpSession_getAttribute(this, name); }
2109 return HttpSession_getCreationTime(this); }
2111 return HttpSession_getLastAccessedTime(this); }
2113 return HttpSession_getMaxInactiveInterval(this); }
2115 return HttpSession_getServer(this); }
2117 HttpSession_terminate(this); }
2118inline int HttpSession::removeAttribute(const char* name) {
2119 return HttpSession_removeAttribute(this, name); }
2121 return HttpSession_setAttribute(this, value); }
2123 HttpSession_setMaxInactiveInterval(this, interval); }
2125 HttpSession_incrRefCntr(this); }
2127 HttpSession_decrRefCntr(this); }
2128inline U32 HttpSession::getId() { return HttpSession_getId(this); }
2130 return HttpSession_getUseCounter(this); }
2132 return HttpSession_getAuthenticatedUser(this); }
2133inline void HttpSession::incrementLock() {HttpSession_incrementLock(this);}
2134inline void HttpSession::decrementLock() {HttpSession_decrementLock(this);}
2135
2136#endif /* __cplusplus */
2137
2138typedef enum {
2139 HttpSessionContainer_OK = 0,
2140 HttpSessionContainer_NoMemory,
2141 HttpSessionContainer_TooManySessions,
2142 HttpSessionContainer_NoPeerAddress
2143} HttpSessionContainer_ECode;
2144
2145
2150{
2151#ifdef __cplusplus
2158 void setMaxSessions(int max);
2159 private:
2160#endif
2161 SplayTree sessionTree;
2162 DoubleList sessionList;
2163 DoubleList sessionTermList;
2164 DoubleLink* sessionLinkIter;
2165 struct HttpServer* server;
2166 int noOfSessions; /* Current number of active sessions */
2167 int maxSessions;
2168 HttpSessionContainer_ECode eCode;
2170
2171#ifdef __cplusplus
2172extern "C" {
2173#endif
2174void HttpSessionContainer_constructor(struct HttpSessionContainer* o,
2175 struct HttpServer* server,
2176 U16 maxSessions);
2177void HttpSessionContainer_destructor(struct HttpSessionContainer* o);
2178void HttpSessionContainer_sessionTimer(struct HttpSessionContainer* o);
2179#define HttpSessionContainer_setMaxSessions(o,max) (o)->maxSessions = max
2180#ifdef __cplusplus
2181}
2183 HttpSessionContainer_setMaxSessions(this, max); }
2184#endif
2185
2186#endif /* NO_HTTP_SESSION */
2187
2188
2196typedef void (*HttpPage_Service)(struct HttpPage* page,
2197 HttpRequest* request,
2198 HttpResponse* response);
2199
2200
2201#define HttpPageType_HttpPageSE 0x00020
2202
2203#ifndef __DOXYGEN__
2204typedef struct HttpPageNode
2205{
2206 struct HttpPageNode* next;
2207} HttpPageNode;
2208#endif
2209
2261typedef struct HttpPage
2262{
2263#ifdef __cplusplus
2264 void *operator new(size_t s) { return ::baMalloc(s); }
2265 void operator delete(void* d) { if(d) ::baFree(d); }
2266 void *operator new(size_t, void *place) { return place; }
2267 void operator delete(void*, void *) { }
2268 HttpPage() {}
2277 HttpPage(HttpPage_Service service, const char* name);
2278
2281 ~HttpPage();
2282
2285 const char* getName() const { return name; }
2286
2291 void service(HttpRequest* request, HttpResponse* response);
2292
2296 bool isLinked();
2297
2300 int unlink();
2301#endif
2302 HttpPageNode super; /* As if inherited */
2303 HttpPage_Service serviceCB;
2304 const char* name;
2306
2307#ifdef __cplusplus
2308extern "C" {
2309#endif
2310void
2311BA_API HttpPage_constructor(
2312 HttpPage* o, HttpPage_Service service, const char* name);
2313BA_API void HttpPage_destructor(HttpPage* o);
2314#define HttpPage_getName(o) (o)->name
2315#define HttpPage_isLinked(o) ((HttpPageNode*)(o))->next
2316BA_API int HttpPage_unlink(HttpPage* o);
2317#define HttpPage_service(o, request, response) \
2318 (o)->serviceCB(o, request, response)
2319#ifdef __cplusplus
2320}
2321inline HttpPage::HttpPage(HttpPage_Service service, const char* name) {
2322 HttpPage_constructor(this, service, name); }
2324 HttpPage_destructor(this); }
2325inline bool HttpPage::isLinked() {
2326 return HttpPage_isLinked(this) ? true : false;
2327}
2328inline int HttpPage::unlink() {return HttpPage_unlink(this); }
2329inline void HttpPage::service(HttpRequest* request, HttpResponse* response) {
2330 HttpPage_service(this, request, response);
2331}
2332#endif
2333
2334
2340typedef int (*HttpDir_Service)(struct HttpDir* o,
2341 const char* relPath,
2342 HttpCommand* cmd);
2343
2344#define HttpDirType_EhDir 0x00001
2345#define HttpDirType_HttpResRdr 0x00002
2346#define HttpDirType_AuthenticateDir 0x00008
2347#define HttpDirType_AuthenticateDirWrapper 0x00010
2348
2349
2369typedef struct HttpDir
2370{
2371#ifdef __cplusplus
2372 void *operator new(size_t s) { return ::baMalloc(s); }
2373 void operator delete(void* d) { if(d) ::baFree(d); }
2374 void *operator new(size_t, void *place) { return place; }
2375 void operator delete(void*, void *) { }
2377 HttpDir();
2378
2395 HttpDir(const char* name, S8 priority=0);
2396 ~HttpDir();
2397
2401 int insertDir(HttpDir* dir);
2402
2406 int insertPage(HttpPage* page);
2407
2411
2415
2418 HttpDir* getDir(const char* name);
2419
2422 HttpPage* getPage(const char* name);
2423
2426 HttpDir* getNext();
2427
2437 HttpPage* findPage(HttpPage* iter, const char* name);
2438
2450 static HttpDir* findDir(HttpDir* iter, const char* name,
2451 unsigned int nameLen);
2452
2459 HttpDir* createOrGet(const char* name);
2460
2463 const char* getName() const { return name; }
2464
2467 HttpDir* getParent() const { return parent; }
2468
2491 char* makeAbsPath(const char* relPath, int relPathLen);
2492
2504 char* getRootPath();
2505
2506
2511
2521 void p403(const char* p403);
2522
2526 bool isLinked();
2527
2530 int unlink();
2531
2536 void setAuthenticator(
2537 struct AuthenticatorIntf* authenticator,
2538 struct AuthorizerIntf* authorizer=0);
2539
2560 bool authenticateAndAuthorize(HttpCommand* cmd,const char* path);
2561
2562
2563#endif
2564 HttpDir_Service service;
2565 struct HttpDir* parent; /* owner */
2566 struct HttpDir* next; /* next sibling */
2567 const char* name; /* e.g. /mydir/ */
2568 struct HttpDir* dirList; /* list of httpdirs (children) */
2569 struct AuthorizerIntf* realm; /* If we have authorization */
2570 struct AuthenticatorIntf* authenticator; /* If we have authentic. */
2571 char* _p403; /* If we have a 403 denied response page. */
2572 HttpPageNode pageList; /* pages for this dir */
2573 /* U8 type; */
2574 S8 priority;
2576
2577#ifdef __cplusplus
2578extern "C" {
2579#endif
2580BA_API void HttpDir_constructor(HttpDir* o, const char* name, S8 priority);
2581BA_API void HttpDir_destructor(HttpDir* o);
2582BA_API char* HttpDir_makeAbsPath(
2583 HttpDir* o, const char* relPath, int relPathLen);
2584#define HttpDir_getRootPath(o) HttpDir_makeAbsPath(o,"",0)
2585BA_API int HttpDir_insertDir(HttpDir* o, HttpDir* dir);
2586#define HttpDir_getFirstPage(o) \
2587 (o)->pageList.next != &(o)->pageList ? ((HttpPage*)(o)->pageList.next) : 0
2588#define HttpDir_getFirstDir(o) (o)->dirList
2589BA_API HttpDir* HttpDir_getDir(HttpDir* o, const char* name);
2590BA_API HttpPage* HttpDir_getPage(HttpDir* o, const char* name);
2591#define HttpDir_getNext(o) (o)->next
2592#define HttpDir_getName(o) (o)->name
2593#define HttpDir_getParent(o) (o)->parent
2594BA_API int HttpDir_insertPage(HttpDir* o, HttpPage* page);
2595BA_API HttpPage* HttpDir_findPage(
2596 HttpDir* o, HttpPage* iter, const char* name);
2597BA_API HttpDir* HttpDir_findDir(
2598 HttpDir* iter, const char* name,unsigned int nameLen);
2599BA_API HttpDir* HttpDir_createOrGet(HttpDir* o, const char* name);
2600BA_API void HttpDir_p403(HttpDir* o, const char* p403);
2601#define HttpDir_overloadService HttpDir_setService
2602BA_API HttpDir_Service HttpDir_setService(HttpDir*o, HttpDir_Service s);
2603#define HttpDir_isLinked(o) (o)->parent
2604BA_API int HttpDir_unlink(HttpDir* o);
2605#define HttpDir_setAuthenticator(o,authenticatorMA,authorizerMA) \
2606 (o)->authenticator = authenticatorMA,(o)->realm = authorizerMA
2607BA_API int HttpDir_authenticateAndAuthorize(
2608 HttpDir* o,HttpCommand* cmd,const char* path);
2609#define HttpDir_isAuthorized(o,user,method,path) \
2610 ((o)->realm ? \
2611 (user ? AuthorizerIntf_authorize((o)->realm,user,method,path) : FALSE) : \
2612 TRUE)
2613#ifdef __cplusplus
2614}
2616 HttpDir_constructor(this, 0, 0); }
2617inline HttpDir::HttpDir(const char* name, S8 priority) {
2618 HttpDir_constructor(this, name, priority); }
2619inline HttpDir::~HttpDir() {
2620 HttpDir_destructor(this); }
2621inline char* HttpDir::makeAbsPath(const char* relPath, int relPathLen) {
2622 return HttpDir_makeAbsPath(this, relPath, relPathLen); }
2623inline char* HttpDir::getRootPath() {
2624 return HttpDir_getRootPath(this); }
2625inline int HttpDir::insertDir(HttpDir* dir) {
2626 return HttpDir_insertDir(this, dir); }
2628 return HttpDir_insertPage(this, page); }
2629inline HttpPage* HttpDir::getFirstPage() { return HttpDir_getFirstPage(this); }
2630inline HttpDir* HttpDir::getFirstDir() { return HttpDir_getFirstDir(this); }
2631inline HttpDir* HttpDir::getDir(const char* name) {
2632 return HttpDir_getDir(this,name); }
2633inline HttpPage* HttpDir::getPage(const char* name) {
2634 return HttpDir_getPage(this,name); }
2635inline HttpDir* HttpDir::getNext() { return HttpDir_getNext(this); }
2636inline HttpPage* HttpDir::findPage(HttpPage* iter, const char* name) {
2637 return HttpDir_findPage(this, iter, name); }
2638inline HttpDir* HttpDir::findDir(HttpDir* iter, const char* name,
2639 unsigned int nameLen) {
2640 return HttpDir_findDir(iter, name, nameLen); }
2641inline HttpDir* HttpDir::createOrGet(const char* name) {
2642 return HttpDir_createOrGet(this, name); }
2644 return HttpDir_setService(this, s); }
2645inline void HttpDir::p403(const char* p403) {
2646 HttpDir_p403(this, p403); }
2647inline int HttpDir::unlink() {return HttpDir_unlink(this); }
2648inline bool HttpDir::isLinked() {
2649 return HttpDir_isLinked(this) ? true : false; }
2650inline void HttpDir::setAuthenticator(struct AuthenticatorIntf* authenticator,
2651 struct AuthorizerIntf* authorizer){
2652 HttpDir_setAuthenticator(this,authenticator,authorizer);
2653}
2655 HttpCommand* cmd, const char* path) {
2656 return HttpDir_authenticateAndAuthorize(this,cmd,path) ? true : false; }
2657#endif
2658
2659#ifndef __DOXYGEN__
2660
2661typedef struct HttpLinkCon
2662{
2663 HttpConnection con; /* Inherits from HttpConnection */
2664 DoubleLink link;
2665} HttpLinkCon;
2666
2667
2668typedef struct
2669{
2670 HttpDir super; /* inherit */
2671 HttpDir_Service superServiceFunc;
2672 char* page404;
2673 BaBool page404InProgress;
2674} HttpRootDir;
2675
2676#endif
2677
2686typedef struct HttpServerConfig
2687{
2688#ifdef __cplusplus
2695
2725 int setRequest(S16 min, S16 max);
2726
2738 int setResponseHeader(U16 min, U16 max);
2739
2752 int setResponseData(U16 size);
2753
2767 int setCommit(U16 size);
2768
2781 int setNoOfHttpCommands(U16 size);
2782
2804 int setNoOfHttpConnections(U16 size);
2805
2811 int setMaxSessions(U16 size);
2812#endif
2813 S16 minRequest;
2814 S16 maxRequest;
2815 U16 minResponseHeader;
2816 U16 maxResponseHeader;
2817 U16 commit;
2818 U16 responseData;
2819 U16 noOfHttpCommands;
2820 U16 noOfHttpConnections;
2821 U16 maxSessions;
2823
2824#ifdef __cplusplus
2825extern "C" {
2826#endif
2827BA_API void HttpServerConfig_constructor(HttpServerConfig* o);
2828BA_API int HttpServerConfig_setRequest(HttpServerConfig* o, S16 min, S16 max);
2829BA_API int HttpServerConfig_setResponseHeader(
2830 HttpServerConfig* o, U16 min, U16 max);
2831BA_API int HttpServerConfig_setResponseData(HttpServerConfig* o, U16 size);
2832BA_API int HttpServerConfig_setCommit(HttpServerConfig* o, U16 size);
2833BA_API int HttpServerConfig_setNoOfHttpCommands(HttpServerConfig* o, U16 size);
2834BA_API int HttpServerConfig_setNoOfHttpConnections(
2835 HttpServerConfig* o, U16 size);
2836BA_API int HttpServerConfig_setMaxSessions(HttpServerConfig* o, U16 size);
2837#ifdef __cplusplus
2838}
2840 HttpServerConfig_constructor(this); }
2841inline int HttpServerConfig::setRequest(S16 min, S16 max) {
2842 return HttpServerConfig_setRequest(this, min, max); }
2843inline int HttpServerConfig::setResponseHeader(U16 min, U16 max) {
2844 return HttpServerConfig_setResponseHeader(this, min, max); }
2846 return HttpServerConfig_setResponseData(this, size); }
2847inline int HttpServerConfig::setCommit(U16 size) {
2848 return HttpServerConfig_setCommit(this, size); }
2850 return HttpServerConfig_setNoOfHttpCommands(this, size); }
2852 return HttpServerConfig_setNoOfHttpConnections(this, size); }
2854 return HttpServerConfig_setMaxSessions(this, size); }
2855
2856#endif
2857
2858
2859typedef DoubleList HttpLinkConList;
2860
2861/* Used by LSP plugin */
2862typedef void (*LspOnTerminateRequest)(struct LHttpCommand* lcmd);
2863
2866typedef struct HttpServer
2867{
2868#ifdef __cplusplus
2869 void *operator new(size_t s) { return ::baMalloc(s); }
2870 void operator delete(void* d) { if(d) ::baFree(d); }
2871 void *operator new(size_t, void *place) { return place; }
2872 void operator delete(void*, void *) { }
2879 HttpServer(SoDisp* dispatcher, HttpServerConfig* cfg=0);
2880
2881 ~HttpServer();
2882
2894 int insertRootDir(HttpDir* dir);
2895
2917 int insertDir(const char* virtualDirRootPath, HttpDir* dir);
2918
2958 int insertCSP(CspInit cspInit,
2959 const char* virtualDirRootPath,
2960 struct CspReader* reader);
2961
2962 struct AuthUserList* getAuthUserList(const char* name);
2963
2966
2969
2975
2979
2980#ifndef NO_HTTP_SESSION
2990 HttpSession* getSession(U32 id);
2991#endif
2992
3001 void set404Page(const char* page404);
3002
3004 const char* get404Page();
3005
3006 int setUserObj(void* userObj, bool overwrite=false);
3007
3013 static void initStatic(void);
3014
3025 static void setErrHnd(UserDefinedErrHandler e);
3026
3027 /* No longer used */
3028 static int setZlib(ZlibInflateInit2 init,
3029 ZlibInflate inflate,
3030 ZlibInflateEnd end){
3031 (void)init; (void)inflate; (void)end;
3032 return 0; }
3035 static const char* getStatusCode(int code);
3036
3037
3038#endif
3039 DoubleList commandPool;
3040 DoubleList cmdReqList;
3041 HttpConnection noOpCon;
3042 HttpLinkConList freeList;
3043 HttpLinkConList readyList;
3044 HttpLinkConList connectedList;
3045 HttpRootDir rootDirContainer;
3046 SplayTree authUserTree; /* Used by AuthenticatedUser.c */
3047 struct HttpCmdThreadPoolIntf* threadPoolIntf;
3048 HttpLinkCon* connections;
3049 SoDisp* dispatcher;
3050 void* userObj;
3051 void* waitForConClose; /* See HttpServer_doLingeringClose */
3052 LspOnTerminateRequest lspOnTerminateRequest;
3053 int commandPoolSize;
3054 U16 noOfConnections;
3055 S16 maxHttpRequestLen;
3056#ifndef NO_HTTP_SESSION
3057 HttpSessionContainer sessionContainer;
3058#endif
3060
3061
3062/* Used exclusively by HttpCmdThreadPool */
3063void HttpServer_AsynchProcessDir(HttpServer* o,
3064 HttpDir* dir,
3065 HttpCommand* cmd);
3066/* Used exclusively by HttpCmdThreadPool */
3067#define HttpServer_setThreadPoolIntf(o, intf) (o)->threadPoolIntf=intf
3068#define HttpServer_luaenv(o) (o)->luaenv
3069
3070#ifdef __cplusplus
3071extern "C" {
3072#endif
3073BA_API void HttpServer_constructor(HttpServer*,SoDisp*, HttpServerConfig*);
3074BA_API void HttpServer_destructor(HttpServer* o);
3075BA_API int HttpServer_insertRootDir(HttpServer* o, HttpDir* dir);
3076BA_API int HttpServer_insertDir(HttpServer* o,
3077 const char* virtualDirRootPath,
3078 HttpDir* dir);
3079BA_API int HttpServer_insertCSP(HttpServer* o,
3080 CspInit cspInit,
3081 const char* virtualDirRootPath,
3082 struct CspReader* reader);
3083#define HttpServer_getAuthUserList(o, name) \
3084 (AuthUserList*)SplayTree_find(&(o)->authUserTree, name)
3085#define HttpServer_getDispatcher(o) (o)->dispatcher
3086#define HttpServer_getFirstRootDir(o) \
3087 HttpDir_getFirstDir((HttpDir*)&(o)->rootDirContainer)
3088#define HttpServer_getUserObj(o) (o)->userObj
3089#define HttpServer_getSessionContainer(o) (&(o)->sessionContainer)
3090#define HttpServer_getMutex(o) SoDisp_getMutex((o)->dispatcher)
3091BA_API const char* HttpServer_getStatusCode(int code);
3092void HttpServer_addCon2ConnectedList(HttpServer* o, HttpConnection* con);
3093void HttpServer_doLingeringClose(
3094 HttpServer* o, HttpConnection* con, BaFileSize contLen);
3095
3096#ifndef NO_HTTP_SESSION
3097BA_API HttpSession* HttpServer_getSession(HttpServer* o, U32 id);
3098#endif
3099BA_API HttpConnection* HttpServer_getFreeCon(HttpServer* o);
3100void HttpServer_returnFreeCon(HttpServer* o, HttpConnection* con);
3101BA_API void HttpServer_installNewCon(HttpServer* o, HttpConnection* con);
3102BA_API void HttpServer_setErrHnd(UserDefinedErrHandler e);
3103void HttpServer_initStatic(void);
3104int HttpServer_termOldestIdleCon(HttpServer* o);
3105BA_API void HttpServer_set404Page(HttpServer*o, const char* page404);
3106#define HttpServer_get404Page(o) (o)->rootDirContainer.page404
3107BA_API int HttpServer_setUserObj(
3108 HttpServer* o, void* userObj, BaBool overwrite);
3109#define HttpServer_termAllSessions(o) \
3110 HttpSessionContainer_destructor(&(o)->sessionContainer)
3111/* No longer used */
3112#define HttpServer_setZlib(init,inflate,end);
3113#ifdef __cplusplus
3114}
3116 HttpServer_constructor(this, disp, cfg); }
3117inline HttpServer::~HttpServer() {
3118 HttpServer_destructor(this); }
3120 return HttpServer_insertRootDir(this, dir); }
3122 return HttpServer_getMutex(this);
3123}
3124inline int HttpServer::insertDir(const char* virtualDirRootPath,HttpDir* dir){
3125 return HttpServer_insertDir(this, virtualDirRootPath, dir); }
3127 const char* virtualDirRootPath,
3128 struct CspReader* reader) {
3129 return HttpServer_insertCSP(this, cspInit, virtualDirRootPath, reader); }
3130inline struct AuthUserList* HttpServer::getAuthUserList(const char* name) {
3131 return HttpServer_getAuthUserList(this,name); }
3133 return HttpServer_getDispatcher(this); }
3135 return HttpServer_getFirstRootDir(this); }
3137 return HttpServer_getSessionContainer(this); }
3138#ifndef NO_HTTP_SESSION
3140 return HttpServer_getSession(this, id); }
3141inline void HttpServer::initStatic(void) {
3142 HttpServer_initStatic(); }
3143inline void HttpServer::setErrHnd(UserDefinedErrHandler e) {
3144 HttpServer_setErrHnd(e); }
3145inline void HttpServer::set404Page(const char* page404) {
3146 HttpServer_set404Page(this, page404); }
3147inline const char* HttpServer::get404Page() {
3148 return HttpServer_get404Page(this); }
3149inline int HttpServer::setUserObj(void* userObj, bool overwrite) {
3150 return HttpServer_setUserObj(this, userObj, overwrite); }
3151inline const char* HttpServer::getStatusCode(int code) {
3152 return HttpServer_getStatusCode(code);
3153}
3154#endif
3155
3156
3158 return HttpRequest_getResponse(this); }
3160 return HttpRequest_getConnection(this); }
3162 return HttpResponse_getRequest(this); }
3164 return HttpResponse_getCommand(this); }
3166 return HttpRequest_getCommand(this); }
3168 return HttpConnection_getServer(this); }
3169
3170#endif /* __cplusplus */
3171 /* end of StdWebServer */
3173
3174/* Internal use */
3175#ifdef NO_SHARKSSL
3176
3177#define SHARKSSL_MD5_HASH_LEN 16
3178#define SHARKSSL_SHA1_HASH_LEN 20
3179
3180typedef struct SharkSslMd5Ctx
3181{
3182 U32 total[2];
3183 U32 state[4];
3184 U8 buffer[64];
3185} SharkSslMd5Ctx;
3186
3187SHARKSSL_API void SharkSslMd5Ctx_constructor(SharkSslMd5Ctx* ctx);
3188SHARKSSL_API void SharkSslMd5Ctx_append(SharkSslMd5Ctx* ctx, const U8* data, U32 len);
3189SHARKSSL_API void SharkSslMd5Ctx_finish(SharkSslMd5Ctx* ctx, U8 digest[]);
3190SHARKSSL_API int sharkssl_md5(const U8*, U16, U8*);
3191
3192typedef struct SharkSslSha1Ctx
3193{
3194 U32 total[2];
3195 U32 state[5];
3196 U8 buffer[64];
3197} SharkSslSha1Ctx;
3198
3199SHARKSSL_API void SharkSslSha1Ctx_constructor(SharkSslSha1Ctx* ctx);
3200SHARKSSL_API void SharkSslSha1Ctx_append(SharkSslSha1Ctx* ctx, const U8* data, U32 len);
3201SHARKSSL_API void SharkSslSha1Ctx_finish(SharkSslSha1Ctx*, U8 digest[]);
3202
3203typedef void SharkSsl;
3204
3205#endif
3206
3207#endif /* __httpServer_h */
void(* CspInit)(struct HttpDir *cspRoot, struct CspReader *reader)
Function prototype for the "initialize function" generated by CspLink.
Definition: HttpServer.h:190
void * baMalloc(size_t size)
Returns pointer to uninitialized newly-allocated space for an object of size "size",...
void baFree(void *p)
Deallocates space to which it points.
BaTime getLastAccessedTime()
Returns the last time the client sent a request associated with this session, as the number of second...
Definition: HttpServer.h:2110
void deleteCookie()
Specifies a path for the cookie to which the client should return the cookie.
Definition: HttpServer.h:674
HttpHeader * getHeaders(int *len)
Return an HTTP header iterator that can iterate and fetch all the HTTP headers.
Definition: HttpServer.h:1141
int include(const char *path)
Includes the content of a resource (servlet, CSP page, HTML file) in the response.
Definition: HttpServer.h:1747
BaTime getCreationTime()
Returns the time when this session was created, measured in seconds since midnight January 1,...
Definition: HttpServer.h:2108
int setMaxAge(BaTime seconds)
Sets header "Cache-Control: max-age=seconds".
Definition: HttpServer.h:1792
int setDateHeader(const char *name, BaTime time)
Sets a response header with the given name and date-value.
Definition: HttpServer.h:1787
HttpDir * getNext()
Returns the next dir in the parent list.
Definition: HttpServer.h:2635
const char * getRequestURI()
Returns the pathname.
Definition: HttpServer.h:1124
const char * containsHeader(const char *name)
Searches the internal response header database for a header with the specified name.
Definition: HttpServer.h:1731
const char * getContentType()
Returns the content type, for example: "application/x-www-form-urlencoded".
Definition: HttpServer.h:759
const char * getHost()
Returns the host header.
Definition: HttpServer.h:755
int flush()
Forces any content in the buffer to be written to the client.
Definition: HttpServer.h:1741
void(* HttpSessionAttribute_Destructor)(struct HttpSessionAttribute *o)
HttpSessionAttribute termination callback function.
Definition: HttpServer.h:1887
int sendError(int eCode)
Sends an error response as a simple HTML page to the client using the specified status code.
Definition: HttpServer.h:1765
int forward(const char *path)
Forwards a request from a servlet to another resource (servlet, CSP file, or HTML file).
Definition: HttpServer.h:1743
void setHttpOnly(bool flag)
Marks or unmarks this Cookie as HttpOnly.
Definition: HttpServer.h:680
int setContentLength(BaFileSize len)
Sets the "Content-Length" parameter value.
Definition: HttpServer.h:1783
void setSecure(bool flag)
Inform the browser whether the cookie should be sent only using a secure protocol such as HTTPS – i....
Definition: HttpServer.h:678
HttpPage * findPage(HttpPage *iter, const char *name)
Searches for a page in this directory node.
Definition: HttpServer.h:2636
HttpServer * getServer()
Returns the web server object.
Definition: HttpServer.h:1122
int resetHeaders()
Removes all HTTP headers.
Definition: HttpServer.h:1761
struct HttpServer * getServer()
Get the web-server object.
Definition: HttpServer.h:1868
HttpRequest * getRequest()
Get the request object.
Definition: HttpServer.h:1862
int insertPage(HttpPage *page)
Insert a page in the directory.
Definition: HttpServer.h:2627
int setAttribute(HttpSessionAttribute *value)
Binds an object to this session, using the name specified.
Definition: HttpServer.h:2120
HttpMethod getMethodType()
Returns the method type.
Definition: HttpServer.h:1116
int send(const void *data, int len)
Used when sending raw data to the client.
Definition: HttpServer.h:1809
HttpResponse * getResponse()
Get the response object.
Definition: HttpServer.h:1864
int removeResponseBuf()
Remove buffer set by using setResponseBuf.
Definition: HttpServer.h:1759
HttpMethod
HTTP method types.
Definition: HttpServer.h:780
HttpConnection * getConnection()
Returns the connection object associated with this request.
Definition: HttpServer.h:3159
const char * getDomain()
Returns the host header without any port number.
Definition: HttpServer.h:757
struct HttpRequest HttpRequest
The HttpServer creates an HttpRequest object when the HttpServer parses a client request.
void setAuthenticator(struct AuthenticatorIntf *authenticator, struct AuthorizerIntf *authorizer=0)
Set the optional authenticator and optional AuthorizerIntf.
Definition: HttpServer.h:2650
struct HttpConnection * getConnection()
Get the current connection object that the HttpCommand instance is bound with.
Definition: HttpServer.h:1866
int sendBufAsTxtError(int eCode)
Sends the data formatted into the HttpResponse buffer as an error message to the client.
Definition: HttpServer.h:1771
bool isForward() const
Returns true if this is a forward request from another servlet or CSP file.
Definition: HttpServer.h:1751
AuthenticatedUser * getAuthenticatedUser()
Returns the authenticated user or NULL if user is not authenticated.
Definition: HttpServer.h:1114
int unlink()
Unlinks/removes the page from the parent directory.
Definition: HttpServer.h:2328
HttpServer * getServer()
Get the server object.
Definition: HttpServer.h:2114
struct HttpSessionAttribute HttpSessionAttribute
The interface to an HttpSession attribute.
int setRequest(S16 min, S16 max)
Set the size of the HTTP request buffer.
Definition: HttpServer.h:2841
bool hasMoreElements()
Returns true if more elements.
Definition: HttpServer.h:1151
HttpStdHeaders * getStdHeaders()
Returns an object containing standard HTTP headers.
Definition: HttpServer.h:1128
const char * getHeaderValue(const char *name)
Returns the value of the specified request header.
Definition: HttpServer.h:1132
int setDefaultHeaders()
Sets the most common header values in servlet and CSP files.
Definition: HttpServer.h:1811
int resetBuffer()
Clears the content of the underlying buffer in the response without clearing headers or status code.
Definition: HttpServer.h:1763
int insertCSP(CspInit cspInit, const char *virtualDirRootPath, struct CspReader *reader)
Insert and initialize a CSP Virtual Directory.
Definition: HttpServer.h:3126
struct HttpServerConfig HttpServerConfig
Use an instance of this class if you want to override the default web-server parameters.
const char * encodeRedirectURL(const char *pathName)
Encodes the specified URL into an absolute URL, or if encoding is not needed, returns the URL unchang...
Definition: HttpServer.h:1735
bool initial() const
Returns true if this is the initial page.
Definition: HttpServer.h:1755
struct HttpStdHeaders HttpStdHeaders
Standard HTTP header values.
static void setErrHnd(UserDefinedErrHandler e)
You can set your own user defined error handler for the web-server.
Definition: HttpServer.h:3143
void terminate()
Unbinds any objects bound to this session object, runs the HttpSession destructor,...
Definition: HttpServer.h:2116
struct HttpResponse HttpResponse
This object is used when sending response messages back to the client.
~HttpPage()
The HttpPage destructor unlinks the page from the parent directory.
Definition: HttpServer.h:2323
void nextElement()
Advance to the next element.
Definition: HttpServer.h:493
SBaFileSize getContentLength()
Returns the content length if request contains a body.
Definition: HttpServer.h:761
U32 byteCount()
Returns number of bytes sent thus far.
Definition: HttpServer.h:1733
int setCommit(U16 size)
Set the size of the HTTP response commit buffer.
Definition: HttpServer.h:2847
HttpDir()
Constructor for creating a root dir, a root dir has no name.
Definition: HttpServer.h:2615
struct HttpServer HttpServer
The Web Server.
HttpCookie * getCookie(const char *name)
Returns the requested cookie or NULL if no cookie matches the name.
Definition: HttpServer.h:1134
ThreadMutex * getMutex()
Get the dispatcher mutex.
Definition: HttpServer.h:3121
void service(HttpRequest *request, HttpResponse *response)
The virtual service function (C callback function) is normally run by the parent directory when deleg...
Definition: HttpServer.h:2329
void setMaxAge(BaTime expiry)
Sets the maximum age of the cookie in seconds.
Definition: HttpServer.h:672
int setResponseBuf(BufPrint *buf, bool useDefBuffer=true)
This is an advanced function that makes it possible to redirect the output, which is normally sent to...
Definition: HttpServer.h:1757
HttpSessionContainer * getSessionContainer()
Get the HttpSessionContainer.
Definition: HttpServer.h:3136
HttpDir * getFirstRootDir()
Returns the first root directory.
Definition: HttpServer.h:3134
HttpSessionAttribute * getAttribute(const char *name)
Returns the object bound with the specified name in this session, or null if no object is bound under...
Definition: HttpServer.h:2106
AuthenticatedUser * getAuthenticatedUser()
Returns the AuthenticatedUser if user is authenticated.
Definition: HttpServer.h:2131
int setContentType(const char *type)
Sets the "Content-Type" parameter value.
Definition: HttpServer.h:1785
void(* HttpPage_Service)(struct HttpPage *page, HttpRequest *request, HttpResponse *response)
The HttpPage service function.
Definition: HttpServer.h:2196
struct HttpCookie HttpCookie
A cookie is used for exchanging a small amount of information between a HttpPage and a web browser.
U32 getId()
Returns a unique identifier assigned to this session.
Definition: HttpServer.h:2128
int setResponseHeader(U16 min, U16 max)
Set the size of the HTTP response header buffer.
Definition: HttpServer.h:2843
void set404Page(const char *page404)
Set a more user friendly 404 page.
Definition: HttpServer.h:3145
const char * encodeRedirectURLWithParam(const char *pathName)
This method is similar to HttpResponse::encodeRedirectURL, but this method also includes all URL-enco...
Definition: HttpServer.h:1737
static void initStatic(void)
The only purpose with this function is to clean all static variables that are in the BSS section; i....
Definition: HttpServer.h:3141
struct HttpServer * getServer()
Fetch the HttpServer object.
Definition: HttpServer.h:3167
BufPrint * getWriter()
Returns a BufPrint object that can send any type of data to the client.
Definition: HttpServer.h:1805
int write(const void *data, int len, int useBuffering=TRUE)
Used for sending pre-formatted data to the client.
Definition: HttpServer.h:1807
int setMaxSessions(U16 size)
Maximum allowed active HttpSession objects.
Definition: HttpServer.h:2853
HttpInData * getBuffer()
Get the internal rec buffer.
Definition: HttpServer.h:1153
const char * encodeUrl(const char *path)
Encodes an absolute or relative URL, or if encoding is not needed, returns the URL unchanged.
Definition: HttpServer.h:1739
int setNoOfHttpCommands(U16 size)
The number of HttpCommand instances created by the web-server.
Definition: HttpServer.h:2849
HttpDir * createOrGet(const char *name)
Returns a sub-directory with the given name.
Definition: HttpServer.h:2641
bool authenticateAndAuthorize(HttpCommand *cmd, const char *path)
Authenticate and authorize the user.
Definition: HttpServer.h:2654
int(* HttpDir_Service)(struct HttpDir *o, const char *relPath, HttpCommand *cmd)
The HttpDir service callback function.
Definition: HttpServer.h:2340
HttpServer(SoDisp *dispatcher, HttpServerConfig *cfg=0)
Create a Web Server object.
Definition: HttpServer.h:3115
struct HttpCommand HttpCommand
The HttpCommand class is a container class for the HttpRequest and HttpResponse command pair.
char * fmtHeader(const char *name, int valueLen, bool replace=true)
Pre-allocate memory for a {name, value} pair in the response header database.
Definition: HttpServer.h:1794
bool isInclude() const
Returns true if this is an include from another servlet or CSP file.
Definition: HttpServer.h:1753
int unlink()
Unlinks/removes the directory from the parent directory.
Definition: HttpServer.h:2647
char * getRootPath()
Calculates the root of where the HttpDir instance is installed in the virtual file system.
Definition: HttpServer.h:2623
int checkMethods(HttpResponse *resp, U32 methods, bool addDefault=TRUE)
Checks the HTTP method type and sends a response message if condition met.
Definition: HttpServer.h:1107
const char * getVersion()
Returns the HTTP version as a string, normally "1.1".
Definition: HttpServer.h:1130
int printf(const char *fmt,...)
printf is used for sending formatted data to the client.
Definition: HttpServer.h:1800
int redirect2TLS()
Converts the URL to HTTPS and sends a redirect (301) response to the client if this is a non-secure c...
Definition: HttpServer.h:1781
HttpPage * getFirstPage()
Returns the first page.
Definition: HttpServer.h:2629
SoDisp * getDispatcher()
Returns the dispatcher object.
Definition: HttpServer.h:3132
HttpDir * getDir(const char *name)
Returns the first directory with the name given or NULL if not found.
Definition: HttpServer.h:2631
int wsUpgrade()
Activate a WebSocket handshake.
Definition: HttpServer.h:1138
void setPath(const char *uri)
Set the cookie path.
Definition: HttpServer.h:676
static const char * getStatusCode(int code)
Return a short description for common HTTP error codes.
Definition: HttpServer.h:3151
char * makeAbsPath(const char *relPath, int relPathLen)
Makes an absolute path based on where the HttpDir instance is installed in the virtual file system an...
Definition: HttpServer.h:2621
struct HttpSessionContainer HttpSessionContainer
The HttpSession container class.
HttpSession * getSession(U32 id)
Returns the HttpSession associated with id or NULL if not found.
Definition: HttpServer.h:3139
U32 getUseCounter()
Get the session usage counter.
Definition: HttpServer.h:2129
bool committed() const
Returns a boolean indicating if the response has been committed.
Definition: HttpServer.h:1749
int redirect(const char *path)
Internally redirects the request to another resource.
Definition: HttpServer.h:1745
void incrRefCntr()
Increments the session reference counter.
Definition: HttpServer.h:2124
const char * getConnection()
Returns the connection type for HTTP 1.1 connections, returns "Close" or "Keep-Alive.
Definition: HttpServer.h:753
const char * getParameter(const char *paramName)
Returns the value of a request parameter as a const char* or null if the parameter does not exist.
Definition: HttpServer.h:1136
void decrRefCntr()
Decrements the session reference counter.
Definition: HttpServer.h:2126
const char * getRequestURL(bool forceHttps=false)
Reconstructs the URL the client used to make the request.
Definition: HttpServer.h:1126
HttpCommand * getCommand()
Get the HttpCommand object.
Definition: HttpServer.h:3165
int insertDir(HttpDir *dir)
Insert a sub-directory.
Definition: HttpServer.h:2625
void setMaxInactiveInterval(BaTime interval)
Specifies the time, in seconds, between client requests before the session container will invalidate ...
Definition: HttpServer.h:2122
void setMaxSessions(int max)
Set the maximum number of session objects.
Definition: HttpServer.h:2182
struct HttpSession HttpSession
Provides a way to identify a user across more than one page request or visit to a web site,...
bool isLinked()
Returns true if this page node is installed into a parent directory.
Definition: HttpServer.h:2325
const char * get404Page()
Returns a pointer to the current 404 page, if any.
Definition: HttpServer.h:3147
HttpCommand * getCommand()
Get the HttpCommand object.
Definition: HttpServer.h:3163
static HttpDir * findDir(HttpDir *iter, const char *name, unsigned int nameLen)
Searches for a sub-directory in this directory node.
Definition: HttpServer.h:2638
HttpSession * getSession(BaBool create=true)
Returns the current HttpSession associated with this request, or if there is no current session and c...
Definition: HttpServer.h:1148
HttpServerConfig()
The constructor sets up the default parameters.
Definition: HttpServer.h:2839
const char * getMethod()
Returns a string representation of the value returned by HttpRequest::getMethodType.
Definition: HttpServer.h:1118
void setValue(const char *newValue)
Assigns a new value to a cookie after the cookie is created.
Definition: HttpServer.h:682
BaTime getMaxInactiveInterval()
Returns the maximum time interval, in seconds, that the session container will keep this session open...
Definition: HttpServer.h:2112
HttpCookie * createCookie(const char *name)
Create a cookie.
Definition: HttpServer.h:1729
HttpPage * getPage(const char *name)
Returns the page with the name given or NULL if not found.
Definition: HttpServer.h:2633
int fmtError(int eCode, const char *fmt,...)
This method implements a printf like implementation for formatting and sending an error message.
Definition: HttpServer.h:1773
struct HttpPage HttpPage
An HttpPage, which is typically created by the CSP compiler, is similar to a Java servlet.
HttpDir_Service setService(HttpDir_Service s)
Replace the original service function in HttpDir with your own.
Definition: HttpServer.h:2643
HttpDir * getFirstDir()
Returns the first sub-directory.
Definition: HttpServer.h:2630
bool isLinked()
Returns true if this directory node is installed into a parent directory.
Definition: HttpServer.h:2648
HttpResponse * getResponse()
Returns the HttpResponse object.
Definition: HttpServer.h:3157
int insertDir(const char *virtualDirRootPath, HttpDir *dir)
Insert a directory node into the virtual file system.
Definition: HttpServer.h:3124
void setStatus(int statusCode)
Sets the status code for this response.
Definition: HttpServer.h:1797
int insertRootDir(HttpDir *dir)
Insert a root directory node.
Definition: HttpServer.h:3119
int setHeader(const char *name, const char *value, bool replace=true)
Sets a HTTP response header with the given name and value.
Definition: HttpServer.h:1789
HttpRequest * getRequest()
Get the HttpRequest object.
Definition: HttpServer.h:3161
void p403(const char *p403)
Set a 403 denied request handler.
Definition: HttpServer.h:2645
HttpSession * getSession()
Get the session object.
Definition: HttpServer.h:1954
BaBool checkTime(struct HttpResponse *resp, BaTime time)
Parses and checks if the "If-Modified-Since" time is equal or greater than "time".
Definition: HttpServer.h:1112
void activate()
Activates the cookie.
Definition: HttpServer.h:688
int sendRedirect(const char *url)
Sends a temporary redirect (302) response to the client using the specified redirect location URL.
Definition: HttpServer.h:1779
int setResponseData(U16 size)
The HttpResponse object stores formatted data in the response data buffer.
Definition: HttpServer.h:2845
int removeAttribute(const char *name)
Removes the object bound with the specified name from this session.
Definition: HttpServer.h:2118
void setDomain(const char *pattern)
Specifies the domain within which this cookie should be presented.
Definition: HttpServer.h:670
int setNoOfHttpConnections(U16 size)
Number of HttpConnection instances.
Definition: HttpServer.h:2851
void setComment(const char *purpose)
Specifies a comment that describes a cookie's purpose.
Definition: HttpServer.h:668
int sendBufAsError(int eCode)
Sends the data formatted into the HttpResponse buffer as an error message to the client.
Definition: HttpServer.h:1769
HttpSessionAttribute(const char *name, HttpSessionAttribute_Destructor terminate)
Create a session attribute.
Definition: HttpServer.h:1950
struct HttpDir HttpDir
An instance of the HttpDir class, which is a collection of zero or more resources,...
struct HttpParameterIterator HttpParameterIterator
The HttpParameterIterator is used for iterating through the form elements parsed by the HttpServer ob...
S64 BaTime
An arithmetic type representing calendar time with epoch of 1970-01-01 00:00:10 GMT – i....
Definition: GenPrimT.h:93
Abstract base class implemented by BasicAuthUser, FormAuthUser and DigestAuthUser.
Definition: AuthenticatedUser.h:246
Abstract interface class implemented by DigestAuthenticator, FormAuthenticator and DigestAuthenticato...
Definition: AuthenticatedUser.h:398
An abstract class, which you must implement, provides a method of authorizing an authenticated user.
Definition: AuthenticatedUser.h:112
The BufPrint class, which implements an ANSI compatible printf method, is a base class used by severa...
Definition: BufPrint.h:122
Abstract interface class for reading the "dat" file generated by HttpLink.
Definition: CspRunTm.h:118
The HttpCommand class is a container class for the HttpRequest and HttpResponse command pair.
Definition: HttpServer.h:1824
Contains information about the physical socket connection.
Definition: HttpConnection.h:76
A cookie is used for exchanging a small amount of information between a HttpPage and a web browser.
Definition: HttpServer.h:524
const char * getComment() const
Returns the comment set for this cookie or null if the cookie comment is not set.
Definition: HttpServer.h:530
const char * getPath() const
Returns the path on the server to which the browser returns this cookie.
Definition: HttpServer.h:545
BaTime getMaxAge() const
Returns the maximum age of the cookie, specified in seconds; by default, 0 indicating the cookie will...
Definition: HttpServer.h:538
bool getSecure() const
Returns true if the browser is sending cookies only over a secure protocol, or false if the browser c...
Definition: HttpServer.h:550
const char * getDomain() const
Returns the domain name set for this cookie.
Definition: HttpServer.h:533
const char * getValue() const
Returns the value of the cookie.
Definition: HttpServer.h:558
bool getHttpOnly() const
Return the HttpOnly attribute.
Definition: HttpServer.h:555
const char * getName() const
Returns the name of the cookie.
Definition: HttpServer.h:541
An instance of the HttpDir class, which is a collection of zero or more resources,...
Definition: HttpServer.h:2370
HttpDir * getParent() const
Returns the parent directory or NULL if no parent.
Definition: HttpServer.h:2467
const char * getName() const
Returns the directory name.
Definition: HttpServer.h:2463
The web-server "Request Data" container.
Definition: HttpServer.h:266
const char * getBuf()
Get pointer to start of PUT/POST data.
Definition: HttpServer.h:301
S32 getBufSize()
Get size of internal buffer.
Definition: HttpServer.h:303
An HttpPage, which is typically created by the CSP compiler, is similar to a Java servlet.
Definition: HttpServer.h:2262
const char * getName() const
Returns the page name.
Definition: HttpServer.h:2285
The HttpParameterIterator is used for iterating through the form elements parsed by the HttpServer ob...
Definition: HttpServer.h:440
const char * getValue() const
Returns the form value.
Definition: HttpServer.h:461
const char * getName() const
Return the form name.
Definition: HttpServer.h:459
A persistent container object for HTTP parameters.
Definition: HttpServer.h:365
static U32 calculateSize(struct HttpRequest *req)
Calculate the HttpParameter size.
Definition: HttpServer.h:403
const char * getParameter(const char *paramName)
Returns the value of a request parameter as a const char*, or null if the parameter does not exist.
Definition: HttpServer.h:407
static HttpParameter * clone(void *buf, struct HttpRequest *req)
Copy HTTP parameters to buf and return as a HttpParameter object.
Definition: HttpServer.h:405
The HttpServer creates an HttpRequest object when the HttpServer parses a client request.
Definition: HttpServer.h:816
This object is used when sending response messages back to the client.
Definition: HttpServer.h:1186
Use an instance of this class if you want to override the default web-server parameters.
Definition: HttpServer.h:2687
The Web Server.
Definition: HttpServer.h:2867
The interface to an HttpSession attribute.
Definition: HttpServer.h:1918
The HttpSession container class.
Definition: HttpServer.h:2150
Provides a way to identify a user across more than one page request or visit to a web site,...
Definition: HttpServer.h:1965
Standard HTTP header values.
Definition: HttpServer.h:697
The SoDisp dispatches any socket connection that contains data by calling the SoDispCon::execute memb...
Definition: SoDisp.h:86
A mutual exclusion class.
Definition: ThreadLib.h:186
User database interface used by the authentication classes.
Definition: AuthenticatedUser.h:177