http_server.h
Go to the documentation of this file.
1 /**
2  * @file http_server.h
3  * @brief HTTP server (HyperText Transfer Protocol)
4  *
5  * @section License
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  *
9  * Copyright (C) 2010-2023 Oryx Embedded SARL. All rights reserved.
10  *
11  * This file is part of CycloneTCP Open.
12  *
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU General Public License
15  * as published by the Free Software Foundation; either version 2
16  * of the License, or (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software Foundation,
25  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26  *
27  * @author Oryx Embedded SARL (www.oryx-embedded.com)
28  * @version 2.2.4
29  **/
30 
31 #ifndef _HTTP_SERVER_H
32 #define _HTTP_SERVER_H
33 
34 //Dependencies
35 #include "os_port.h"
36 #include "core/socket.h"
37 #include "web_socket/web_socket.h"
38 #include "http/http_common.h"
39 
40 //HTTP server support
41 #ifndef HTTP_SERVER_SUPPORT
42  #define HTTP_SERVER_SUPPORT ENABLED
43 #elif (HTTP_SERVER_SUPPORT != ENABLED && HTTP_SERVER_SUPPORT != DISABLED)
44  #error HTTP_SERVER_SUPPORT parameter is not valid
45 #endif
46 
47 //Support for persistent connections
48 #ifndef HTTP_SERVER_PERSISTENT_CONN_SUPPORT
49  #define HTTP_SERVER_PERSISTENT_CONN_SUPPORT DISABLED
50 #elif (HTTP_SERVER_PERSISTENT_CONN_SUPPORT != ENABLED && HTTP_SERVER_PERSISTENT_CONN_SUPPORT != DISABLED)
51  #error HTTP_SERVER_PERSISTENT_CONN_SUPPORT parameter is not valid
52 #endif
53 
54 //File system support
55 #ifndef HTTP_SERVER_FS_SUPPORT
56  #define HTTP_SERVER_FS_SUPPORT DISABLED
57 #elif (HTTP_SERVER_FS_SUPPORT != ENABLED && HTTP_SERVER_FS_SUPPORT != DISABLED)
58  #error HTTP_SERVER_FS_SUPPORT parameter is not valid
59 #endif
60 
61 //Server Side Includes support
62 #ifndef HTTP_SERVER_SSI_SUPPORT
63  #define HTTP_SERVER_SSI_SUPPORT DISABLED
64 #elif (HTTP_SERVER_SSI_SUPPORT != ENABLED && HTTP_SERVER_SSI_SUPPORT != DISABLED)
65  #error HTTP_SERVER_SSI_SUPPORT parameter is not valid
66 #endif
67 
68 //HTTP over TLS
69 #ifndef HTTP_SERVER_TLS_SUPPORT
70  #define HTTP_SERVER_TLS_SUPPORT DISABLED
71 #elif (HTTP_SERVER_TLS_SUPPORT != ENABLED && HTTP_SERVER_TLS_SUPPORT != DISABLED)
72  #error HTTP_SERVER_TLS_SUPPORT parameter is not valid
73 #endif
74 
75 //HTTP Strict Transport Security support
76 #ifndef HTTP_SERVER_HSTS_SUPPORT
77  #define HTTP_SERVER_HSTS_SUPPORT DISABLED
78 #elif (HTTP_SERVER_HSTS_SUPPORT != ENABLED && HTTP_SERVER_HSTS_SUPPORT != DISABLED)
79  #error HTTP_SERVER_HSTS_SUPPORT parameter is not valid
80 #endif
81 
82 //Basic access authentication support
83 #ifndef HTTP_SERVER_BASIC_AUTH_SUPPORT
84  #define HTTP_SERVER_BASIC_AUTH_SUPPORT DISABLED
85 #elif (HTTP_SERVER_BASIC_AUTH_SUPPORT != ENABLED && HTTP_SERVER_BASIC_AUTH_SUPPORT != DISABLED)
86  #error HTTP_SERVER_BASIC_AUTH_SUPPORT parameter is not valid
87 #endif
88 
89 //Digest access authentication support
90 #ifndef HTTP_SERVER_DIGEST_AUTH_SUPPORT
91  #define HTTP_SERVER_DIGEST_AUTH_SUPPORT DISABLED
92 #elif (HTTP_SERVER_DIGEST_AUTH_SUPPORT != ENABLED && HTTP_SERVER_DIGEST_AUTH_SUPPORT != DISABLED)
93  #error HTTP_SERVER_DIGEST_AUTH_SUPPORT parameter is not valid
94 #endif
95 
96 //WebSocket support
97 #ifndef HTTP_SERVER_WEB_SOCKET_SUPPORT
98  #define HTTP_SERVER_WEB_SOCKET_SUPPORT DISABLED
99 #elif (HTTP_SERVER_WEB_SOCKET_SUPPORT != ENABLED && HTTP_SERVER_WEB_SOCKET_SUPPORT != DISABLED)
100  #error HTTP_SERVER_WEB_SOCKET_SUPPORT parameter is not valid
101 #endif
102 
103 //Gzip content type support
104 #ifndef HTTP_SERVER_GZIP_TYPE_SUPPORT
105  #define HTTP_SERVER_GZIP_TYPE_SUPPORT DISABLED
106 #elif (HTTP_SERVER_GZIP_TYPE_SUPPORT != ENABLED && HTTP_SERVER_GZIP_TYPE_SUPPORT != DISABLED)
107  #error HTTP_SERVER_GZIP_TYPE_SUPPORT parameter is not valid
108 #endif
109 
110 //Multipart content type support
111 #ifndef HTTP_SERVER_MULTIPART_TYPE_SUPPORT
112  #define HTTP_SERVER_MULTIPART_TYPE_SUPPORT DISABLED
113 #elif (HTTP_SERVER_MULTIPART_TYPE_SUPPORT != ENABLED && HTTP_SERVER_MULTIPART_TYPE_SUPPORT != DISABLED)
114  #error HTTP_SERVER_MULTIPART_TYPE_SUPPORT parameter is not valid
115 #endif
116 
117 //Cookie support
118 #ifndef HTTP_SERVER_COOKIE_SUPPORT
119  #define HTTP_SERVER_COOKIE_SUPPORT DISABLED
120 #elif (HTTP_SERVER_COOKIE_SUPPORT != ENABLED && HTTP_SERVER_COOKIE_SUPPORT != DISABLED)
121  #error HTTP_SERVER_COOKIE_SUPPORT parameter is not valid
122 #endif
123 
124 //Stack size required to run the HTTP server
125 #ifndef HTTP_SERVER_STACK_SIZE
126  #define HTTP_SERVER_STACK_SIZE 650
127 #elif (HTTP_SERVER_STACK_SIZE < 1)
128  #error HTTP_SERVER_STACK_SIZE parameter is not valid
129 #endif
130 
131 //Priority at which the HTTP server should run
132 #ifndef HTTP_SERVER_PRIORITY
133  #define HTTP_SERVER_PRIORITY OS_TASK_PRIORITY_NORMAL
134 #endif
135 
136 //HTTP connection timeout
137 #ifndef HTTP_SERVER_TIMEOUT
138  #define HTTP_SERVER_TIMEOUT 10000
139 #elif (HTTP_SERVER_TIMEOUT < 1000)
140  #error HTTP_SERVER_TIMEOUT parameter is not valid
141 #endif
142 
143 //Maximum time the server will wait for a subsequent
144 //request before closing the connection
145 #ifndef HTTP_SERVER_IDLE_TIMEOUT
146  #define HTTP_SERVER_IDLE_TIMEOUT 5000
147 #elif (HTTP_SERVER_IDLE_TIMEOUT < 1000)
148  #error HTTP_SERVER_IDLE_TIMEOUT parameter is not valid
149 #endif
150 
151 //Maximum length of the pending connection queue
152 #ifndef HTTP_SERVER_BACKLOG
153  #define HTTP_SERVER_BACKLOG 4
154 #elif (HTTP_SERVER_BACKLOG < 1)
155  #error HTTP_SERVER_BACKLOG parameter is not valid
156 #endif
157 
158 //Maximum number of requests per connection
159 #ifndef HTTP_SERVER_MAX_REQUESTS
160  #define HTTP_SERVER_MAX_REQUESTS 1000
161 #elif (HTTP_SERVER_MAX_REQUESTS < 1)
162  #error HTTP_SERVER_MAX_REQUESTS parameter is not valid
163 #endif
164 
165 //Size of buffer used for input/output operations
166 #ifndef HTTP_SERVER_BUFFER_SIZE
167  #define HTTP_SERVER_BUFFER_SIZE 1024
168 #elif (HTTP_SERVER_BUFFER_SIZE < 128)
169  #error HTTP_SERVER_BUFFER_SIZE parameter is not valid
170 #endif
171 
172 //Maximum size of root directory
173 #ifndef HTTP_SERVER_ROOT_DIR_MAX_LEN
174  #define HTTP_SERVER_ROOT_DIR_MAX_LEN 31
175 #elif (HTTP_SERVER_ROOT_DIR_MAX_LEN < 7)
176  #error HTTP_SERVER_ROOT_DIR_MAX_LEN parameter is not valid
177 #endif
178 
179 //Maximum size of default index file
180 #ifndef HTTP_SERVER_DEFAULT_DOC_MAX_LEN
181  #define HTTP_SERVER_DEFAULT_DOC_MAX_LEN 31
182 #elif (HTTP_SERVER_DEFAULT_DOC_MAX_LEN < 7)
183  #error HTTP_SERVER_DEFAULT_DOC_MAX_LEN parameter is not valid
184 #endif
185 
186 //Maximum length of HTTP method
187 #ifndef HTTP_SERVER_METHOD_MAX_LEN
188  #define HTTP_SERVER_METHOD_MAX_LEN 7
189 #elif (HTTP_SERVER_METHOD_MAX_LEN < 1)
190  #error HTTP_SERVER_METHOD_MAX_LEN parameter is not valid
191 #endif
192 
193 //Maximum length of URI
194 #ifndef HTTP_SERVER_URI_MAX_LEN
195  #define HTTP_SERVER_URI_MAX_LEN 255
196 #elif (HTTP_SERVER_URI_MAX_LEN < 31)
197  #error HTTP_SERVER_URI_MAX_LEN parameter is not valid
198 #endif
199 
200 //Maximum length of query strings
201 #ifndef HTTP_SERVER_QUERY_STRING_MAX_LEN
202  #define HTTP_SERVER_QUERY_STRING_MAX_LEN 255
203 #elif (HTTP_SERVER_QUERY_STRING_MAX_LEN < 7)
204  #error HTTP_SERVER_QUERY_STRING_MAX_LEN parameter is not valid
205 #endif
206 
207 //Maximum host name length
208 #ifndef HTTP_SERVER_HOST_MAX_LEN
209  #define HTTP_SERVER_HOST_MAX_LEN 31
210 #elif (HTTP_SERVER_HOST_MAX_LEN < 7)
211  #error HTTP_SERVER_HOST_MAX_LEN parameter is not valid
212 #endif
213 
214 //Maximum user name length
215 #ifndef HTTP_SERVER_USERNAME_MAX_LEN
216  #define HTTP_SERVER_USERNAME_MAX_LEN 31
217 #elif (HTTP_SERVER_USERNAME_MAX_LEN < 7)
218  #error HTTP_SERVER_USERNAME_MAX_LEN parameter is not valid
219 #endif
220 
221 //Maximum length of CGI parameters
222 #ifndef HTTP_SERVER_CGI_PARAM_MAX_LEN
223  #define HTTP_SERVER_CGI_PARAM_MAX_LEN 31
224 #elif (HTTP_SERVER_CGI_PARAM_MAX_LEN < 7)
225  #error HTTP_SERVER_CGI_PARAM_MAX_LEN parameter is not valid
226 #endif
227 
228 //Maximum recursion limit
229 #ifndef HTTP_SERVER_SSI_MAX_RECURSION
230  #define HTTP_SERVER_SSI_MAX_RECURSION 3
231 #elif (HTTP_SERVER_SSI_MAX_RECURSION < 1 || HTTP_SERVER_SSI_MAX_RECURSION > 8)
232  #error HTTP_SERVER_SSI_MAX_RECURSION parameter is not valid
233 #endif
234 
235 //Maximum age for static resources
236 #ifndef HTTP_SERVER_MAX_AGE
237  #define HTTP_SERVER_MAX_AGE 0
238 #elif (HTTP_SERVER_MAX_AGE < 0)
239  #error HTTP_SERVER_MAX_AGE parameter is not valid
240 #endif
241 
242 //Nonce cache size
243 #ifndef HTTP_SERVER_NONCE_CACHE_SIZE
244  #define HTTP_SERVER_NONCE_CACHE_SIZE 8
245 #elif (HTTP_SERVER_NONCE_CACHE_SIZE < 1)
246  #error HTTP_SERVER_NONCE_CACHE_SIZE parameter is not valid
247 #endif
248 
249 //Lifetime of nonces
250 #ifndef HTTP_SERVER_NONCE_LIFETIME
251  #define HTTP_SERVER_NONCE_LIFETIME 60000
252 #elif (HTTP_SERVER_NONCE_LIFETIME < 1000)
253  #error HTTP_SERVER_NONCE_LIFETIME parameter is not valid
254 #endif
255 
256 //Nonce size
257 #ifndef HTTP_SERVER_NONCE_SIZE
258  #define HTTP_SERVER_NONCE_SIZE 16
259 #elif (HTTP_SERVER_NONCE_SIZE < 1)
260  #error HTTP_SERVER_NONCE_SIZE parameter is not valid
261 #endif
262 
263 //Maximum length for boundary string
264 #ifndef HTTP_SERVER_BOUNDARY_MAX_LEN
265  #define HTTP_SERVER_BOUNDARY_MAX_LEN 70
266 #elif (HTTP_SERVER_BOUNDARY_MAX_LEN < 1)
267  #error HTTP_SERVER_BOUNDARY_MAX_LEN parameter is not valid
268 #endif
269 
270 //Maximum length for cookies
271 #ifndef HTTP_SERVER_COOKIE_MAX_LEN
272  #define HTTP_SERVER_COOKIE_MAX_LEN 256
273 #elif (HTTP_SERVER_COOKIE_MAX_LEN < 1)
274  #error HTTP_SERVER_COOKIE_MAX_LEN parameter is not valid
275 #endif
276 
277 //Application specific context
278 #ifndef HTTP_SERVER_PRIVATE_CONTEXT
279  #define HTTP_SERVER_PRIVATE_CONTEXT
280 #endif
281 
282 //File system support?
283 #if (HTTP_SERVER_FS_SUPPORT == ENABLED)
284  #include "fs_port.h"
285 #else
286  #include "resource_manager.h"
287 #endif
288 
289 //TLS supported?
290 #if (HTTP_SERVER_TLS_SUPPORT == ENABLED)
291  #include "core/crypto.h"
292  #include "tls.h"
293  #include "tls_ticket.h"
294 #endif
295 
296 //Basic authentication supported?
297 #if (HTTP_SERVER_BASIC_AUTH_SUPPORT == ENABLED)
298  #include "core/crypto.h"
299  #include "encoding/base64.h"
300 #endif
301 
302 //Digest authentication supported?
303 #if (HTTP_SERVER_DIGEST_AUTH_SUPPORT == ENABLED)
304  #include "core/crypto.h"
305  #include "hash/md5.h"
306 #endif
307 
308 //WebSocket supported?
309 #if (HTTP_SERVER_WEB_SOCKET_SUPPORT == ENABLED)
310  #include "core/crypto.h"
311  #include "encoding/base64.h"
312 #endif
313 
314 //HTTP port number
315 #define HTTP_PORT 80
316 //HTTPS port number (HTTP over TLS)
317 #define HTTPS_PORT 443
318 
319 //Forward declaration of HttpServerContext structure
320 struct _HttpServerContext;
321 #define HttpServerContext struct _HttpServerContext
322 
323 //Forward declaration of HttpConnection structure
324 struct _HttpConnection;
325 #define HttpConnection struct _HttpConnection
326 
327 //C++ guard
328 #ifdef __cplusplus
329 extern "C" {
330 #endif
331 
332 
333 /**
334  * @brief Access status
335  **/
336 
337 typedef enum
338 {
344 
345 
346 /**
347  * @brief HTTP connection states
348  **/
349 
350 typedef enum
351 {
361 
362 
363 //The HTTP_FLAG_BREAK macro causes the httpReadStream() function to stop
364 //reading data whenever the specified break character is encountered
365 #define HTTP_FLAG_BREAK(c) (HTTP_FLAG_BREAK_CHAR | LSB(c))
366 
367 
368 //TLS supported?
369 #if (HTTP_SERVER_TLS_SUPPORT == ENABLED)
370 
371 /**
372  * @brief TLS initialization callback function
373  **/
374 
375 typedef error_t (*TlsInitCallback)(HttpConnection *connection,
377 
378 #endif
379 
380 
381 /**
382  * @brief Random data generation callback function
383  **/
384 
385 typedef error_t (*HttpRandCallback)(uint8_t *data, size_t length);
386 
387 
388 /**
389  * @brief HTTP authentication callback function
390  **/
391 
393  const char_t *user, const char_t *uri);
394 
395 
396 /**
397  * @brief CGI callback function
398  **/
399 
400 typedef error_t (*HttpCgiCallback)(HttpConnection *connection,
401  const char_t *param);
402 
403 
404 /**
405  * @brief HTTP request callback function
406  **/
407 
409  const char_t *uri);
410 
411 
412 /**
413  * @brief URI not found callback function
414  **/
415 
417  const char_t *uri);
418 
419 
420 /**
421  * @brief HTTP status code
422  **/
423 
424 typedef struct
425 {
427  const char_t message[28];
429 
430 
431 /**
432  * @brief Authorization header
433  **/
434 
435 typedef struct
436 {
437  bool_t found; ///<The Authorization header has been found
438  HttpAuthMode mode; ///<Authentication scheme
439  char_t user[HTTP_SERVER_USERNAME_MAX_LEN + 1]; ///<User name
440 #if (HTTP_SERVER_BASIC_AUTH_SUPPORT == ENABLED)
441  const char_t *password; ///<Password
442 #endif
443 #if (HTTP_SERVER_DIGEST_AUTH_SUPPORT == ENABLED)
444  const char_t *realm;
445  const char_t *nonce; ///<Server nonce
446  const char_t *uri; ///<Digest URI
447  const char_t *qop;
448  const char_t *nc; ///<Nonce count
449  const char_t *cnonce; ///<Client nonce
450  const char_t *response;
451  const char_t *opaque;
452 #endif
454 
455 
456 /**
457  * @brief Authenticate header
458  **/
459 
460 typedef struct
461 {
462  HttpAuthMode mode; ///<Authentication scheme
463 #if (HTTP_SERVER_DIGEST_AUTH_SUPPORT == ENABLED)
464  bool_t stale; ///<STALE flag
465 #endif
467 
468 
469 /**
470  * @brief HTTP request
471  **/
472 
473 typedef struct
474 {
475  uint_t version; ///<HTTP version number
476  char_t method[HTTP_SERVER_METHOD_MAX_LEN + 1]; ///<HTTP method
477  char_t uri[HTTP_SERVER_URI_MAX_LEN + 1]; ///<Resource identifier
478  char_t queryString[HTTP_SERVER_QUERY_STRING_MAX_LEN + 1]; ///<Query string
479  char_t host[HTTP_SERVER_HOST_MAX_LEN + 1]; ///<Host name
483  size_t byteCount;
486 #if (HTTP_SERVER_BASIC_AUTH_SUPPORT == ENABLED || HTTP_SERVER_DIGEST_AUTH_SUPPORT == ENABLED)
487  HttpAuthorizationHeader auth; ///<Authorization header
488 #endif
489 #if (HTTP_SERVER_WEB_SOCKET_SUPPORT == ENABLED)
493 #endif
494 #if (HTTP_SERVER_GZIP_TYPE_SUPPORT == ENABLED)
496 #endif
497 #if (HTTP_SERVER_MULTIPART_TYPE_SUPPORT == ENABLED)
498  char_t boundary[HTTP_SERVER_BOUNDARY_MAX_LEN + 1]; ///<Boundary string
499  size_t boundaryLength; ///<Boundary string length
500 #endif
501 #if (HTTP_SERVER_COOKIE_SUPPORT == ENABLED)
502  char_t cookie[HTTP_SERVER_COOKIE_MAX_LEN + 1]; ///<Cookie header field
503 #endif
504 } HttpRequest;
505 
506 
507 /**
508  * @brief HTTP response
509  **/
510 
511 typedef struct
512 {
513  uint_t version; ///<HTTP version number
514  uint_t statusCode; ///<HTTP status code
518  const char_t *location;
522  size_t byteCount;
523 #if (HTTP_SERVER_BASIC_AUTH_SUPPORT == ENABLED || HTTP_SERVER_DIGEST_AUTH_SUPPORT == ENABLED)
524  HttpAuthenticateHeader auth; ///<Authenticate header
525 #endif
526 #if (HTTP_SERVER_GZIP_TYPE_SUPPORT == ENABLED)
528 #endif
529 #if (HTTP_SERVER_COOKIE_SUPPORT == ENABLED)
530  char_t setCookie[HTTP_SERVER_COOKIE_MAX_LEN + 1]; ///<Set-Cookie header field
531 #endif
532 } HttpResponse;
533 
534 
535 /**
536  * @brief HTTP server settings
537  **/
538 
539 typedef struct
540 {
541  NetInterface *interface; ///<Underlying network interface
542  uint16_t port; ///<HTTP server port number
543  IpAddr ipAddr; ///<HTTP server IP address
544  uint_t backlog; ///<Maximum length of the pending connection queue
545  uint_t maxConnections; ///<Maximum number of client connections
546  HttpConnection *connections; ///<Client connections
547  char_t rootDirectory[HTTP_SERVER_ROOT_DIR_MAX_LEN + 1]; ///<Web root directory
548  char_t defaultDocument[HTTP_SERVER_DEFAULT_DOC_MAX_LEN + 1]; ///<Default home page
549 #if (HTTP_SERVER_TLS_SUPPORT == ENABLED)
550  bool_t useTls; ///<Deprecated flag
551  TlsInitCallback tlsInitCallback; ///<TLS initialization callback function
552 #endif
553 #if (HTTP_SERVER_BASIC_AUTH_SUPPORT == ENABLED || HTTP_SERVER_DIGEST_AUTH_SUPPORT == ENABLED)
554  HttpRandCallback randCallback; ///<Random data generation callback function
555  HttpAuthCallback authCallback; ///<HTTP authentication callback function
556 #endif
557  HttpCgiCallback cgiCallback; ///<CGI callback function
558  HttpRequestCallback requestCallback; ///<HTTP request callback function
559  HttpUriNotFoundCallback uriNotFoundCallback; ///<URI not found callback function
561 
562 
563 /**
564  * @brief Nonce cache entry
565  **/
566 
567 typedef struct
568 {
569  char_t nonce[HTTP_SERVER_NONCE_SIZE * 2 + 1]; ///<Nonce
570  uint32_t count; ///<Nonce count
571  systime_t timestamp; ///<Time stamp to manage entry lifetime
573 
574 
575 /**
576  * @brief HTTP server context
577  **/
578 
580 {
581  HttpServerSettings settings; ///<User settings
582  OsSemaphore semaphore; ///<Semaphore limiting the number of connections
583  OsTaskId taskId; ///<Task identifier
584 #if (OS_STATIC_TASK_SUPPORT == ENABLED)
585  OsTaskTcb taskTcb; ///<Task control block
587 #endif
588  Socket *socket; ///<Listening socket
589  HttpConnection *connections; ///<Client connections
590 #if (HTTP_SERVER_TLS_SUPPORT == ENABLED && TLS_TICKET_SUPPORT == ENABLED)
591  TlsTicketContext tlsTicketContext; ///<TLS ticket encryption context
592 #endif
593 #if (HTTP_SERVER_DIGEST_AUTH_SUPPORT == ENABLED)
594  OsMutex nonceCacheMutex; ///<Mutex preventing simultaneous access to the nonce cache
596 #endif
597 };
598 
599 
600 /**
601  * @brief HTTP connection
602  *
603  * An HttpConnection instance represents one
604  * transaction with an HTTP client
605  *
606  **/
607 
609 {
610  HttpServerSettings *settings; ///<Reference to the HTTP server settings
611  HttpServerContext *serverContext; ///<Reference to the HTTP server context
614  OsTaskId taskId; ///<Task identifier
615 #if (OS_STATIC_TASK_SUPPORT == ENABLED)
616  OsTaskTcb taskTcb; ///<Task control block
618 #endif
619  Socket *socket; ///<Socket
620 #if (HTTP_SERVER_TLS_SUPPORT == ENABLED)
621  TlsContext *tlsContext; ///<TLS context
622 #endif
623  HttpRequest request; ///<Incoming HTTP request header
624  HttpResponse response; ///<HTTP response header
625  HttpAccessStatus status; ///<Access status
627  uint32_t dummy; ///<Force alignment of the buffer on 32-bit boundaries
628  char_t buffer[HTTP_SERVER_BUFFER_SIZE]; ///<Memory buffer for input/output operations
629 #if (NET_RTOS_SUPPORT == DISABLED)
630  HttpConnState state; ///<Connection state
632  size_t bufferPos;
633  size_t bufferLen;
634  uint8_t *bodyStart;
635  size_t bodyPos;
636  size_t bodyLen;
637 #endif
638  HTTP_SERVER_PRIVATE_CONTEXT ///<Application specific context
639 };
640 
641 
642 //HTTP server related functions
646 
647 void httpListenerTask(void *param);
648 void httpConnectionTask(void *param);
649 
651 
653  void *data, size_t size, size_t *received, uint_t flags);
654 
656  const void *data, size_t length);
657 
659 
660 error_t httpSendResponse(HttpConnection *connection, const char_t *uri);
661 
663  uint_t statusCode, const char_t *message);
664 
666  uint_t statusCode, const char_t *uri);
667 
668 //HTTP authentication related functions
670  const char_t *password, HttpAuthMode mode);
671 
672 //WebSocket related functions
675 
676 //Miscellaneous functions
678  char_t *output, size_t outputSize);
679 
680 //C++ guard
681 #ifdef __cplusplus
682 }
683 #endif
684 
685 #endif
void httpServerGetDefaultSettings(HttpServerSettings *settings)
Initialize settings with default values.
Definition: http_server.c:63
uint8_t length
Definition: coap_common.h:193
size_t contentLength
Definition: http_server.h:482
error_t(* HttpCgiCallback)(HttpConnection *connection, const char_t *param)
CGI callback function.
Definition: http_server.h:400
int bool_t
Definition: compiler_port.h:53
HttpConnection * connections
Client connections.
Definition: http_server.h:589
OsSemaphore semaphore
Semaphore limiting the number of connections.
Definition: http_server.h:582
bool_t firstChunk
Definition: http_server.h:484
HttpAuthorizationHeader auth
Authorization header.
Definition: http_server.h:487
WebSocket * httpUpgradeToWebSocket(HttpConnection *connection)
Upgrade an existing HTTP connection to a WebSocket.
Definition: http_server.c:1281
#define HTTP_SERVER_NONCE_SIZE
Definition: http_server.h:258
error_t(* TlsInitCallback)(HttpConnection *connection, TlsContext *tlsContext)
TLS initialization callback function.
Definition: http_server.h:375
uint8_t data[]
Definition: ethernet.h:220
#define HTTP_SERVER_COOKIE_MAX_LEN
Definition: http_server.h:272
HttpResponse response
HTTP response header.
Definition: http_server.h:624
#define WEB_SOCKET_CLIENT_KEY_SIZE
Definition: web_socket.h:171
bool_t useTls
Deprecated flag.
Definition: http_server.h:550
IP network address.
Definition: ip.h:79
HttpServerSettings settings
User settings.
Definition: http_server.h:581
#define HTTP_SERVER_PRIVATE_CONTEXT
Definition: http_server.h:279
systime_t timestamp
Time stamp to manage entry lifetime.
Definition: http_server.h:571
HttpRandCallback randCallback
Random data generation callback function.
Definition: http_server.h:554
WebSocket API (client and server)
bool_t connectionUpgrade
Definition: http_server.h:491
bool_t upgradeWebSocket
Definition: http_server.h:490
#define HttpServerContext
Definition: http_server.h:321
Event object.
HttpRequestCallback requestCallback
HTTP request callback function.
Definition: http_server.h:558
#define HTTP_SERVER_HOST_MAX_LEN
Definition: http_server.h:209
HttpConnection * connections
Client connections.
Definition: http_server.h:546
Authenticate header.
Definition: http_server.h:461
HTTP connection.
Definition: http_server.h:609
#define HTTP_SERVER_URI_MAX_LEN
Definition: http_server.h:195
char_t cgiParam[HTTP_SERVER_CGI_PARAM_MAX_LEN+1]
CGI parameter.
Definition: http_server.h:626
@ HTTP_ACCESS_ALLOWED
Definition: http_server.h:340
HttpAccessStatus status
Access status.
Definition: http_server.h:625
Semaphore object.
OsEvent startEvent
Definition: http_server.h:612
error_t httpServerStart(HttpServerContext *context)
Start HTTP server.
Definition: http_server.c:210
bool_t chunkedEncoding
Definition: http_server.h:481
Socket * socket
Listening socket.
Definition: http_server.h:588
HttpRequest request
Incoming HTTP request header.
Definition: http_server.h:623
HTTP response.
Definition: http_server.h:512
bool_t chunkedEncoding
Definition: http_server.h:520
error_t(* HttpRequestCallback)(HttpConnection *connection, const char_t *uri)
HTTP request callback function.
Definition: http_server.h:408
Socket * socket
Socket.
Definition: http_server.h:619
const char_t * password
Password.
Definition: http_server.h:441
Session ticket encryption context.
Definition: tls_ticket.h:91
TlsInitCallback tlsInitCallback
TLS initialization callback function.
Definition: http_server.h:551
HttpAccessStatus(* HttpAuthCallback)(HttpConnection *connection, const char_t *user, const char_t *uri)
HTTP authentication callback function.
Definition: http_server.h:392
uint_t statusCode
HTTP status code.
Definition: http_server.h:514
error_t(* HttpUriNotFoundCallback)(HttpConnection *connection, const char_t *uri)
URI not found callback function.
Definition: http_server.h:416
@ HTTP_ACCESS_DIGEST_AUTH_REQUIRED
Definition: http_server.h:342
#define TlsContext
Definition: tls.h:36
@ HTTP_CONN_STATE_REQ_BODY
Definition: http_server.h:355
error_t
Error codes.
Definition: error.h:43
#define HTTP_SERVER_NONCE_CACHE_SIZE
Definition: http_server.h:244
#define HttpConnection
Definition: http_server.h:325
OsMutex nonceCacheMutex
Mutex preventing simultaneous access to the nonce cache.
Definition: http_server.h:594
@ HTTP_CONN_STATE_RESP_BODY
Definition: http_server.h:357
const char_t * realm
Definition: http_server.h:444
OsTaskTcb taskTcb
Task control block.
Definition: http_server.h:585
uint16_t statusCode
HTTP status code.
Definition: http_server.h:425
HttpAccessStatus
Access status.
Definition: http_server.h:338
#define HTTP_SERVER_ROOT_DIR_MAX_LEN
Definition: http_server.h:174
Task control block.
Nonce cache entry.
Definition: http_server.h:568
#define NetInterface
Definition: net.h:36
uint32_t dummy
Force alignment of the buffer on 32-bit boundaries.
Definition: http_server.h:627
const char_t * opaque
Definition: http_server.h:451
@ HTTP_CONN_STATE_RESP_HEADER
Definition: http_server.h:356
Authorization header.
Definition: http_server.h:436
General definitions for cryptographic algorithms.
uint32_t OsStackType
Stack data type.
bool_t acceptGzipEncoding
Definition: http_server.h:495
Base64 encoding scheme.
HTTP server settings.
Definition: http_server.h:540
uint16_t port
HTTP server port number.
Definition: http_server.h:542
TlsContext * tlsContext
TLS context.
Definition: http_server.h:621
#define HTTP_SERVER_USERNAME_MAX_LEN
Definition: http_server.h:216
systime_t timestamp
Definition: http_server.h:631
HttpNonceCacheEntry nonceCache[HTTP_SERVER_NONCE_CACHE_SIZE]
Nonce cache.
Definition: http_server.h:595
const char_t * nc
Nonce count.
Definition: http_server.h:448
#define WebSocket
Definition: web_socket.h:177
HttpAuthMode mode
Authentication scheme.
Definition: http_server.h:462
HttpServerSettings * settings
Reference to the HTTP server settings.
Definition: http_server.h:610
uint8_t * bodyStart
Definition: http_server.h:634
File system abstraction layer.
TLS session tickets.
IpAddr ipAddr
HTTP server IP address.
Definition: http_server.h:543
HTTP server context.
Definition: http_server.h:580
uint_t backlog
Maximum length of the pending connection queue.
Definition: http_server.h:544
HttpCgiCallback cgiCallback
CGI callback function.
Definition: http_server.h:557
bool_t found
The Authorization header has been found.
Definition: http_server.h:437
@ HTTP_CONN_STATE_REQ_HEADER
Definition: http_server.h:354
Mutex object.
uint32_t count
Nonce count.
Definition: http_server.h:570
uint32_t systime_t
System time.
Definitions common to HTTP client and server.
uint8_t flags
Definition: tcp.h:349
OsTaskId taskId
Task identifier.
Definition: http_server.h:583
TlsTicketContext tlsTicketContext
TLS ticket encryption context.
Definition: http_server.h:591
char char_t
Definition: compiler_port.h:48
bool_t keepAlive
Definition: http_server.h:480
error_t httpCloseStream(HttpConnection *connection)
Close output stream.
Definition: http_server.c:868
const char_t * location
Definition: http_server.h:518
uint_t version
HTTP version number.
Definition: http_server.h:475
OsStackType taskStack[HTTP_SERVER_STACK_SIZE]
Task stack.
Definition: http_server.h:586
@ HTTP_CONN_STATE_REQ_LINE
Definition: http_server.h:353
error_t httpReadStream(HttpConnection *connection, void *data, size_t size, size_t *received, uint_t flags)
Read data from client request.
Definition: http_server.c:697
uint_t version
HTTP version number.
Definition: http_server.h:513
size_t contentLength
Definition: http_server.h:521
HTTP request.
Definition: http_server.h:474
error_t httpWriteStream(HttpConnection *connection, const void *data, size_t length)
Write data to the client.
Definition: http_server.c:803
error_t httpSendRedirectResponse(HttpConnection *connection, uint_t statusCode, const char_t *uri)
Send redirect response to the client.
Definition: http_server.c:1167
void httpConnectionTask(void *param)
Task that services requests from an active connection.
Definition: http_server.c:348
@ HTTP_CONN_STATE_SHUTDOWN
Definition: http_server.h:358
MD5 (Message-Digest Algorithm)
HttpAuthCallback authCallback
HTTP authentication callback function.
Definition: http_server.h:555
error_t httpSendResponse(HttpConnection *connection, const char_t *uri)
Send HTTP response.
Definition: http_server.c:896
#define HTTP_SERVER_QUERY_STRING_MAX_LEN
Definition: http_server.h:202
bool_t httpCheckPassword(HttpConnection *connection, const char_t *password, HttpAuthMode mode)
Password verification.
#define HTTP_SERVER_METHOD_MAX_LEN
Definition: http_server.h:188
#define Socket
Definition: socket.h:36
uint_t maxConnections
Maximum number of client connections.
Definition: http_server.h:545
error_t(* HttpRandCallback)(uint8_t *data, size_t length)
Random data generation callback function.
Definition: http_server.h:385
NetInterface * interface
Underlying network interface.
Definition: http_server.h:541
const char_t * contentType
Definition: http_server.h:519
uint8_t message[]
Definition: chap.h:152
const char_t * cnonce
Client nonce.
Definition: http_server.h:449
char_t buffer[HTTP_SERVER_BUFFER_SIZE]
Memory buffer for input/output operations.
Definition: http_server.h:628
HttpConnState state
Connection state.
Definition: http_server.h:630
TLS (Transport Layer Security)
uint8_t cookie[]
Definition: dtls_misc.h:204
Socket API.
size_t byteCount
Definition: http_server.h:522
OsTaskId taskId
Task identifier.
Definition: http_server.h:614
OsStackType taskStack[HTTP_SERVER_STACK_SIZE]
Task stack.
Definition: http_server.h:617
bool_t gzipEncoding
Definition: http_server.h:527
bool_t lastChunk
Definition: http_server.h:485
size_t boundaryLength
Boundary string length.
Definition: http_server.h:499
@ HTTP_CONN_STATE_IDLE
Definition: http_server.h:352
bool_t httpCheckWebSocketHandshake(HttpConnection *connection)
Check whether the client's handshake is valid.
Definition: http_server.c:1232
#define HTTP_SERVER_BUFFER_SIZE
Definition: http_server.h:167
#define HTTP_SERVER_DEFAULT_DOC_MAX_LEN
Definition: http_server.h:181
uint8_t mode
Definition: ntp_common.h:149
error_t httpWriteHeader(HttpConnection *connection)
Send HTTP response header.
Definition: http_server.c:658
@ HTTP_CONN_STATE_CLOSE
Definition: http_server.h:359
HttpAuthMode mode
Authentication scheme.
Definition: http_server.h:438
error_t httpDecodePercentEncodedString(const char_t *input, char_t *output, size_t outputSize)
Decode a percent-encoded string.
size_t byteCount
Definition: http_server.h:483
thread_t * OsTaskId
Task identifier.
const char_t * qop
Definition: http_server.h:447
@ HTTP_ACCESS_DENIED
Definition: http_server.h:339
OsTaskTcb taskTcb
Task control block.
Definition: http_server.h:616
HttpServerContext * serverContext
Reference to the HTTP server context.
Definition: http_server.h:611
Embedded resource management.
bool_t keepAlive
Definition: http_server.h:515
unsigned int uint_t
Definition: compiler_port.h:50
HttpConnState
HTTP connection states.
Definition: http_server.h:351
void httpListenerTask(void *param)
HTTP server listener task.
Definition: http_server.c:269
#define HTTP_SERVER_STACK_SIZE
Definition: http_server.h:126
error_t httpServerInit(HttpServerContext *context, const HttpServerSettings *settings)
HTTP server initialization.
Definition: http_server.c:112
HttpAuthMode
HTTP authentication schemes.
Definition: http_common.h:72
const char_t * nonce
Server nonce.
Definition: http_server.h:445
const char_t * response
Definition: http_server.h:450
const char_t * uri
Digest URI.
Definition: http_server.h:446
RTOS abstraction layer.
bool_t noCache
Definition: http_server.h:516
HttpAuthenticateHeader auth
Authenticate header.
Definition: http_server.h:524
#define HTTP_SERVER_BOUNDARY_MAX_LEN
Definition: http_server.h:265
@ HTTP_ACCESS_BASIC_AUTH_REQUIRED
Definition: http_server.h:341
#define HTTP_SERVER_CGI_PARAM_MAX_LEN
Definition: http_server.h:223
uint_t maxAge
Definition: http_server.h:517
bool_t stale
STALE flag.
Definition: http_server.h:464
error_t httpSendErrorResponse(HttpConnection *connection, uint_t statusCode, const char_t *message)
Send error response to the client.
Definition: http_server.c:1101
HttpUriNotFoundCallback uriNotFoundCallback
URI not found callback function.
Definition: http_server.h:559