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-2024 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.4.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 //Maximum number of simultaneous client connections
137 #ifndef HTTP_SERVER_MAX_CONNECTIONS
138  #define HTTP_SERVER_MAX_CONNECTIONS 10
139 #elif (HTTP_SERVER_MAX_CONNECTIONS < 1)
140  #error HTTP_SERVER_MAX_CONNECTIONS parameter is not valid
141 #endif
142 
143 //HTTP connection timeout
144 #ifndef HTTP_SERVER_TIMEOUT
145  #define HTTP_SERVER_TIMEOUT 10000
146 #elif (HTTP_SERVER_TIMEOUT < 1000)
147  #error HTTP_SERVER_TIMEOUT parameter is not valid
148 #endif
149 
150 //Maximum time the server will wait for a subsequent
151 //request before closing the connection
152 #ifndef HTTP_SERVER_IDLE_TIMEOUT
153  #define HTTP_SERVER_IDLE_TIMEOUT 5000
154 #elif (HTTP_SERVER_IDLE_TIMEOUT < 1000)
155  #error HTTP_SERVER_IDLE_TIMEOUT parameter is not valid
156 #endif
157 
158 //Maximum length of the pending connection queue
159 #ifndef HTTP_SERVER_BACKLOG
160  #define HTTP_SERVER_BACKLOG 4
161 #elif (HTTP_SERVER_BACKLOG < 1)
162  #error HTTP_SERVER_BACKLOG parameter is not valid
163 #endif
164 
165 //Maximum number of requests per connection
166 #ifndef HTTP_SERVER_MAX_REQUESTS
167  #define HTTP_SERVER_MAX_REQUESTS 1000
168 #elif (HTTP_SERVER_MAX_REQUESTS < 1)
169  #error HTTP_SERVER_MAX_REQUESTS parameter is not valid
170 #endif
171 
172 //Size of buffer used for input/output operations
173 #ifndef HTTP_SERVER_BUFFER_SIZE
174  #define HTTP_SERVER_BUFFER_SIZE 1024
175 #elif (HTTP_SERVER_BUFFER_SIZE < 128)
176  #error HTTP_SERVER_BUFFER_SIZE parameter is not valid
177 #endif
178 
179 //Maximum size of root directory
180 #ifndef HTTP_SERVER_ROOT_DIR_MAX_LEN
181  #define HTTP_SERVER_ROOT_DIR_MAX_LEN 31
182 #elif (HTTP_SERVER_ROOT_DIR_MAX_LEN < 7)
183  #error HTTP_SERVER_ROOT_DIR_MAX_LEN parameter is not valid
184 #endif
185 
186 //Maximum size of default index file
187 #ifndef HTTP_SERVER_DEFAULT_DOC_MAX_LEN
188  #define HTTP_SERVER_DEFAULT_DOC_MAX_LEN 31
189 #elif (HTTP_SERVER_DEFAULT_DOC_MAX_LEN < 7)
190  #error HTTP_SERVER_DEFAULT_DOC_MAX_LEN parameter is not valid
191 #endif
192 
193 //Maximum length of HTTP method
194 #ifndef HTTP_SERVER_METHOD_MAX_LEN
195  #define HTTP_SERVER_METHOD_MAX_LEN 7
196 #elif (HTTP_SERVER_METHOD_MAX_LEN < 1)
197  #error HTTP_SERVER_METHOD_MAX_LEN parameter is not valid
198 #endif
199 
200 //Maximum length of URI
201 #ifndef HTTP_SERVER_URI_MAX_LEN
202  #define HTTP_SERVER_URI_MAX_LEN 255
203 #elif (HTTP_SERVER_URI_MAX_LEN < 31)
204  #error HTTP_SERVER_URI_MAX_LEN parameter is not valid
205 #endif
206 
207 //Maximum length of query strings
208 #ifndef HTTP_SERVER_QUERY_STRING_MAX_LEN
209  #define HTTP_SERVER_QUERY_STRING_MAX_LEN 255
210 #elif (HTTP_SERVER_QUERY_STRING_MAX_LEN < 7)
211  #error HTTP_SERVER_QUERY_STRING_MAX_LEN parameter is not valid
212 #endif
213 
214 //Maximum host name length
215 #ifndef HTTP_SERVER_HOST_MAX_LEN
216  #define HTTP_SERVER_HOST_MAX_LEN 31
217 #elif (HTTP_SERVER_HOST_MAX_LEN < 7)
218  #error HTTP_SERVER_HOST_MAX_LEN parameter is not valid
219 #endif
220 
221 //Maximum user name length
222 #ifndef HTTP_SERVER_USERNAME_MAX_LEN
223  #define HTTP_SERVER_USERNAME_MAX_LEN 31
224 #elif (HTTP_SERVER_USERNAME_MAX_LEN < 7)
225  #error HTTP_SERVER_USERNAME_MAX_LEN parameter is not valid
226 #endif
227 
228 //Maximum length of CGI parameters
229 #ifndef HTTP_SERVER_CGI_PARAM_MAX_LEN
230  #define HTTP_SERVER_CGI_PARAM_MAX_LEN 31
231 #elif (HTTP_SERVER_CGI_PARAM_MAX_LEN < 7)
232  #error HTTP_SERVER_CGI_PARAM_MAX_LEN parameter is not valid
233 #endif
234 
235 //Maximum recursion limit
236 #ifndef HTTP_SERVER_SSI_MAX_RECURSION
237  #define HTTP_SERVER_SSI_MAX_RECURSION 3
238 #elif (HTTP_SERVER_SSI_MAX_RECURSION < 1 || HTTP_SERVER_SSI_MAX_RECURSION > 8)
239  #error HTTP_SERVER_SSI_MAX_RECURSION parameter is not valid
240 #endif
241 
242 //Maximum age for static resources
243 #ifndef HTTP_SERVER_MAX_AGE
244  #define HTTP_SERVER_MAX_AGE 0
245 #elif (HTTP_SERVER_MAX_AGE < 0)
246  #error HTTP_SERVER_MAX_AGE parameter is not valid
247 #endif
248 
249 //Nonce cache size
250 #ifndef HTTP_SERVER_NONCE_CACHE_SIZE
251  #define HTTP_SERVER_NONCE_CACHE_SIZE 8
252 #elif (HTTP_SERVER_NONCE_CACHE_SIZE < 1)
253  #error HTTP_SERVER_NONCE_CACHE_SIZE parameter is not valid
254 #endif
255 
256 //Lifetime of nonces
257 #ifndef HTTP_SERVER_NONCE_LIFETIME
258  #define HTTP_SERVER_NONCE_LIFETIME 60000
259 #elif (HTTP_SERVER_NONCE_LIFETIME < 1000)
260  #error HTTP_SERVER_NONCE_LIFETIME parameter is not valid
261 #endif
262 
263 //Nonce size
264 #ifndef HTTP_SERVER_NONCE_SIZE
265  #define HTTP_SERVER_NONCE_SIZE 16
266 #elif (HTTP_SERVER_NONCE_SIZE < 1)
267  #error HTTP_SERVER_NONCE_SIZE parameter is not valid
268 #endif
269 
270 //Maximum length for boundary string
271 #ifndef HTTP_SERVER_BOUNDARY_MAX_LEN
272  #define HTTP_SERVER_BOUNDARY_MAX_LEN 70
273 #elif (HTTP_SERVER_BOUNDARY_MAX_LEN < 1)
274  #error HTTP_SERVER_BOUNDARY_MAX_LEN parameter is not valid
275 #endif
276 
277 //Maximum length for cookies
278 #ifndef HTTP_SERVER_COOKIE_MAX_LEN
279  #define HTTP_SERVER_COOKIE_MAX_LEN 256
280 #elif (HTTP_SERVER_COOKIE_MAX_LEN < 1)
281  #error HTTP_SERVER_COOKIE_MAX_LEN parameter is not valid
282 #endif
283 
284 //Application specific context
285 #ifndef HTTP_SERVER_PRIVATE_CONTEXT
286  #define HTTP_SERVER_PRIVATE_CONTEXT
287 #endif
288 
289 //File system support?
290 #if (HTTP_SERVER_FS_SUPPORT == ENABLED)
291  #include "fs_port.h"
292 #else
293  #include "resource_manager.h"
294 #endif
295 
296 //TLS supported?
297 #if (HTTP_SERVER_TLS_SUPPORT == ENABLED)
298  #include "core/crypto.h"
299  #include "tls.h"
300  #include "tls_ticket.h"
301 #endif
302 
303 //Basic authentication supported?
304 #if (HTTP_SERVER_BASIC_AUTH_SUPPORT == ENABLED)
305  #include "core/crypto.h"
306  #include "encoding/base64.h"
307 #endif
308 
309 //Digest authentication supported?
310 #if (HTTP_SERVER_DIGEST_AUTH_SUPPORT == ENABLED)
311  #include "core/crypto.h"
312  #include "hash/md5.h"
313 #endif
314 
315 //WebSocket supported?
316 #if (HTTP_SERVER_WEB_SOCKET_SUPPORT == ENABLED)
317  #include "core/crypto.h"
318  #include "encoding/base64.h"
319 #endif
320 
321 //HTTP port number
322 #define HTTP_PORT 80
323 //HTTPS port number (HTTP over TLS)
324 #define HTTPS_PORT 443
325 
326 //Forward declaration of HttpServerContext structure
327 struct _HttpServerContext;
328 #define HttpServerContext struct _HttpServerContext
329 
330 //Forward declaration of HttpConnection structure
331 struct _HttpConnection;
332 #define HttpConnection struct _HttpConnection
333 
334 //C++ guard
335 #ifdef __cplusplus
336 extern "C" {
337 #endif
338 
339 
340 /**
341  * @brief Access status
342  **/
343 
344 typedef enum
345 {
351 
352 
353 /**
354  * @brief HTTP connection states
355  **/
356 
357 typedef enum
358 {
368 
369 
370 //The HTTP_FLAG_BREAK macro causes the httpReadStream() function to stop
371 //reading data whenever the specified break character is encountered
372 #define HTTP_FLAG_BREAK(c) (HTTP_FLAG_BREAK_CHAR | LSB(c))
373 
374 
375 //TLS supported?
376 #if (HTTP_SERVER_TLS_SUPPORT == ENABLED)
377 
378 /**
379  * @brief TLS initialization callback function
380  **/
381 
382 typedef error_t (*TlsInitCallback)(HttpConnection *connection,
384 
385 #endif
386 
387 
388 /**
389  * @brief Random data generation callback function
390  **/
391 
392 typedef error_t (*HttpRandCallback)(uint8_t *data, size_t length);
393 
394 
395 /**
396  * @brief HTTP authentication callback function
397  **/
398 
400  const char_t *user, const char_t *uri);
401 
402 
403 /**
404  * @brief CGI callback function
405  **/
406 
407 typedef error_t (*HttpCgiCallback)(HttpConnection *connection,
408  const char_t *param);
409 
410 
411 /**
412  * @brief HTTP request callback function
413  **/
414 
416  const char_t *uri);
417 
418 
419 /**
420  * @brief URI not found callback function
421  **/
422 
424  const char_t *uri);
425 
426 
427 /**
428  * @brief HTTP status code
429  **/
430 
431 typedef struct
432 {
434  const char_t message[28];
436 
437 
438 /**
439  * @brief Authorization header
440  **/
441 
442 typedef struct
443 {
444  bool_t found; ///<The Authorization header has been found
445  HttpAuthMode mode; ///<Authentication scheme
446  char_t user[HTTP_SERVER_USERNAME_MAX_LEN + 1]; ///<User name
447 #if (HTTP_SERVER_BASIC_AUTH_SUPPORT == ENABLED)
448  const char_t *password; ///<Password
449 #endif
450 #if (HTTP_SERVER_DIGEST_AUTH_SUPPORT == ENABLED)
451  const char_t *realm;
452  const char_t *nonce; ///<Server nonce
453  const char_t *uri; ///<Digest URI
454  const char_t *qop;
455  const char_t *nc; ///<Nonce count
456  const char_t *cnonce; ///<Client nonce
457  const char_t *response;
458  const char_t *opaque;
459 #endif
461 
462 
463 /**
464  * @brief Authenticate header
465  **/
466 
467 typedef struct
468 {
469  HttpAuthMode mode; ///<Authentication scheme
470 #if (HTTP_SERVER_DIGEST_AUTH_SUPPORT == ENABLED)
471  bool_t stale; ///<STALE flag
472 #endif
474 
475 
476 /**
477  * @brief HTTP request
478  **/
479 
480 typedef struct
481 {
482  uint_t version; ///<HTTP version number
483  char_t method[HTTP_SERVER_METHOD_MAX_LEN + 1]; ///<HTTP method
484  char_t uri[HTTP_SERVER_URI_MAX_LEN + 1]; ///<Resource identifier
485  char_t queryString[HTTP_SERVER_QUERY_STRING_MAX_LEN + 1]; ///<Query string
486  char_t host[HTTP_SERVER_HOST_MAX_LEN + 1]; ///<Host name
490  size_t byteCount;
493 #if (HTTP_SERVER_BASIC_AUTH_SUPPORT == ENABLED || HTTP_SERVER_DIGEST_AUTH_SUPPORT == ENABLED)
494  HttpAuthorizationHeader auth; ///<Authorization header
495 #endif
496 #if (HTTP_SERVER_WEB_SOCKET_SUPPORT == ENABLED)
500 #endif
501 #if (HTTP_SERVER_GZIP_TYPE_SUPPORT == ENABLED)
503 #endif
504 #if (HTTP_SERVER_MULTIPART_TYPE_SUPPORT == ENABLED)
505  char_t boundary[HTTP_SERVER_BOUNDARY_MAX_LEN + 1]; ///<Boundary string
506  size_t boundaryLength; ///<Boundary string length
507 #endif
508 #if (HTTP_SERVER_COOKIE_SUPPORT == ENABLED)
509  char_t cookie[HTTP_SERVER_COOKIE_MAX_LEN + 1]; ///<Cookie header field
510 #endif
511 } HttpRequest;
512 
513 
514 /**
515  * @brief HTTP response
516  **/
517 
518 typedef struct
519 {
520  uint_t version; ///<HTTP version number
521  uint_t statusCode; ///<HTTP status code
525  const char_t *location;
529  size_t byteCount;
530 #if (HTTP_SERVER_BASIC_AUTH_SUPPORT == ENABLED || HTTP_SERVER_DIGEST_AUTH_SUPPORT == ENABLED)
531  HttpAuthenticateHeader auth; ///<Authenticate header
532 #endif
533 #if (HTTP_SERVER_GZIP_TYPE_SUPPORT == ENABLED)
535 #endif
536 #if (HTTP_SERVER_COOKIE_SUPPORT == ENABLED)
537  char_t setCookie[HTTP_SERVER_COOKIE_MAX_LEN + 1]; ///<Set-Cookie header field
538 #endif
539 } HttpResponse;
540 
541 
542 /**
543  * @brief HTTP server settings
544  **/
545 
546 typedef struct
547 {
548  OsTaskParameters listenerTask; ///<Listener task parameters
549  OsTaskParameters connectionTask[HTTP_SERVER_MAX_CONNECTIONS]; ///<Connection task parameters
550  NetInterface *interface; ///<Underlying network interface
551  uint16_t port; ///<HTTP server port number
552  IpAddr ipAddr; ///<HTTP server IP address
553  uint_t backlog; ///<Maximum length of the pending connection queue
554  uint_t maxConnections; ///<Maximum number of client connections
555  HttpConnection *connections; ///<Client connections
556  char_t rootDirectory[HTTP_SERVER_ROOT_DIR_MAX_LEN + 1]; ///<Web root directory
557  char_t defaultDocument[HTTP_SERVER_DEFAULT_DOC_MAX_LEN + 1]; ///<Default home page
558 #if (HTTP_SERVER_TLS_SUPPORT == ENABLED)
559  bool_t useTls; ///<Deprecated flag
560  TlsInitCallback tlsInitCallback; ///<TLS initialization callback function
561 #endif
562 #if (HTTP_SERVER_BASIC_AUTH_SUPPORT == ENABLED || HTTP_SERVER_DIGEST_AUTH_SUPPORT == ENABLED)
563  HttpRandCallback randCallback; ///<Random data generation callback function
564  HttpAuthCallback authCallback; ///<HTTP authentication callback function
565 #endif
566  HttpCgiCallback cgiCallback; ///<CGI callback function
567  HttpRequestCallback requestCallback; ///<HTTP request callback function
568  HttpUriNotFoundCallback uriNotFoundCallback; ///<URI not found callback function
570 
571 
572 /**
573  * @brief Nonce cache entry
574  **/
575 
576 typedef struct
577 {
578  char_t nonce[HTTP_SERVER_NONCE_SIZE * 2 + 1]; ///<Nonce
579  uint32_t count; ///<Nonce count
580  systime_t timestamp; ///<Time stamp to manage entry lifetime
582 
583 
584 /**
585  * @brief HTTP server context
586  **/
587 
589 {
590  HttpServerSettings settings; ///<User settings
591  OsSemaphore semaphore; ///<Semaphore limiting the number of connections
592  OsTaskParameters taskParams; ///<Task parameters
593  OsTaskId taskId; ///<Task identifier
594  Socket *socket; ///<Listening socket
595  HttpConnection *connections; ///<Client connections
596 #if (HTTP_SERVER_TLS_SUPPORT == ENABLED && TLS_TICKET_SUPPORT == ENABLED)
597  TlsTicketContext tlsTicketContext; ///<TLS ticket encryption context
598 #endif
599 #if (HTTP_SERVER_DIGEST_AUTH_SUPPORT == ENABLED)
600  OsMutex nonceCacheMutex; ///<Mutex preventing simultaneous access to the nonce cache
602 #endif
603 };
604 
605 
606 /**
607  * @brief HTTP connection
608  *
609  * An HttpConnection instance represents one
610  * transaction with an HTTP client
611  *
612  **/
613 
615 {
616  HttpServerSettings *settings; ///<Reference to the HTTP server settings
617  HttpServerContext *serverContext; ///<Reference to the HTTP server context
620  OsTaskParameters taskParams; ///<Task parameters
621  OsTaskId taskId; ///<Task identifier
622  Socket *socket; ///<Socket
623 #if (HTTP_SERVER_TLS_SUPPORT == ENABLED)
624  TlsContext *tlsContext; ///<TLS context
625 #endif
626  HttpRequest request; ///<Incoming HTTP request header
627  HttpResponse response; ///<HTTP response header
628  HttpAccessStatus status; ///<Access status
630  uint32_t dummy; ///<Force alignment of the buffer on 32-bit boundaries
631  char_t buffer[HTTP_SERVER_BUFFER_SIZE]; ///<Memory buffer for input/output operations
632 #if (NET_RTOS_SUPPORT == DISABLED)
633  HttpConnState state; ///<Connection state
635  size_t bufferPos;
636  size_t bufferLen;
637  uint8_t *bodyStart;
638  size_t bodyPos;
639  size_t bodyLen;
640 #endif
641  HTTP_SERVER_PRIVATE_CONTEXT ///<Application specific context
642 };
643 
644 
645 //HTTP server related functions
649 
650 void httpListenerTask(void *param);
651 void httpConnectionTask(void *param);
652 
654 
656  void *data, size_t size, size_t *received, uint_t flags);
657 
659  const void *data, size_t length);
660 
662 
663 error_t httpSendResponse(HttpConnection *connection, const char_t *uri);
664 
666  uint_t statusCode, const char_t *message);
667 
669  uint_t statusCode, const char_t *uri);
670 
671 //HTTP authentication related functions
673  const char_t *password, HttpAuthMode mode);
674 
675 //WebSocket related functions
678 
679 //Miscellaneous functions
681  char_t *output, size_t outputSize);
682 
683 //C++ guard
684 #ifdef __cplusplus
685 }
686 #endif
687 
688 #endif
void httpServerGetDefaultSettings(HttpServerSettings *settings)
Initialize settings with default values.
Definition: http_server.c:62
size_t contentLength
Definition: http_server.h:489
error_t(* HttpCgiCallback)(HttpConnection *connection, const char_t *param)
CGI callback function.
Definition: http_server.h:407
int bool_t
Definition: compiler_port.h:53
HttpConnection * connections
Client connections.
Definition: http_server.h:595
OsSemaphore semaphore
Semaphore limiting the number of connections.
Definition: http_server.h:591
bool_t firstChunk
Definition: http_server.h:491
HttpAuthorizationHeader auth
Authorization header.
Definition: http_server.h:494
WebSocket * httpUpgradeToWebSocket(HttpConnection *connection)
Upgrade an existing HTTP connection to a WebSocket.
Definition: http_server.c:1295
#define HTTP_SERVER_NONCE_SIZE
Definition: http_server.h:265
error_t(* TlsInitCallback)(HttpConnection *connection, TlsContext *tlsContext)
TLS initialization callback function.
Definition: http_server.h:382
#define HTTP_SERVER_COOKIE_MAX_LEN
Definition: http_server.h:279
HttpResponse response
HTTP response header.
Definition: http_server.h:627
#define WEB_SOCKET_CLIENT_KEY_SIZE
Definition: web_socket.h:171
bool_t useTls
Deprecated flag.
Definition: http_server.h:559
IP network address.
Definition: ip.h:90
HttpServerSettings settings
User settings.
Definition: http_server.h:590
#define HTTP_SERVER_PRIVATE_CONTEXT
Definition: http_server.h:286
systime_t timestamp
Time stamp to manage entry lifetime.
Definition: http_server.h:580
HttpRandCallback randCallback
Random data generation callback function.
Definition: http_server.h:563
WebSocket API (client and server)
uint8_t message[]
Definition: chap.h:154
bool_t connectionUpgrade
Definition: http_server.h:498
uint8_t data[]
Definition: ethernet.h:222
bool_t upgradeWebSocket
Definition: http_server.h:497
#define HttpServerContext
Definition: http_server.h:328
Event object.
HttpRequestCallback requestCallback
HTTP request callback function.
Definition: http_server.h:567
#define HTTP_SERVER_HOST_MAX_LEN
Definition: http_server.h:216
HttpConnection * connections
Client connections.
Definition: http_server.h:555
Authenticate header.
Definition: http_server.h:468
HTTP connection.
Definition: http_server.h:615
#define HTTP_SERVER_URI_MAX_LEN
Definition: http_server.h:202
char_t cgiParam[HTTP_SERVER_CGI_PARAM_MAX_LEN+1]
CGI parameter.
Definition: http_server.h:629
@ HTTP_ACCESS_ALLOWED
Definition: http_server.h:347
HttpAccessStatus status
Access status.
Definition: http_server.h:628
Semaphore object.
OsEvent startEvent
Definition: http_server.h:618
error_t httpServerStart(HttpServerContext *context)
Start HTTP server.
Definition: http_server.c:236
bool_t chunkedEncoding
Definition: http_server.h:488
Socket * socket
Listening socket.
Definition: http_server.h:594
HttpRequest request
Incoming HTTP request header.
Definition: http_server.h:626
HTTP response.
Definition: http_server.h:519
bool_t chunkedEncoding
Definition: http_server.h:527
error_t(* HttpRequestCallback)(HttpConnection *connection, const char_t *uri)
HTTP request callback function.
Definition: http_server.h:415
Socket * socket
Socket.
Definition: http_server.h:622
const char_t * password
Password.
Definition: http_server.h:448
Session ticket encryption context.
Definition: tls_ticket.h:91
TlsInitCallback tlsInitCallback
TLS initialization callback function.
Definition: http_server.h:560
HttpAccessStatus(* HttpAuthCallback)(HttpConnection *connection, const char_t *user, const char_t *uri)
HTTP authentication callback function.
Definition: http_server.h:399
uint_t statusCode
HTTP status code.
Definition: http_server.h:521
error_t(* HttpUriNotFoundCallback)(HttpConnection *connection, const char_t *uri)
URI not found callback function.
Definition: http_server.h:423
@ HTTP_ACCESS_DIGEST_AUTH_REQUIRED
Definition: http_server.h:349
#define TlsContext
Definition: tls.h:36
@ HTTP_CONN_STATE_REQ_BODY
Definition: http_server.h:362
error_t
Error codes.
Definition: error.h:43
#define HTTP_SERVER_NONCE_CACHE_SIZE
Definition: http_server.h:251
#define HttpConnection
Definition: http_server.h:332
OsMutex nonceCacheMutex
Mutex preventing simultaneous access to the nonce cache.
Definition: http_server.h:600
OsTaskParameters taskParams
Task parameters.
Definition: http_server.h:620
@ HTTP_CONN_STATE_RESP_BODY
Definition: http_server.h:364
const char_t * realm
Definition: http_server.h:451
HTTP status code.
Definition: http_server.h:432
HttpAccessStatus
Access status.
Definition: http_server.h:345
#define HTTP_SERVER_ROOT_DIR_MAX_LEN
Definition: http_server.h:181
Nonce cache entry.
Definition: http_server.h:577
#define NetInterface
Definition: net.h:36
uint32_t dummy
Force alignment of the buffer on 32-bit boundaries.
Definition: http_server.h:630
const char_t * opaque
Definition: http_server.h:458
@ HTTP_CONN_STATE_RESP_HEADER
Definition: http_server.h:363
Authorization header.
Definition: http_server.h:443
General definitions for cryptographic algorithms.
bool_t acceptGzipEncoding
Definition: http_server.h:502
#define HTTP_SERVER_MAX_CONNECTIONS
Definition: http_server.h:138
Base64 encoding scheme.
HTTP server settings.
Definition: http_server.h:547
uint16_t port
HTTP server port number.
Definition: http_server.h:551
TlsContext * tlsContext
TLS context.
Definition: http_server.h:624
Task parameters.
#define HTTP_SERVER_USERNAME_MAX_LEN
Definition: http_server.h:223
systime_t timestamp
Definition: http_server.h:634
HttpNonceCacheEntry nonceCache[HTTP_SERVER_NONCE_CACHE_SIZE]
Nonce cache.
Definition: http_server.h:601
const char_t * nc
Nonce count.
Definition: http_server.h:455
uint8_t length
Definition: tcp.h:368
#define WebSocket
Definition: web_socket.h:177
HttpAuthMode mode
Authentication scheme.
Definition: http_server.h:469
HttpServerSettings * settings
Reference to the HTTP server settings.
Definition: http_server.h:616
uint8_t * bodyStart
Definition: http_server.h:637
OsTaskParameters listenerTask
Listener task parameters.
Definition: http_server.h:548
File system abstraction layer.
TLS session tickets.
IpAddr ipAddr
HTTP server IP address.
Definition: http_server.h:552
HTTP server context.
Definition: http_server.h:589
uint_t backlog
Maximum length of the pending connection queue.
Definition: http_server.h:553
HttpCgiCallback cgiCallback
CGI callback function.
Definition: http_server.h:566
bool_t found
The Authorization header has been found.
Definition: http_server.h:444
@ HTTP_CONN_STATE_REQ_HEADER
Definition: http_server.h:361
Mutex object.
uint32_t count
Nonce count.
Definition: http_server.h:579
uint32_t systime_t
System time.
Definitions common to HTTP client and server.
uint8_t flags
Definition: tcp.h:351
OsTaskId taskId
Task identifier.
Definition: http_server.h:593
TlsTicketContext tlsTicketContext
TLS ticket encryption context.
Definition: http_server.h:597
char char_t
Definition: compiler_port.h:48
bool_t keepAlive
Definition: http_server.h:487
error_t httpCloseStream(HttpConnection *connection)
Close output stream.
Definition: http_server.c:882
const char_t * location
Definition: http_server.h:525
uint_t version
HTTP version number.
Definition: http_server.h:482
@ HTTP_CONN_STATE_REQ_LINE
Definition: http_server.h:360
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:711
uint_t version
HTTP version number.
Definition: http_server.h:520
size_t contentLength
Definition: http_server.h:528
OsTaskParameters taskParams
Task parameters.
Definition: http_server.h:592
HTTP request.
Definition: http_server.h:481
error_t httpWriteStream(HttpConnection *connection, const void *data, size_t length)
Write data to the client.
Definition: http_server.c:817
error_t httpSendRedirectResponse(HttpConnection *connection, uint_t statusCode, const char_t *uri)
Send redirect response to the client.
Definition: http_server.c:1181
void httpConnectionTask(void *param)
Task that services requests from an active connection.
Definition: http_server.c:362
@ HTTP_CONN_STATE_SHUTDOWN
Definition: http_server.h:365
MD5 (Message-Digest Algorithm)
HttpAuthCallback authCallback
HTTP authentication callback function.
Definition: http_server.h:564
error_t httpSendResponse(HttpConnection *connection, const char_t *uri)
Send HTTP response.
Definition: http_server.c:910
#define HTTP_SERVER_QUERY_STRING_MAX_LEN
Definition: http_server.h:209
bool_t httpCheckPassword(HttpConnection *connection, const char_t *password, HttpAuthMode mode)
Password verification.
#define HTTP_SERVER_METHOD_MAX_LEN
Definition: http_server.h:195
#define Socket
Definition: socket.h:36
uint_t maxConnections
Maximum number of client connections.
Definition: http_server.h:554
error_t(* HttpRandCallback)(uint8_t *data, size_t length)
Random data generation callback function.
Definition: http_server.h:392
NetInterface * interface
Underlying network interface.
Definition: http_server.h:550
const char_t * contentType
Definition: http_server.h:526
const char_t * cnonce
Client nonce.
Definition: http_server.h:456
char_t buffer[HTTP_SERVER_BUFFER_SIZE]
Memory buffer for input/output operations.
Definition: http_server.h:631
HttpConnState state
Connection state.
Definition: http_server.h:633
TLS (Transport Layer Security)
uint8_t cookie[]
Definition: dtls_misc.h:206
Socket API.
size_t byteCount
Definition: http_server.h:529
OsTaskId taskId
Task identifier.
Definition: http_server.h:621
bool_t gzipEncoding
Definition: http_server.h:534
bool_t lastChunk
Definition: http_server.h:492
size_t boundaryLength
Boundary string length.
Definition: http_server.h:506
@ HTTP_CONN_STATE_IDLE
Definition: http_server.h:359
bool_t httpCheckWebSocketHandshake(HttpConnection *connection)
Check whether the client's handshake is valid.
Definition: http_server.c:1246
#define HTTP_SERVER_BUFFER_SIZE
Definition: http_server.h:174
#define HTTP_SERVER_DEFAULT_DOC_MAX_LEN
Definition: http_server.h:188
error_t httpWriteHeader(HttpConnection *connection)
Send HTTP response header.
Definition: http_server.c:672
@ HTTP_CONN_STATE_CLOSE
Definition: http_server.h:366
HttpAuthMode mode
Authentication scheme.
Definition: http_server.h:445
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:490
thread_t * OsTaskId
Task identifier.
const char_t * qop
Definition: http_server.h:454
@ HTTP_ACCESS_DENIED
Definition: http_server.h:346
HttpServerContext * serverContext
Reference to the HTTP server context.
Definition: http_server.h:617
Embedded resource management.
bool_t keepAlive
Definition: http_server.h:522
unsigned int uint_t
Definition: compiler_port.h:50
HttpConnState
HTTP connection states.
Definition: http_server.h:358
void httpListenerTask(void *param)
HTTP server listener task.
Definition: http_server.c:281
error_t httpServerInit(HttpServerContext *context, const HttpServerSettings *settings)
HTTP server initialization.
Definition: http_server.c:127
HttpAuthMode
HTTP authentication schemes.
Definition: http_common.h:72
const char_t * nonce
Server nonce.
Definition: http_server.h:452
const char_t * response
Definition: http_server.h:457
const char_t * uri
Digest URI.
Definition: http_server.h:453
RTOS abstraction layer.
bool_t noCache
Definition: http_server.h:523
HttpAuthenticateHeader auth
Authenticate header.
Definition: http_server.h:531
#define HTTP_SERVER_BOUNDARY_MAX_LEN
Definition: http_server.h:272
uint8_t nonce[]
Definition: ntp_common.h:233
@ HTTP_ACCESS_BASIC_AUTH_REQUIRED
Definition: http_server.h:348
#define HTTP_SERVER_CGI_PARAM_MAX_LEN
Definition: http_server.h:230
uint_t maxAge
Definition: http_server.h:524
bool_t stale
STALE flag.
Definition: http_server.h:471
error_t httpSendErrorResponse(HttpConnection *connection, uint_t statusCode, const char_t *message)
Send error response to the client.
Definition: http_server.c:1115
HttpUriNotFoundCallback uriNotFoundCallback
URI not found callback function.
Definition: http_server.h:568