microhttpd2_preamble.h.in (140032B)
1 /* SPDX-License-Identifier: LGPL-2.1-or-later OR (GPL-2.0-or-later WITH eCos-exception-2.0) */ 2 /* 3 This file is part of GNU libmicrohttpd. 4 Copyright (C) 2006-2026 Christian Grothoff, Karlson2k (Evgeny Grin) 5 (and other contributing authors) 6 7 GNU libmicrohttpd is free software; you can redistribute it and/or 8 modify it under the terms of the GNU Lesser General Public 9 License as published by the Free Software Foundation; either 10 version 2.1 of the License, or (at your option) any later version. 11 12 GNU libmicrohttpd is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 Lesser General Public License for more details. 16 17 Alternatively, you can redistribute GNU libmicrohttpd and/or 18 modify it under the terms of the GNU General Public License as 19 published by the Free Software Foundation; either version 2 of 20 the License, or (at your option) any later version, together 21 with the eCos exception, as follows: 22 23 As a special exception, if other files instantiate templates or 24 use macros or inline functions from this file, or you compile this 25 file and link it with other works to produce a work based on this 26 file, this file does not by itself cause the resulting work to be 27 covered by the GNU General Public License. However the source code 28 for this file must still be made available in accordance with 29 section (3) of the GNU General Public License v2. 30 31 This exception does not invalidate any other reasons why a work 32 based on this file might be covered by the GNU General Public 33 License. 34 35 You should have received copies of the GNU Lesser General Public 36 License and the GNU General Public License along with this library; 37 if not, see <https://www.gnu.org/licenses/>. 38 */ 39 40 /* 41 Main goals for the libmicrohttpd 2.0 API: 42 43 - simplify application callbacks by splitting header/upload/post 44 functionality currently provided by calling the same 45 MHD_AccessHandlerCallback 3+ times into separate callbacks. 46 - keep the API very simple for simple requests, but allow 47 more complex logic to be incrementally introduced 48 (via new struct MHD_Action construction) 49 - avoid repeated scans for URL matches via the new 50 struct MHD_Action construction 51 - better types, in particular avoid varargs for options 52 - make it harder to pass inconsistent options 53 - combine options and flags into more uniform API (at least 54 exterally!) 55 - simplify API use by using sane defaults (benefiting from 56 breaking backwards compatibility) and making all options 57 really optional, and where applicable avoid having options 58 where the default works if nothing is specified 59 - simplify API by moving rarely used http_version into 60 MHD_request_get_info_fixed() 61 - avoid 'int' for MHD_YES/MHD_NO by introducing `enum MHD_Bool` 62 - improve terminology by eliminating confusion between 63 'request' and 'connection'; add 'session' for HTTP2/3; 64 use clear separation between connection and request. Do not mix the kind 65 data in the callbacks. Currently we are mixing things in 66 MHD_AccessHandlerCallback and MHD_RequestCompletedCallback. Instead of 67 pointers to struct MHD_Connection we should use pointers to (new) struct 68 MHD_Request. 69 - prepare API for having multiple TLS backends 70 - use more consistent prefixes for related functions 71 by using MHD_subject_verb_object naming convention, also 72 at the same time avoid symbol conflict with legacy names 73 (so we can have one binary implementing old and new 74 library API at the same time via compatibility layer). 75 - make it impossible to queue a response at the wrong time 76 - make it impossible to suspend a connection/request at the 77 wrong time (improves thread-safety) 78 - make it clear which response status codes are "properly" 79 supported (include the descriptive string) by using an enum; 80 - simplify API for common-case of one-shot responses by 81 eliminating need for destroy response in most cases; 82 - avoid fixed types, like uint32_t. They may not exist on some 83 platforms. Instead use uint_fast32_t. 84 It is also better for future-proof. 85 - check portability for embedded platforms. Some of them support 86 64 bits, but 'int' could be just 16 bits resulting of silently 87 dropping enum values higher than 65535. 88 => in general, more functions, fewer enums for setup 89 - Avoid returning pointers to internal members. It is not thread-safe and 90 even in single thread the value could change over the time. Prefer pointers to 91 app-allocated memory with the size, like MHD_daemon_get_static_info(enum 92 MHD_enum_name info_type, void *buf, size_t buf_size). 93 => Except in cases where zero-copy matters. 94 - Use separate app calls/functions for data the will not change for the 95 lifetime of the object and dynamic data. The only difference should be the 96 name. Like MHD_daemon_get_static_info(enum MHD_enum_name info_type, void *buf, 97 size_t buf_size) MHD_daemon_get_dynamic_info(enum MHD_enum_name info_type, 98 void *buf, size_t buf_size) Examples of static data: listen socket, number of 99 workers, daemon flags. Examples of dynamic data: number of connections, 100 quiesce status. It should give a clear idea whether the data could be changed 101 over the time (could be not obvious for some data) and thus may change the 102 approach how to use the data in app. The same for: library, daemon, 103 connection, request. Not sure that dynamic data makes sense for the library. 104 - Define response code in response object. There are a very little 105 chance that response body designed for 404 or 403 codes will be used with 106 200 code. However, the responses body for 307 and 308 could be the same. So: 107 Add default response code in response object. 108 - Make responses unmodifiable after first use. It is not thread-safe. 109 MHD-generated headers (Date, Connection/Keep-Alive) are again 110 part of the *request* and do not count as part of the "response" here. 111 - Remove "footers" from responses. With unmodifiable responses everything should 112 be "headers". Add footers to *requests* instead. 113 - Add API for adding request-specific response headers and footers. To 114 simplify the things it should just copy the strings (to avoid dealing with 115 complicated deinit of possible dynamic strings). After this change it should 116 be possible to simplify DAuth handling as response could be reused (currently 117 403 responses are modified for each reply). 118 - Control response behaviour mainly by response flags, not by additional 119 headers (like MHD_RF_FORCE_CLOSE instead of "Connection: close"). 120 It is easier&faster for both: app and MHD. 121 - Move response codes from MHD_HTTP_xxx namespace to MHD_HTTP_CODE_xxx 122 namespace. It already may clash with other HTTP values. 123 - Postprocessor is unusable night-mare when doing "stream processing" 124 for tiny values where the application basically has to copy together 125 the stream back into a single compact heap value, just making the 126 parsing highly more complicated (see examples in Challenger) 127 - non-stream processing variant for request bodies, give apps a 128 way to request the full body in one buffer; give apps a way 129 to request a 'large new allocation' for such buffers; give apps 130 a way to specify a global quota for large allocations to ensure 131 memory usage has a hard bound 132 133 - Internals: carefully check where locking is really required. Probably 134 separate locks. Check out-of-thread value reading. Currently code assumes 135 atomic reading of values used in other threads, which mostly true on x86, 136 but not OK on other arches. Probably use read/write locking to minimize 137 the threads interference. 138 - Internals: figure out how to do portable variant of cork/uncork 139 - Internals: remove request data from memory pool when response is queued 140 (IF no callbacks and thus data cannot be used anymore, or IF 141 application permits explicitly per daemon) to get more space 142 for building response; 143 - Internals: Fix TCP FIN graceful closure issue for upgraded 144 connections (API implications?) 145 146 */ 147 148 #ifndef MICROHTTPD2_H 149 #define MICROHTTPD2_H 150 151 #ifndef __cplusplus 152 # define MHD_C_DECLRATIONS_START_HERE_ /* Empty */ 153 # define MHD_C_DECLRATIONS_FINISH_HERE_ /* Empty */ 154 #else /* __cplusplus */ 155 /* *INDENT-OFF* */ 156 # define MHD_C_DECLRATIONS_START_HERE_ extern "C" { 157 # define MHD_C_DECLRATIONS_FINISH_HERE_ } 158 /* *INDENT-ON* */ 159 #endif /* __cplusplus */ 160 161 MHD_C_DECLRATIONS_START_HERE_ 162 163 /** 164 * Current version of the library in packed BCD form. 165 * (For example, version 1.9.30-1 would be 0x01093001) 166 */ 167 #define MHD_VERSION 0x01990001 168 169 #include "microhttpd2_portability.h" 170 171 /* If generic headers do not work on your platform, include headers that 172 define 'va_list', 'size_t', 'uint_least16_t', 'uint_fast32_t', 173 'uint_fast64_t', and 'struct sockaddr', and then 174 add "#define MHD_HAVE_SYS_HEADERS_INCLUDED" before including "microhttpd2.h". 175 When 'MHD_HAVE_SYS_HEADERS_INCLUDED' is defined, the following "standard" 176 includes will not be used (which might be a good idea, especially on 177 platforms where they do not exist). 178 */ 179 #ifndef MHD_HAVE_SYS_HEADERS_INCLUDED 180 # include <stdarg.h> 181 # ifndef MHD_SYS_BASE_TYPES_H 182 /* Headers for uint_fastXX_t, size_t */ 183 # include <stdint.h> 184 # include <stddef.h> 185 # include <sys/types.h> /* This header is actually optional */ 186 # endif 187 # ifndef MHD_SYS_SOCKET_TYPES_H 188 /* Headers for 'struct sockaddr' */ 189 # if ! defined(_WIN32) || defined(__CYGWIN__) 190 # include <sys/socket.h> 191 # else 192 /* Prevent conflict of <winsock.h> and <winsock2.h> */ 193 # if ! defined(_WINSOCK2API_) && ! defined(_WINSOCKAPI_) 194 # ifndef WIN32_LEAN_AND_MEAN 195 /* Do not use unneeded parts of W32 headers. */ 196 # define WIN32_LEAN_AND_MEAN 1 197 # endif /* !WIN32_LEAN_AND_MEAN */ 198 # include <winsock2.h> 199 # endif 200 # endif 201 # endif 202 #endif 203 204 #ifndef MHD_BOOL_DEFINED 205 206 /** 207 * Representation of 'bool' in the public API as stdbool.h may not 208 * always be available and presence of 'bool' keyword may depend on 209 * used C version. 210 * It is always safe to cast 'MHD_Bool' variable to 'bool' and vice versa. 211 * Note: it may be UNSAFE to cast pointers 'MHD_Bool*' to 'bool*' and 212 * vice versa. 213 */ 214 enum MHD_Bool 215 { 216 217 /** 218 * MHD-internal return code for "NO". 219 */ 220 MHD_NO = 0 221 , 222 /** 223 * MHD-internal return code for "YES". All non-zero values 224 * will be interpreted as "YES", but MHD will only ever 225 * return #MHD_YES or #MHD_NO. 226 */ 227 MHD_YES = 1 228 }; 229 230 231 #define MHD_BOOL_DEFINED 1 232 #endif /* ! MHD_BOOL_DEFINED */ 233 234 #ifndef MHD_STRINGS_DEFINED 235 236 237 /** 238 * String with length data. 239 * This type should always have valid @a cstr pointer. 240 */ 241 struct MHD_String 242 { 243 /** 244 * Number of characters in @e str, not counting 0-termination. 245 */ 246 size_t len; 247 248 /** 249 * 0-terminated C-string. 250 * Must not be NULL. 251 */ 252 const char *cstr; 253 }; 254 255 /** 256 * String with length data. 257 * This type of data may have NULL as the @a cstr pointer. 258 */ 259 struct MHD_StringNullable 260 { 261 /** 262 * Number of characters in @e cstr, not counting 0-termination. 263 * If @a cstr is NULL, it must be zero. 264 */ 265 size_t len; 266 267 /** 268 * 0-terminated C-string. 269 * In some cases it could be NULL. 270 */ 271 const char *cstr; 272 }; 273 274 #define MHD_STRINGS_DEFINED 1 275 #endif /* ! MHD_STRINGS_DEFINED */ 276 277 278 #ifndef MHD_INVALID_SOCKET 279 # if ! defined(_WIN32) || defined(_SYS_TYPES_FD_SET) 280 # define MHD_SOCKETS_KIND_POSIX 1 281 /** 282 * MHD_Socket is a type for socket FDs 283 */ 284 typedef int MHD_Socket; 285 # define MHD_INVALID_SOCKET (-1) 286 # else /* !defined(_WIN32) || defined(_SYS_TYPES_FD_SET) */ 287 # define MHD_SOCKETS_KIND_WINSOCK 1 288 /** 289 * MHD_Socket is a type for socket FDs 290 */ 291 typedef SOCKET MHD_Socket; 292 # define MHD_INVALID_SOCKET (INVALID_SOCKET) 293 # endif /* !defined(_WIN32) || defined(_SYS_TYPES_FD_SET) */ 294 #endif /* MHD_INVALID_SOCKET */ 295 296 297 /** 298 * Constant used to indicate unknown size (use when creating a response). 299 * Any possible larger sizes are interpreted as the same value. 300 */ 301 #ifdef UINT64_MAX 302 # define MHD_SIZE_UNKNOWN UINT64_MAX 303 #else 304 # define MHD_SIZE_UNKNOWN \ 305 MHD_STATIC_CAST_ (uint_fast64_t,0xffffffffffffffffU) 306 #endif 307 308 309 /** 310 * Constant used to indicate unlimited wait time. 311 * Any possible larger values are interpreted as this value. 312 */ 313 #ifdef UINT64_MAX 314 # define MHD_WAIT_INDEFINITELY UINT64_MAX 315 #else 316 # define MHD_WAIT_INDEFINITELY \ 317 MHD_STATIC_CAST_ (uint_fast64_t,0xffffffffffffffffU) 318 #endif 319 320 321 /* ********** (a) Core HTTP Processing ************ */ 322 323 324 /** 325 * @brief Handle for a daemon that listens for requests. 326 * 327 * Manages the listen socket, event loop, optional threads and server 328 * settings. 329 * 330 * @defgroup daemon HTTP server handling client connections 331 */ 332 struct MHD_Daemon; 333 334 335 /** 336 * @brief Handle/identifier of a network connection abstraction. 337 * 338 * A single network (i.e. TCP) connection can be used for 339 * a single (in HTTP/1.1) data stream. 340 * 341 * @defgroup connection client connection with streams 342 */ 343 struct MHD_Connection; 344 345 346 /** 347 * @brief Handle/identifier of a data stream over network 348 * connection. 349 * 350 * A data stream may be used for multiple requests, which 351 * in HTTP/1.1 must be processed sequentially. 352 * 353 * @defgroup stream stream of HTTP requests 354 */ 355 struct MHD_Stream; 356 357 /** 358 * @brief Handle representing an HTTP request. 359 * 360 * With HTTP/1.1, multiple requests can be run over the same 361 * stream. However, MHD will only show one request per data 362 * stream to the client at any given time. 363 * 364 * Replaces `struct MHD_Connection` in the API prior to version 2.0.0, 365 * renamed to better reflect what this object truly represents to 366 * the application using MHD. 367 * 368 * @defgroup request HTTP requests 369 */ 370 struct MHD_Request; 371 372 373 /** 374 * @brief Actions are returned by the application when processed client header 375 * to drive the request handling of MHD. 376 * 377 * @defgroup action Request actions 378 */ 379 struct MHD_Action; 380 381 382 /** 383 * @brief Actions are returned by the application when processing client upload 384 * to drive the request handling of MHD. 385 * 386 * @defgroup action Request actions 387 */ 388 struct MHD_UploadAction; 389 390 /** 391 * @defgroup general Primary MHD functions and data 392 */ 393 394 /** 395 * @defgroup specialized Introspection and other special control 396 */ 397 398 /** 399 * @defgroup authentication Digest and other HTTP authentications 400 */ 401 402 403 /** 404 * Return values for reporting errors, also used for logging. 405 * 406 * A value of 0 indicates success (as a return value). 407 * Values between 0 and 10000 must be handled explicitly by the app. 408 * Values from 10000-19999 are informational. 409 * Values from 20000-29999 indicate successful operations. 410 * Values from 30000-39999 indicate unsuccessful (normal) operations. 411 * Values from 40000-49999 indicate client errors. 412 * Values from 50000-59999 indicate MHD server errors. 413 * Values from 60000-65535 indicate application errors. 414 * 415 * @ingroup general 416 */ 417 enum MHD_FIXED_ENUM_MHD_SET_ MHD_StatusCode 418 { 419 420 /* 00000-level status codes indicate return values 421 the application must act on. */ 422 423 /** 424 * Successful operation (not used for logging). 425 * The code is guaranteed to be always zero. 426 */ 427 MHD_SC_OK = 0 428 , 429 430 /* 10000-level status codes indicate intermediate 431 results of some kind. */ 432 433 /** 434 * Informational event, MHD started. 435 */ 436 MHD_SC_DAEMON_STARTED = 10000 437 , 438 /** 439 * Informational event, we accepted a connection. 440 */ 441 MHD_SC_CONNECTION_ACCEPTED = 10001 442 , 443 /** 444 * Informational event, thread processing connection terminates. 445 */ 446 MHD_SC_THREAD_TERMINATING = 10002 447 , 448 /** 449 * Informational event, state machine status for a connection. 450 */ 451 MHD_SC_STATE_MACHINE_STATUS_REPORT = 10003 452 , 453 /** 454 * accept() returned transient error. 455 */ 456 MHD_SC_ACCEPT_FAILED_EAGAIN = 10004 457 , 458 /** 459 * Accepted socket is unknown type (probably non-IP). 460 */ 461 MHD_SC_ACCEPTED_UNKNOWN_TYPE = 10040 462 , 463 /** 464 * The sockaddr for the accepted socket does not fit the buffer. 465 * (Strange) 466 */ 467 MHD_SC_ACCEPTED_SOCKADDR_TOO_LARGE = 10041 468 , 469 470 /* 20000-level status codes indicate success of some kind. */ 471 472 /** 473 * MHD is closing a connection after the client closed it 474 * (perfectly normal end). 475 */ 476 MHD_SC_CONNECTION_CLOSED = 20000 477 , 478 /** 479 * MHD is closing a connection because the application 480 * logic to generate the response data completed. 481 */ 482 MHD_SC_APPLICATION_DATA_GENERATION_FINISHED = 20001 483 , 484 /** 485 * The request does not contain a particular type of Authentication 486 * credentials 487 */ 488 MHD_SC_AUTH_ABSENT = 20060 489 , 490 491 /* 30000-level status codes indicate transient failures 492 that might go away if the client tries again. */ 493 494 495 /** 496 * Resource limit in terms of number of parallel connections 497 * hit. 498 */ 499 MHD_SC_LIMIT_CONNECTIONS_REACHED = 30000 500 , 501 /** 502 * The operation failed because the respective 503 * daemon is already too deep inside of the shutdown 504 * activity. 505 */ 506 MHD_SC_DAEMON_ALREADY_SHUTDOWN = 30020 507 , 508 /** 509 * Failed to start new thread because of system limits. 510 */ 511 MHD_SC_CONNECTION_THREAD_SYS_LIMITS_REACHED = 30030 512 , 513 /** 514 * Failed to start a thread. 515 */ 516 MHD_SC_CONNECTION_THREAD_LAUNCH_FAILURE = 30031 517 , 518 /** 519 * The operation failed because we either have no 520 * listen socket or were already quiesced. 521 */ 522 MHD_SC_DAEMON_ALREADY_QUIESCED = 30040 523 , 524 /** 525 * The operation failed because client disconnected 526 * faster than we could accept(). 527 */ 528 MHD_SC_ACCEPT_FAST_DISCONNECT = 30040 529 , 530 /** 531 * Operating resource limits hit on accept(). 532 */ 533 MHD_SC_ACCEPT_SYSTEM_LIMIT_REACHED = 30060 534 , 535 /** 536 * Connection was refused by accept policy callback. 537 */ 538 MHD_SC_ACCEPT_POLICY_REJECTED = 30070 539 , 540 /** 541 * Failed to allocate memory for the daemon resources. 542 * TODO: combine similar error codes for daemon 543 */ 544 MHD_SC_DAEMON_MEM_ALLOC_FAILURE = 30081 545 , 546 /** 547 * We failed to allocate memory for the connection. 548 * (May be transient.) 549 */ 550 MHD_SC_CONNECTION_MEM_ALLOC_FAILURE = 30082 551 , 552 /** 553 * We failed to allocate memory for the connection's memory pool. 554 * (May be transient.) 555 */ 556 MHD_SC_POOL_MEM_ALLOC_FAILURE = 30083 557 , 558 /** 559 * We failed to allocate memory for the HTTP/2 connection's resources. 560 * (May be transient.) 561 */ 562 MHD_SC_H2_CONN_MEM_ALLOC_FAILURE = 30084 563 , 564 /** 565 * We failed to forward data from a Web socket to the 566 * application to the remote side due to the socket 567 * being closed prematurely. (May be transient.) 568 */ 569 MHD_SC_UPGRADE_FORWARD_INCOMPLETE = 30100 570 , 571 /** 572 * Failed to allocate memory from our memory pool for processing 573 * the request. Likely the request fields are too large to leave 574 * enough room. 575 */ 576 MHD_SC_CONNECTION_POOL_NO_MEM_REQ = 30130 577 , 578 /** 579 * Failed to allocate memory from our memory pool to store GET parameter. 580 * Likely the request URI or header fields are too large to leave enough room. 581 */ 582 MHD_SC_CONNECTION_POOL_NO_MEM_GET_PARAM = 30131 583 , 584 /** 585 * Failed to allocate memory from our memory pool to store parsed cookie. 586 */ 587 MHD_SC_CONNECTION_POOL_NO_MEM_COOKIE = 30132 588 , 589 /** 590 * Failed to allocate memory from connection memory pool to store 591 * parsed Authentication data. 592 */ 593 MHD_SC_CONNECTION_POOL_NO_MEM_AUTH_DATA = 30133 594 , 595 /** 596 * Detected jump back of system clock 597 */ 598 MHD_SC_SYS_CLOCK_JUMP_BACK_LARGE = 30140 599 , 600 /** 601 * Detected correctable jump back of system clock 602 */ 603 MHD_SC_SYS_CLOCK_JUMP_BACK_CORRECTED = 30141 604 , 605 /** 606 * Timeout waiting for communication operation for HTTP-Upgraded connection 607 */ 608 MHD_SC_UPGRADED_NET_TIMEOUT = 30161 609 , 610 /** 611 * Not enough system resources 612 */ 613 MHD_SC_NO_SYS_RESOURCES = 30180 614 , 615 616 /* 40000-level errors are caused by the HTTP client 617 (or the network) */ 618 619 /** 620 * MHD is closing a connection because parsing the 621 * request failed. 622 */ 623 MHD_SC_CONNECTION_PARSE_FAIL_CLOSED = 40000 624 , 625 /** 626 * MHD is returning an error because the header provided 627 * by the client is too big. 628 */ 629 MHD_SC_CLIENT_HEADER_TOO_BIG = 40020 630 , 631 /** 632 * An HTTP/1.1 request was sent without the "Host:" header. 633 */ 634 MHD_SC_HOST_HEADER_MISSING = 40060 635 , 636 /** 637 * Request has more than one "Host:" header. 638 */ 639 MHD_SC_HOST_HEADER_SEVERAL = 40061 640 , 641 /** 642 * The value of the "Host:" header is invalid. 643 */ 644 MHD_SC_HOST_HEADER_MALFORMED = 40062 645 , 646 /** 647 * The given content length was not a number. 648 */ 649 MHD_SC_CONTENT_LENGTH_MALFORMED = 40065 650 , 651 /** 652 * Request has more than one "Content-Length:" header with the same value. 653 */ 654 MHD_SC_CONTENT_LENGTH_SEVERAL_SAME = 40066 655 , 656 /** 657 * Request has more than one "Content-Length:" header with the different 658 * values. 659 */ 660 MHD_SC_CONTENT_LENGTH_SEVERAL_DIFFERENT = 40067 661 , 662 /** 663 * The BOTH Content-Length and Transfer-Encoding headers are used. 664 */ 665 MHD_SC_CONTENT_LENGTH_AND_TR_ENC = 40068 666 , 667 /** 668 * The Content-Length is too large to be handled. 669 */ 670 MHD_SC_CONTENT_LENGTH_TOO_LARGE = 40069 671 , 672 /** 673 * Transfer encoding in request is unsupported or invalid. 674 */ 675 MHD_SC_TRANSFER_ENCODING_UNSUPPORTED = 40075 676 , 677 /** 678 * "Expect:" value in request is unsupported or invalid. 679 */ 680 MHD_SC_EXPECT_HEADER_VALUE_UNSUPPORTED = 40076 681 , 682 /** 683 * The given uploaded, chunked-encoded body was malformed. 684 */ 685 MHD_SC_CHUNKED_ENCODING_MALFORMED = 40080 686 , 687 /** 688 * The first header line has whitespace at the start 689 */ 690 MHD_SC_REQ_FIRST_HEADER_LINE_SPACE_PREFIXED = 40100 691 , 692 /** 693 * The request target (URI) has whitespace character 694 */ 695 MHD_SC_REQ_TARGET_HAS_WHITESPACE = 40101 696 , 697 /** 698 * Wrong bare CR characters has been replaced with space. 699 */ 700 MHD_SC_REQ_HEADER_CR_REPLACED = 40120 701 , 702 /** 703 * Header line has not colon and skipped. 704 */ 705 MHD_SC_REQ_HEADER_LINE_NO_COLON = 40121 706 , 707 /** 708 * Wrong bare CR characters has been replaced with space. 709 */ 710 MHD_SC_REQ_FOOTER_CR_REPLACED = 40140 711 , 712 /** 713 * Footer line has not colon and skipped. 714 */ 715 MHD_SC_REQ_FOOTER_LINE_NO_COLON = 40141 716 , 717 /** 718 * The request is malformed. 719 */ 720 MHD_SC_REQ_MALFORMED = 40155 721 , 722 /** 723 * The cookie string has been parsed, but it is not fully compliant with 724 * specifications 725 */ 726 MHD_SC_REQ_COOKIE_PARSED_NOT_COMPLIANT = 40160 727 , 728 /** 729 * The cookie string has been parsed only partially 730 */ 731 MHD_SC_REQ_COOKIE_PARSED_PARTIALLY = 40161 732 , 733 /** 734 * The cookie string is ignored, as it is not fully compliant with 735 * specifications 736 */ 737 MHD_SC_REQ_COOKIE_IGNORED_NOT_COMPLIANT = 40162 738 , 739 /** 740 * The cookie string has been ignored as it is invalid 741 */ 742 MHD_SC_REQ_COOKIE_INVALID = 40163 743 , 744 /** 745 * The POST data parsed successfully, but has missing or incorrect 746 * termination. 747 * The last parsed field may have incorrect data. 748 */ 749 MHD_SC_REQ_POST_PARSE_OK_BAD_TERMINATION = 40202 750 , 751 /** 752 * Parsing of the POST data is incomplete because client used incorrect 753 * format of POST encoding. 754 * Some POST data is available or has been provided via callback. 755 */ 756 MHD_SC_REQ_POST_PARSE_PARTIAL_INVALID_POST_FORMAT = 40203 757 , 758 /** 759 * The request does not have "Content-Type:" header and POST data cannot 760 * be parsed 761 */ 762 MHD_SC_REQ_POST_PARSE_FAILED_NO_CNTN_TYPE = 40280 763 , 764 /** 765 * The request has unknown POST encoding specified by "Content-Type:" header 766 */ 767 MHD_SC_REQ_POST_PARSE_FAILED_UNKNOWN_CNTN_TYPE = 40281 768 , 769 /** 770 * The request has "Content-Type: multipart/form-data" header without 771 * "boundary" parameter 772 */ 773 MHD_SC_REQ_POST_PARSE_FAILED_HEADER_NO_BOUNDARY = 40282 774 , 775 /** 776 * The request has "Content-Type: multipart/form-data" header with misformed 777 * data 778 */ 779 MHD_SC_REQ_POST_PARSE_FAILED_HEADER_MISFORMED = 40283 780 , 781 /** 782 * The POST data cannot be parsed because client used incorrect format 783 * of POST encoding. 784 */ 785 MHD_SC_REQ_POST_PARSE_FAILED_INVALID_POST_FORMAT = 40290 786 , 787 /** 788 * The data in Auth request header has invalid format. 789 * For example, for Basic Authentication base64 decoding failed. 790 */ 791 MHD_SC_REQ_AUTH_DATA_BROKEN = 40320 792 , 793 /** 794 * The request cannot be processed. Sending error reply. 795 */ 796 MHD_SC_REQ_PROCCESSING_ERR_REPLY = 41000 797 , 798 /** 799 * MHD is closing a connection because of timeout. 800 */ 801 MHD_SC_CONNECTION_TIMEOUT = 42000 802 , 803 /** 804 * MHD is closing a connection because receiving the 805 * request failed. 806 */ 807 MHD_SC_CONNECTION_RECV_FAIL_CLOSED = 42020 808 , 809 /** 810 * MHD is closing a connection because sending the response failed. 811 */ 812 MHD_SC_CONNECTION_SEND_FAIL_CLOSED = 42021 813 , 814 /** 815 * MHD is closing a connection because remote client shut down its sending 816 * side before full request was sent. 817 */ 818 MHD_SC_CLIENT_SHUTDOWN_EARLY = 42040 819 , 820 /** 821 * MHD is closing a connection because remote client closed connection 822 * early. 823 */ 824 MHD_SC_CLIENT_CLOSED_CONN_EARLY = 42041 825 , 826 /** 827 * MHD is closing a connection connection has been (remotely) aborted. 828 */ 829 MHD_SC_CONNECTION_ABORTED = 42042 830 , 831 /** 832 * MHD is closing a connection because it was reset. 833 */ 834 MHD_SC_CONNECTION_RESET = 42060 835 , 836 /** 837 * MHD is closing a connection connection (or connection socket) has 838 * been broken. 839 */ 840 MHD_SC_CONNECTION_BROKEN = 42061 841 , 842 /** 843 * ALPN in TLS connection selected HTTP/2 (as advertised by the client), 844 * but the client did not send a valid HTTP/2 connection preface. 845 */ 846 MHD_SC_ALPN_H2_NO_PREFACE = 43001 847 , 848 849 /* 50000-level errors are because of an error internal 850 to the MHD logic, possibly including our interaction 851 with the operating system (but not the application) */ 852 853 /** 854 * This build of MHD does not support TLS, but the application 855 * requested TLS. 856 */ 857 MHD_SC_TLS_DISABLED = 50000 858 , 859 /** 860 * The selected TLS backend does not yet support this operation. 861 */ 862 MHD_SC_TLS_BACKEND_OPERATION_UNSUPPORTED = 50004 863 , 864 /** 865 * Failed to setup ITC channel. 866 */ 867 MHD_SC_ITC_INITIALIZATION_FAILED = 50005 868 , 869 /** 870 * File descriptor for ITC cannot be used because the FD number is higher 871 * than the limit set by FD_SETSIZE (if internal polling with select is used) 872 * or by application. 873 */ 874 MHD_SC_ITC_FD_OUTSIDE_OF_SET_RANGE = 50006 875 , 876 /** 877 * The specified value for the NC length is way too large 878 * for this platform (integer overflow on `size_t`). 879 */ 880 MHD_SC_DIGEST_AUTH_NC_LENGTH_TOO_BIG = 50010 881 , 882 /** 883 * We failed to allocate memory for the specified nonce 884 * counter array. The option was not set. 885 */ 886 MHD_SC_DIGEST_AUTH_NC_ALLOCATION_FAILURE = 50011 887 , 888 /** 889 * This build of the library does not support 890 * digest authentication. 891 */ 892 MHD_SC_DIGEST_AUTH_NOT_SUPPORTED_BY_BUILD = 50012 893 , 894 /** 895 * IPv6 requested but not supported by this build. 896 * @sa #MHD_SC_AF_NOT_SUPPORTED_BY_BUILD 897 */ 898 MHD_SC_IPV6_NOT_SUPPORTED_BY_BUILD = 50020 899 , 900 /** 901 * Specified address/protocol family is not supported by this build. 902 * @sa MHD_SC_IPV6_NOT_SUPPORTED_BY_BUILD 903 */ 904 MHD_SC_AF_NOT_SUPPORTED_BY_BUILD = 50021 905 , 906 /** 907 * The requested address/protocol family is rejected by the OS. 908 * @sa #MHD_SC_AF_NOT_SUPPORTED_BY_BUILD 909 */ 910 MHD_SC_AF_NOT_AVAILABLE = 500022 911 , 912 /** 913 * We failed to open the listen socket. 914 */ 915 MHD_SC_FAILED_TO_OPEN_LISTEN_SOCKET = 50040 916 , 917 /** 918 * Failed to enable listen port reuse. 919 */ 920 MHD_SC_LISTEN_PORT_REUSE_ENABLE_FAILED = 50041 921 , 922 /** 923 * Failed to enable listen port reuse. 924 */ 925 MHD_SC_LISTEN_PORT_REUSE_ENABLE_NOT_SUPPORTED = 50042 926 , 927 /** 928 * Failed to enable listen address reuse. 929 */ 930 MHD_SC_LISTEN_ADDRESS_REUSE_ENABLE_FAILED = 50043 931 , 932 /** 933 * Enabling listen address reuse is not supported by this platform. 934 */ 935 MHD_SC_LISTEN_ADDRESS_REUSE_ENABLE_NOT_SUPPORTED = 50044 936 , 937 /** 938 * Failed to enable exclusive use of listen address. 939 */ 940 MHD_SC_LISTEN_ADDRESS_EXCLUSIVE_ENABLE_FAILED = 50045 941 , 942 /** 943 * Dual stack configuration is not possible for provided sockaddr. 944 */ 945 MHD_SC_LISTEN_DUAL_STACK_NOT_SUITABLE = 50046 946 , 947 /** 948 * Failed to enable or disable dual stack for the IPv6 listen socket. 949 * The OS default dual-stack setting is different from what is requested. 950 */ 951 MHD_SC_LISTEN_DUAL_STACK_CONFIGURATION_REJECTED = 50047 952 , 953 /** 954 * Failed to enable or disable dual stack for the IPv6 listen socket. 955 * The socket will be used in whatever the default is the OS uses. 956 */ 957 MHD_SC_LISTEN_DUAL_STACK_CONFIGURATION_UNKNOWN = 50048 958 , 959 /** 960 * On this platform, MHD does not support explicitly configuring 961 * dual stack behaviour. 962 */ 963 MHD_SC_LISTEN_DUAL_STACK_CONFIGURATION_NOT_SUPPORTED = 50049 964 , 965 /** 966 * Failed to enable TCP FAST OPEN option. 967 */ 968 MHD_SC_LISTEN_FAST_OPEN_FAILURE = 50050 969 , 970 /** 971 * TCP FAST OPEN is not supported by the platform or by this MHD build. 972 */ 973 MHD_SC_FAST_OPEN_NOT_SUPPORTED = 50051 974 , 975 /** 976 * We failed to set the listen socket to non-blocking. 977 */ 978 MHD_SC_LISTEN_SOCKET_NONBLOCKING_FAILURE = 50052 979 , 980 /** 981 * Failed to configure listen socket to be non-inheritable. 982 */ 983 MHD_SC_LISTEN_SOCKET_NOINHERIT_FAILED = 50053 984 , 985 /** 986 * Listen socket FD cannot be used because the FD number is higher than 987 * the limit set by FD_SETSIZE (if internal polling with select is used) or 988 * by application. 989 */ 990 MHD_SC_LISTEN_FD_OUTSIDE_OF_SET_RANGE = 50054 991 , 992 /** 993 * We failed to bind the listen socket. 994 */ 995 MHD_SC_LISTEN_SOCKET_BIND_FAILED = 50055 996 , 997 /** 998 * Failed to start listening on listen socket. 999 */ 1000 MHD_SC_LISTEN_FAILURE = 50056 1001 , 1002 /** 1003 * Failed to detect the port number on the listening socket 1004 */ 1005 MHD_SC_LISTEN_PORT_DETECT_FAILURE = 50057 1006 , 1007 /** 1008 * We failed to create control socket for the epoll(). 1009 */ 1010 MHD_SC_EPOLL_CTL_CREATE_FAILED = 50060 1011 , 1012 /** 1013 * We failed to configure control socket for the epoll() 1014 * to be non-inheritable. 1015 */ 1016 MHD_SC_EPOLL_CTL_CONFIGURE_NOINHERIT_FAILED = 50061 1017 , 1018 /** 1019 * The epoll() control FD cannot be used because the FD number is higher 1020 * than the limit set by application. 1021 */ 1022 MHD_SC_EPOLL_CTL_OUTSIDE_OF_SET_RANGE = 50062 1023 , 1024 /** 1025 * Failed to allocate memory for daemon's events data, like fd_sets, 1026 * poll, epoll or kqueue structures. 1027 */ 1028 MHD_SC_EVENTS_MEMORY_ALLOCATE_FAILURE = 50063 1029 , 1030 /** 1031 * Failed to add daemon's FDs (ITC and/or listening) to the internal events 1032 * monitoring 1033 */ 1034 MHD_SC_EVENTS_REG_DAEMON_FDS_FAILURE = 50065 1035 , 1036 /** 1037 * Failed to register daemon's FDs (ITC or listening) in the application 1038 * (external event) monitoring 1039 */ 1040 MHD_SC_EXT_EVENT_REG_DAEMON_FDS_FAILURE = 50066 1041 , 1042 /** 1043 * Failed to create kqueue FD 1044 */ 1045 MHD_SC_KQUEUE_FD_CREATE_FAILED = 50067 1046 , 1047 /** 1048 * Failed to configure kqueue FD to be non-inheritable. 1049 */ 1050 MHD_SC_KQUEUE_FD_SET_NOINHERIT_FAILED = 50068 1051 , 1052 /** 1053 * The kqueue FD cannot be used because the FD number is higher 1054 * than the limit set by application. 1055 */ 1056 MHD_SC_KQUEUE_FD_OUTSIDE_OF_SET_RANGE = 50069 1057 , 1058 /** 1059 * The select() syscall is not available on this platform or in this MHD 1060 * build. 1061 */ 1062 MHD_SC_SELECT_SYSCALL_NOT_AVAILABLE = 50070 1063 , 1064 /** 1065 * The poll() syscall is not available on this platform or in this MHD 1066 * build. 1067 */ 1068 MHD_SC_POLL_SYSCALL_NOT_AVAILABLE = 50071 1069 , 1070 /** 1071 * The epoll syscalls are not available on this platform or in this MHD 1072 * build. 1073 */ 1074 MHD_SC_EPOLL_SYSCALL_NOT_AVAILABLE = 50072 1075 , 1076 /** 1077 * The kqueue syscalls are not available on this platform or in this MHD 1078 * build. 1079 */ 1080 MHD_SC_KQUEUE_SYSCALL_NOT_AVAILABLE = 50073 1081 , 1082 /** 1083 * Failed to obtain our listen port via introspection. 1084 * FIXME: remove? 1085 */ 1086 MHD_SC_LISTEN_PORT_INTROSPECTION_FAILURE = 50080 1087 , 1088 /** 1089 * Failed to obtain our listen port via introspection 1090 * due to unsupported address family being used. 1091 */ 1092 MHD_SC_LISTEN_PORT_INTROSPECTION_UNKNOWN_AF = 50081 1093 , 1094 /** 1095 * Failed to initialise mutex. 1096 */ 1097 MHD_SC_MUTEX_INIT_FAILURE = 50085 1098 , 1099 /** 1100 * Failed to allocate memory for the thread pool. 1101 */ 1102 MHD_SC_THREAD_POOL_MEM_ALLOC_FAILURE = 50090 1103 , 1104 /** 1105 * We failed to allocate mutex for thread pool worker. 1106 */ 1107 MHD_SC_THREAD_POOL_CREATE_MUTEX_FAILURE = 50093 1108 , 1109 /** 1110 * Failed to start the main daemon thread. 1111 */ 1112 MHD_SC_THREAD_MAIN_LAUNCH_FAILURE = 50095 1113 , 1114 /** 1115 * Failed to start the daemon thread for listening. 1116 */ 1117 MHD_SC_THREAD_LISTENING_LAUNCH_FAILURE = 50096 1118 , 1119 /** 1120 * Failed to start the worker thread for the thread pool. 1121 */ 1122 MHD_SC_THREAD_WORKER_LAUNCH_FAILURE = 50097 1123 , 1124 /** 1125 * There was an attempt to upgrade a connection on 1126 * a daemon where upgrades are disallowed. 1127 */ 1128 MHD_SC_UPGRADE_ON_DAEMON_WITH_UPGRADE_DISALLOWED = 50100 1129 , 1130 /** 1131 * Failed to signal via ITC channel. 1132 */ 1133 MHD_SC_ITC_USE_FAILED = 500101 1134 , 1135 /** 1136 * Failed to check for the signal on the ITC channel. 1137 */ 1138 MHD_SC_ITC_CHECK_FAILED = 500102 1139 , 1140 /** 1141 * System reported error conditions on the ITC FD. 1142 */ 1143 MHD_SC_ITC_STATUS_ERROR = 500104 1144 , 1145 /** 1146 * Failed to add a socket to the epoll set. 1147 */ 1148 MHD_SC_EPOLL_CTL_ADD_FAILED = 500110 1149 , 1150 /** 1151 * Socket FD cannot be used because the FD number is higher than the limit set 1152 * by FD_SETSIZE (if internal polling with select is used) or by application. 1153 */ 1154 MHD_SC_SOCKET_OUTSIDE_OF_SET_RANGE = 500111 1155 , 1156 /** 1157 * The daemon cannot be started with the specified settings as no space 1158 * left for the connections sockets within limits set by FD_SETSIZE. 1159 * Consider use another sockets polling syscall (only select() has such 1160 * limitations) 1161 */ 1162 MHD_SC_SYS_FD_SETSIZE_TOO_STRICT = 50112 1163 , 1164 /** 1165 * This daemon was not configured with options that 1166 * would allow us to obtain a meaningful timeout. 1167 */ 1168 MHD_SC_CONFIGURATION_MISMATCH_FOR_GET_TIMEOUT = 50113 1169 , 1170 /** 1171 * This daemon was not configured with options that 1172 * would allow us to run with select() data. 1173 */ 1174 MHD_SC_CONFIGURATION_MISMATCH_FOR_RUN_SELECT = 50114 1175 , 1176 /** 1177 * This daemon was not configured to run with an 1178 * external event loop. 1179 */ 1180 MHD_SC_CONFIGURATION_MISMATCH_FOR_RUN_EXTERNAL = 50115 1181 , 1182 /** 1183 * Encountered an unexpected error from select() 1184 * (should never happen). 1185 */ 1186 MHD_SC_UNEXPECTED_SELECT_ERROR = 50116 1187 , 1188 /** 1189 * Failed to remove a connection socket to the epoll or kqueue monitoring. 1190 */ 1191 MHD_SC_EVENTS_CONN_REMOVE_FAILED = 50117 1192 , 1193 /** 1194 * poll() is not supported. 1195 */ 1196 MHD_SC_POLL_NOT_SUPPORTED = 50120 1197 , 1198 /** 1199 * Encountered a (potentially) recoverable error from poll(). 1200 */ 1201 MHD_SC_POLL_SOFT_ERROR = 50121 1202 , 1203 /** 1204 * Encountered an unrecoverable error from poll(). 1205 */ 1206 MHD_SC_POLL_HARD_ERROR = 50122 1207 , 1208 /** 1209 * Encountered a (potentially) recoverable error from select(). 1210 */ 1211 MHD_SC_SELECT_SOFT_ERROR = 50123 1212 , 1213 /** 1214 * Encountered an unrecoverable error from select(). 1215 */ 1216 MHD_SC_SELECT_HARD_ERROR = 50124 1217 , 1218 /** 1219 * System reported error conditions on the listening socket. 1220 */ 1221 MHD_SC_LISTEN_STATUS_ERROR = 50129 1222 , 1223 /** 1224 * Encountered an unrecoverable error from epoll function. 1225 */ 1226 MHD_SC_EPOLL_HARD_ERROR = 50130 1227 , 1228 /** 1229 * Encountered an unrecoverable error from kevent() function. 1230 */ 1231 MHD_SC_KQUEUE_HARD_ERROR = 50131 1232 , 1233 /** 1234 * We failed to configure accepted socket 1235 * to not use a SIGPIPE. 1236 */ 1237 MHD_SC_ACCEPT_CONFIGURE_NOSIGPIPE_FAILED = 50140 1238 , 1239 /** 1240 * We failed to configure accepted socket 1241 * to be non-inheritable. 1242 */ 1243 MHD_SC_ACCEPT_CONFIGURE_NOINHERIT_FAILED = 50141 1244 , 1245 /** 1246 * We failed to configure accepted socket 1247 * to be non-blocking. 1248 */ 1249 MHD_SC_ACCEPT_CONFIGURE_NONBLOCKING_FAILED = 50142 1250 , 1251 /** 1252 * The accepted socket FD value is too large. 1253 */ 1254 MHD_SC_ACCEPT_OUTSIDE_OF_SET_RANGE = 50143 1255 , 1256 /** 1257 * accept() returned unexpected error. 1258 */ 1259 MHD_SC_ACCEPT_FAILED_UNEXPECTEDLY = 50144 1260 , 1261 /** 1262 * Operating resource limits hit on accept() while 1263 * zero connections are active. Oopsie. 1264 */ 1265 MHD_SC_ACCEPT_SYSTEM_LIMIT_REACHED_INSTANTLY = 50145 1266 , 1267 /** 1268 * The daemon sockets polling mode requires non-blocking sockets. 1269 */ 1270 MHD_SC_NONBLOCKING_REQUIRED = 50146 1271 , 1272 /** 1273 * Encountered an unexpected error from epoll_wait() 1274 * (should never happen). 1275 */ 1276 MHD_SC_UNEXPECTED_EPOLL_WAIT_ERROR = 50150 1277 , 1278 /** 1279 * epoll file descriptor is invalid (strange) 1280 */ 1281 MHD_SC_EPOLL_FD_INVALID = 50151 1282 , 1283 /** 1284 * Unexpected socket error (strange) 1285 */ 1286 MHD_SC_UNEXPECTED_SOCKET_ERROR = 50152 1287 , 1288 /** 1289 * Failed to add IP address to per-IP counter for 1290 * some reason. 1291 */ 1292 MHD_SC_IP_COUNTER_FAILURE = 50160 1293 , 1294 /** 1295 * Application violated our API by calling shutdown 1296 * while having an upgrade connection still open. 1297 */ 1298 MHD_SC_SHUTDOWN_WITH_OPEN_UPGRADED_CONNECTION = 50180 1299 , 1300 /** 1301 * Due to an unexpected internal error with the 1302 * state machine, we closed the connection. 1303 */ 1304 MHD_SC_STATEMACHINE_FAILURE_CONNECTION_CLOSED = 50200 1305 , 1306 /** 1307 * Failed to allocate memory in connection's pool 1308 * to parse the cookie header. 1309 */ 1310 MHD_SC_COOKIE_POOL_ALLOCATION_FAILURE = 50220 1311 , 1312 /** 1313 * MHD failed to build the response header. 1314 */ 1315 MHD_SC_REPLY_FAILED_HEADER_GENERATION = 50230 1316 , 1317 /** 1318 * Failed to allocate memory in connection's pool for the reply. 1319 */ 1320 MHD_SC_REPLY_POOL_ALLOCATION_FAILURE = 50231 1321 , 1322 /** 1323 * Failed to read the file for file-backed response. 1324 */ 1325 MHD_SC_REPLY_FILE_READ_ERROR = 50232 1326 , 1327 /** 1328 * Failed to generate the nonce for the Digest Auth. 1329 */ 1330 MHD_SC_REPLY_NONCE_ERROR = 50233 1331 , 1332 /** 1333 * Failed to allocate memory in connection's pool for the reply. 1334 */ 1335 MHD_SC_ERR_RESPONSE_ALLOCATION_FAILURE = 50250 1336 , 1337 /** 1338 * The request POST data cannot be parsed because stream has not enough 1339 * pool memory free. 1340 */ 1341 MHD_SC_REQ_POST_PARSE_FAILED_NO_POOL_MEM = 50260 1342 , 1343 /** 1344 * The POST data cannot be parsed completely because no "large shared buffer" 1345 * space is available. 1346 * Some POST data may be parsed. 1347 */ 1348 MHD_SC_REQ_POST_PARSE_FAILED_NO_LARGE_BUF_MEM = 50261 1349 , 1350 /** 1351 * The application set POST encoding to "multipart/form-data", but the request 1352 * has no "Content-Type: multipart/form-data" header which is required 1353 * to find "boundary" used in this encoding 1354 */ 1355 MHD_SC_REQ_POST_PARSE_FAILED_HEADER_NOT_MPART = 50284 1356 , 1357 /** 1358 * The feature is not supported by this MHD build (either 1359 * disabled by configure parameters or build platform 1360 * did not support it, because headers are missing or 1361 * so kernel does not have such feature). 1362 * The feature will not be enabled if the same MHD binary 1363 * will be run on another kernel, computer or system 1364 * configuration. 1365 */ 1366 MHD_SC_FEATURE_DISABLED = 50300 1367 , 1368 /** 1369 * The feature is not supported by this platform, while 1370 * supported by MHD build. 1371 * The feature can be enabled by changing the kernel or 1372 * running on another computer or with other system 1373 * configuration. 1374 */ 1375 MHD_SC_FEATURE_NOT_AVAILABLE = 50320 1376 , 1377 /** 1378 * Failed to stop the thread 1379 */ 1380 MHD_SC_DAEMON_THREAD_STOP_ERROR = 50350 1381 , 1382 /** 1383 * Unexpected reasons for thread stop 1384 */ 1385 MHD_SC_DAEMON_THREAD_STOP_UNEXPECTED = 50351 1386 , 1387 /** 1388 * Daemon system data is broken (like listen socket was unexpectedly closed). 1389 * The daemon needs to be closed. 1390 * A new daemon can be started as a replacement after closing the current 1391 * daemon. 1392 */ 1393 MHD_SC_DAEMON_SYS_DATA_BROKEN = 50370 1394 , 1395 /** 1396 * Failed to acquire response mutex lock 1397 */ 1398 MHD_SC_RESPONSE_MUTEX_LOCK_FAILED = 50500 1399 , 1400 /** 1401 * Failed to initialise response mutex 1402 */ 1403 MHD_SC_RESPONSE_MUTEX_INIT_FAILED = 50501 1404 , 1405 /** 1406 * Unable to clear "reusable" flag. 1407 * One this flag set, it cannot be removed for the response lifetime. 1408 */ 1409 MHD_SC_RESPONSE_CANNOT_CLEAR_REUSE = 50520 1410 , 1411 /** 1412 * Unable to allocate memory for the response header 1413 */ 1414 MHD_SC_RESPONSE_HEADER_MEM_ALLOC_FAILED = 50540 1415 , 1416 /** 1417 * Failed to switch TCP_NODELAY option for the socket 1418 */ 1419 MHD_SC_SOCKET_TCP_NODELAY_FAILED = 50600 1420 , 1421 /** 1422 * Failed to switch TCP_CORK or TCP_NOPUSH option for the socket 1423 */ 1424 MHD_SC_SOCKET_TCP_CORK_NOPUSH_FAILED = 50601 1425 , 1426 /** 1427 * Failed to force flush the last part of the response header or 1428 * the response content 1429 */ 1430 MHD_SC_SOCKET_FLUSH_LAST_PART_FAILED = 50620 1431 , 1432 /** 1433 * Failed to push buffered data by zero-sized send() 1434 */ 1435 MHD_SC_SOCKET_ZERO_SEND_FAILED = 50621 1436 , 1437 /** 1438 * The HTTP-Upgraded network connection has been closed / disconnected 1439 */ 1440 MHD_SC_UPGRADED_NET_CONN_CLOSED = 50800 1441 , 1442 /** 1443 * The HTTP-Upgraded network connection has been broken 1444 */ 1445 MHD_SC_UPGRADED_NET_CONN_BROKEN = 50801 1446 , 1447 /** 1448 * The TLS communication error on HTTP-Upgraded connection 1449 */ 1450 MHD_SC_UPGRADED_TLS_ERROR = 50801 1451 , 1452 /** 1453 * Unrecoverable sockets communication error on HTTP-Upgraded connection 1454 */ 1455 MHD_SC_UPGRADED_NET_HARD_ERROR = 50840 1456 , 1457 /** 1458 * MHD cannot wait for the data on the HTTP-Upgraded connection, because 1459 * current build or the platform does not support required functionality. 1460 * Communication with zero timeout is fully supported. 1461 */ 1462 MHD_SC_UPGRADED_WAITING_NOT_SUPPORTED = 50840 1463 , 1464 /** 1465 * Global initialisation of MHD library failed 1466 */ 1467 MHD_SC_LIB_INIT_GLOBAL_FAILED = 51000 1468 , 1469 /** 1470 * Failed to initialise TLS context for the daemon 1471 */ 1472 MHD_SC_TLS_DAEMON_INIT_FAILED = 51200 1473 , 1474 /** 1475 * Failed to initialise TLS context for the new connection 1476 */ 1477 MHD_SC_TLS_CONNECTION_INIT_FAILED = 51201 1478 , 1479 /** 1480 * Warning about TLS backend configuration 1481 */ 1482 MHD_SC_TLS_LIB_CONF_WARNING = 51202 1483 , 1484 /** 1485 * Failed to perform TLS handshake 1486 */ 1487 MHD_SC_TLS_CONNECTION_HANDSHAKED_FAILED = 51220 1488 , 1489 /** 1490 * Hashing failed. 1491 * Internal hashing function can never fail (and this code is never returned 1492 * for them). External hashing function (like TLS backend-based) may fail 1493 * for various reasons, like failure of hardware acccelerated hashing. 1494 */ 1495 MHD_SC_HASH_FAILED = 51260 1496 , 1497 /** 1498 * Something wrong in the internal MHD logic. 1499 * This error should be never returned if MHD works as expected. 1500 * If this code is ever returned, please report to MHD maintainers. 1501 */ 1502 MHD_SC_INTERNAL_ERROR = 59900 1503 , 1504 1505 /* 60000-level errors are because the application 1506 logic did something wrong or generated an error. */ 1507 1508 /** 1509 * The application called function too early. 1510 * For example, a header value was requested before the headers 1511 * had been received. 1512 */ 1513 MHD_SC_TOO_EARLY = 60000 1514 , 1515 /** 1516 * The application called this function too late. 1517 * For example, MHD has already started sending reply. 1518 */ 1519 MHD_SC_TOO_LATE = 60001 1520 , 1521 /** 1522 * MHD does not support the requested combination of 1523 * the sockets polling syscall and the work mode. 1524 */ 1525 MHD_SC_SYSCALL_WORK_MODE_COMBINATION_INVALID = 60010 1526 , 1527 /** 1528 * MHD does not support quiescing if ITC was disabled 1529 * and threads are used. 1530 */ 1531 MHD_SC_SYSCALL_QUIESCE_REQUIRES_ITC = 60011 1532 , 1533 /** 1534 * The option provided or function called can be used only with "external 1535 * events" modes. 1536 */ 1537 MHD_SC_EXTERNAL_EVENT_ONLY = 60012 1538 , 1539 /** 1540 * MHD is closing a connection because the application 1541 * logic to generate the response data failed. 1542 */ 1543 MHD_SC_APPLICATION_DATA_GENERATION_FAILURE_CLOSED = 60015 1544 , 1545 /** 1546 * MHD is closing a connection because the application 1547 * callback told it to do so. 1548 */ 1549 MHD_SC_APPLICATION_CALLBACK_ABORT_ACTION = 60016 1550 , 1551 /** 1552 * Application only partially processed upload and did 1553 * not suspend connection. This may result in a hung 1554 * connection. 1555 */ 1556 MHD_SC_APPLICATION_HUNG_CONNECTION = 60017 1557 , 1558 /** 1559 * Application only partially processed upload and did 1560 * not suspend connection and the read buffer was maxxed 1561 * out, so MHD closed the connection. 1562 */ 1563 MHD_SC_APPLICATION_HUNG_CONNECTION_CLOSED = 60018 1564 , 1565 /** 1566 * Attempted to set an option that conflicts with another option 1567 * already set. 1568 */ 1569 MHD_SC_OPTIONS_CONFLICT = 60020 1570 , 1571 /** 1572 * Attempted to set an option that not recognised by MHD. 1573 */ 1574 MHD_SC_OPTION_UNKNOWN = 60021 1575 , 1576 /** 1577 * Parameter specified unknown work mode. 1578 */ 1579 MHD_SC_CONFIGURATION_UNEXPECTED_WM = 60022 1580 , 1581 /** 1582 * Parameter specified unknown Sockets Polling Syscall (SPS). 1583 */ 1584 MHD_SC_CONFIGURATION_UNEXPECTED_SPS = 60023 1585 , 1586 /** 1587 * The size of the provided sockaddr does not match address family. 1588 */ 1589 MHD_SC_CONFIGURATION_WRONG_SA_SIZE = 60024 1590 , 1591 /** 1592 * The number set by #MHD_D_O_FD_NUMBER_LIMIT is too strict to run 1593 * the daemon 1594 */ 1595 MHD_SC_MAX_FD_NUMBER_LIMIT_TOO_STRICT = 60025 1596 , 1597 /** 1598 * The number set by #MHD_D_O_GLOBAL_CONNECTION_LIMIT is too for the daemon 1599 * configuration 1600 */ 1601 MHD_SC_CONFIGURATION_CONN_LIMIT_TOO_SMALL = 60026 1602 , 1603 /** 1604 * The provided configuration parameter is NULL, but it must be non-NULL 1605 */ 1606 MHD_SC_CONFIGURATION_PARAM_NULL = 60027 1607 , 1608 /** 1609 * The size of the provided configuration parameter is too large 1610 */ 1611 MHD_SC_CONFIGURATION_PARAM_TOO_LARGE = 60028 1612 , 1613 /** 1614 * The application requested an unsupported TLS backend to be used. 1615 */ 1616 MHD_SC_TLS_BACKEND_UNSUPPORTED = 60030 1617 , 1618 /** 1619 * The application attempted to setup TLS parameters before 1620 * enabling TLS. 1621 */ 1622 MHD_SC_TLS_BACKEND_UNINITIALIZED = 60031 1623 , 1624 /** 1625 * The application requested a TLS backend which cannot be used due 1626 * to missing TLS dynamic library or backend initialisation problem. 1627 */ 1628 MHD_SC_TLS_BACKEND_UNAVAILABLE = 60032 1629 , 1630 /** 1631 * Provided TLS certificate and/or private key are incorrect 1632 */ 1633 MHD_SC_TLS_CONF_BAD_CERT = 60033 1634 , 1635 /** 1636 * The application requested a daemon setting that cannot be used with 1637 * selected TLS backend 1638 */ 1639 MHD_SC_TLS_BACKEND_DAEMON_INCOMPATIBLE_SETTINGS = 60034 1640 , 1641 /** 1642 * The response header name has forbidden characters or token 1643 */ 1644 MHD_SC_RESP_HEADER_NAME_INVALID = 60050 1645 , 1646 /** 1647 * The response header value has forbidden characters or token 1648 */ 1649 MHD_SC_RESP_HEADER_VALUE_INVALID = 60051 1650 , 1651 /** 1652 * An attempt to add header conflicting with other response header 1653 */ 1654 MHD_SC_RESP_HEADERS_CONFLICT = 60052 1655 , 1656 /** 1657 * The pointer to the response object is NULL 1658 */ 1659 MHD_SC_RESP_POINTER_NULL = 60060 1660 , 1661 /** 1662 * The response HTTP status code is not suitable 1663 */ 1664 MHD_SC_RESP_HTTP_CODE_NOT_SUITABLE = 60061 1665 , 1666 /** 1667 * The provided MHD_Action is invalid 1668 */ 1669 MHD_SC_ACTION_INVALID = 60080 1670 , 1671 /** 1672 * The provided MHD_UploadAction is invalid 1673 */ 1674 MHD_SC_UPLOAD_ACTION_INVALID = 60081 1675 , 1676 /** 1677 * The provided Dynamic Content Creator action is invalid 1678 */ 1679 MHD_SC_DCC_ACTION_INVALID = 60082 1680 , 1681 /** 1682 * The response must be empty 1683 */ 1684 MHD_SC_REPLY_NOT_EMPTY_RESPONSE = 60101 1685 , 1686 /** 1687 * The "Content-Length" header is not allowed in the reply 1688 */ 1689 MHD_SC_REPLY_CONTENT_LENGTH_NOT_ALLOWED = 60102 1690 , 1691 /** 1692 * The provided reply headers do not fit the connection buffer 1693 */ 1694 MHD_SC_REPLY_HEADERS_TOO_LARGE = 60103 1695 , 1696 /** 1697 * Specified offset in file-backed response is too large and not supported 1698 * by the platform 1699 */ 1700 MHD_SC_REPLY_FILE_OFFSET_TOO_LARGE = 60104 1701 , 1702 /** 1703 * File-backed response has file smaller than specified combination of 1704 * the file offset and the response size. 1705 */ 1706 MHD_SC_REPLY_FILE_TOO_SHORT = 60105 1707 , 1708 /** 1709 * The new connection cannot be used because the FD number is higher than 1710 * the limit set by FD_SETSIZE (if internal polling with select is used) or 1711 * by application. 1712 */ 1713 MHD_SC_NEW_CONN_FD_OUTSIDE_OF_SET_RANGE = 60140 1714 , 1715 /** 1716 * The daemon is being destroyed, while not all HTTP-Upgraded connections 1717 * has been closed. 1718 */ 1719 MHD_SC_DAEMON_DESTROYED_WITH_UNCLOSED_UPGRADED = 60160 1720 , 1721 /** 1722 * The provided pointer to 'struct MHD_UpgradedHandle' is invalid 1723 */ 1724 MHD_SC_UPGRADED_HANDLE_INVALID = 60161 1725 , 1726 /** 1727 * The provided output buffer is too small. 1728 */ 1729 MHD_SC_OUT_BUFF_TOO_SMALL = 60180 1730 , 1731 /** 1732 * The requested type of information is not recognised. 1733 */ 1734 MHD_SC_INFO_GET_TYPE_UNKNOWN = 60200 1735 , 1736 /** 1737 * The information of the requested type is too large to fit into 1738 * the provided buffer. 1739 */ 1740 MHD_SC_INFO_GET_BUFF_TOO_SMALL = 60201 1741 , 1742 /** 1743 * The type of the information is not supported by this MHD build. 1744 * It can be information not supported on the current platform or related 1745 * to feature disabled for this build. 1746 */ 1747 MHD_SC_INFO_GET_TYPE_NOT_SUPP_BY_BUILD = 60202 1748 , 1749 /** 1750 * The type of the information is not available due to configuration 1751 * or state of the object. 1752 */ 1753 MHD_SC_INFO_GET_TYPE_NOT_APPLICABLE = 60203 1754 , 1755 /** 1756 * The type of the information should be available for the object, but 1757 * cannot be provided due to some error or other reasons. 1758 */ 1759 MHD_SC_INFO_GET_TYPE_UNOBTAINABLE = 60204 1760 , 1761 /** 1762 * The type of the Digest Auth algorithm is unknown or not supported. 1763 */ 1764 MHD_SC_AUTH_DIGEST_ALGO_NOT_SUPPORTED = 60240 1765 , 1766 /** 1767 * The Digest Auth QOP value is unknown or not supported. 1768 */ 1769 MHD_SC_AUTH_DIGEST_QOP_NOT_SUPPORTED = 60241 1770 , 1771 /** 1772 * The Digest Auth is not supported due to configuration 1773 */ 1774 MHD_SC_AUTH_DIGEST_UNSUPPORTED = 60242 1775 , 1776 /** 1777 * The application failed to register FD for the external events monitoring 1778 */ 1779 MHD_SC_EXTR_EVENT_REG_FAILED = 60243 1780 , 1781 /** 1782 * The application failed to de-register FD for the external events monitoring 1783 */ 1784 MHD_SC_EXTR_EVENT_DEREG_FAILED = 60244 1785 , 1786 /** 1787 * The application called #MHD_daemon_event_update() with broken data 1788 */ 1789 MHD_SC_EXTR_EVENT_BROKEN_DATA = 60250 1790 , 1791 /** 1792 * The application called #MHD_daemon_event_update() with status that 1793 * has not been requested 1794 */ 1795 MHD_SC_EXTR_EVENT_UNEXPECTED_STATUS = 60251 1796 }; 1797 1798 /** 1799 * Get text description for the MHD error code. 1800 * 1801 * This function works for @b MHD error codes, not for @b HTTP status codes. 1802 * @param code the MHD code to get description for 1803 * @return the pointer to the text description, 1804 * NULL if MHD code in not known. 1805 * 1806 * @ingroup general 1807 */ 1808 MHD_EXTERN_ const struct MHD_String * 1809 MHD_status_code_to_string (enum MHD_StatusCode code) 1810 MHD_FN_CONST_; 1811 1812 /** 1813 * Get the pointer to the C string for the MHD error code, never NULL. 1814 */ 1815 #define MHD_status_code_to_string_lazy(code) \ 1816 (MHD_status_code_to_string ((code)) ? \ 1817 ((MHD_status_code_to_string (code))->cstr) : ("[No code]") ) 1818 1819 #ifndef MHD_HTTP_METHOD_DEFINED 1820 1821 /** 1822 * @brief HTTP request methods 1823 * 1824 * @defgroup methods HTTP methods 1825 * 1826 * See: https://www.iana.org/assignments/http-methods/http-methods.xml 1827 * Registry export date: 2023-10-02 1828 * @{ 1829 */ 1830 1831 /** 1832 * HTTP methods explicitly supported by MHD. Note that for non-canonical 1833 * methods, MHD will return #MHD_HTTP_METHOD_OTHER and you can use 1834 * #MHD_REQUEST_INFO_FIXED_HTTP_METHOD to get the original string. 1835 * 1836 * However, applications must check for #MHD_HTTP_METHOD_OTHER *or* any enum-value 1837 * above those in this list, as future versions of MHD may add additional 1838 * methods (as per IANA registry), thus even if the API returns 1839 * #MHD_HTTP_METHOD_OTHER today, it may return a method-specific header in the 1840 * future! 1841 */ 1842 enum MHD_FIXED_ENUM_MHD_SET_ MHD_HTTP_Method 1843 { 1844 1845 /** 1846 * Method did not match any of the methods given below. 1847 */ 1848 MHD_HTTP_METHOD_OTHER = 255 1849 , 1850 /* Main HTTP methods. */ 1851 1852 /** 1853 * "GET" 1854 * Safe. Idempotent. RFC9110, Section 9.3.1. 1855 */ 1856 MHD_HTTP_METHOD_GET = 1 1857 , 1858 /** 1859 * "HEAD" 1860 * Safe. Idempotent. RFC9110, Section 9.3.2. 1861 */ 1862 MHD_HTTP_METHOD_HEAD = 2 1863 , 1864 /** 1865 * "POST" 1866 * Not safe. Not idempotent. RFC9110, Section 9.3.3. 1867 */ 1868 MHD_HTTP_METHOD_POST = 3 1869 , 1870 /** 1871 * "PUT" 1872 * Not safe. Idempotent. RFC9110, Section 9.3.4. 1873 */ 1874 MHD_HTTP_METHOD_PUT = 4 1875 , 1876 /** 1877 * "DELETE" 1878 * Not safe. Idempotent. RFC9110, Section 9.3.5. 1879 */ 1880 MHD_HTTP_METHOD_DELETE = 5 1881 , 1882 /** 1883 * "CONNECT" 1884 * Not safe. Not idempotent. RFC9110, Section 9.3.6. 1885 */ 1886 MHD_HTTP_METHOD_CONNECT = 6 1887 , 1888 /** 1889 * "OPTIONS" 1890 * Safe. Idempotent. RFC9110, Section 9.3.7. 1891 */ 1892 MHD_HTTP_METHOD_OPTIONS = 7 1893 , 1894 /** 1895 * "TRACE" 1896 * Safe. Idempotent. RFC9110, Section 9.3.8. 1897 */ 1898 MHD_HTTP_METHOD_TRACE = 8 1899 , 1900 /** 1901 * "*" 1902 * Not safe. Not idempotent. RFC9110, Section 18.2. 1903 */ 1904 MHD_HTTP_METHOD_ASTERISK = 9 1905 }; 1906 1907 #define MHD_HTTP_METHOD_DEFINED 1 1908 #endif /* ! MHD_HTTP_METHOD_DEFINED */ 1909 1910 /** 1911 * Get text version of the method name. 1912 * @param method the method to get the text version 1913 * @return the pointer to the text version, 1914 * NULL if method is MHD_HTTP_METHOD_OTHER 1915 * or not known. 1916 */ 1917 MHD_EXTERN_ const struct MHD_String * 1918 MHD_http_method_to_string (enum MHD_HTTP_Method method) 1919 MHD_FN_CONST_; 1920 1921 1922 /* Main HTTP methods. */ 1923 /* Safe. Idempotent. RFC9110, Section 9.3.1. */ 1924 #define MHD_HTTP_METHOD_STR_GET "GET" 1925 /* Safe. Idempotent. RFC9110, Section 9.3.2. */ 1926 #define MHD_HTTP_METHOD_STR_HEAD "HEAD" 1927 /* Not safe. Not idempotent. RFC9110, Section 9.3.3. */ 1928 #define MHD_HTTP_METHOD_STR_POST "POST" 1929 /* Not safe. Idempotent. RFC9110, Section 9.3.4. */ 1930 #define MHD_HTTP_METHOD_STR_PUT "PUT" 1931 /* Not safe. Idempotent. RFC9110, Section 9.3.5. */ 1932 #define MHD_HTTP_METHOD_STR_DELETE "DELETE" 1933 /* Not safe. Not idempotent. RFC9110, Section 9.3.6. */ 1934 #define MHD_HTTP_METHOD_STR_CONNECT "CONNECT" 1935 /* Safe. Idempotent. RFC9110, Section 9.3.7. */ 1936 #define MHD_HTTP_METHOD_STR_OPTIONS "OPTIONS" 1937 /* Safe. Idempotent. RFC9110, Section 9.3.8. */ 1938 #define MHD_HTTP_METHOD_STR_TRACE "TRACE" 1939 /* Not safe. Not idempotent. RFC9110, Section 18.2. */ 1940 #define MHD_HTTP_METHOD_STR_ASTERISK "*" 1941 1942 /* Additional HTTP methods. */ 1943 /* Not safe. Idempotent. RFC3744, Section 8.1. */ 1944 #define MHD_HTTP_METHOD_STR_ACL "ACL" 1945 /* Not safe. Idempotent. RFC3253, Section 12.6. */ 1946 #define MHD_HTTP_METHOD_STR_BASELINE_CONTROL "BASELINE-CONTROL" 1947 /* Not safe. Idempotent. RFC5842, Section 4. */ 1948 #define MHD_HTTP_METHOD_STR_BIND "BIND" 1949 /* Not safe. Idempotent. RFC3253, Section 4.4, Section 9.4. */ 1950 #define MHD_HTTP_METHOD_STR_CHECKIN "CHECKIN" 1951 /* Not safe. Idempotent. RFC3253, Section 4.3, Section 8.8. */ 1952 #define MHD_HTTP_METHOD_STR_CHECKOUT "CHECKOUT" 1953 /* Not safe. Idempotent. RFC4918, Section 9.8. */ 1954 #define MHD_HTTP_METHOD_STR_COPY "COPY" 1955 /* Not safe. Idempotent. RFC3253, Section 8.2. */ 1956 #define MHD_HTTP_METHOD_STR_LABEL "LABEL" 1957 /* Not safe. Idempotent. RFC2068, Section 19.6.1.2. */ 1958 #define MHD_HTTP_METHOD_STR_LINK "LINK" 1959 /* Not safe. Not idempotent. RFC4918, Section 9.10. */ 1960 #define MHD_HTTP_METHOD_STR_LOCK "LOCK" 1961 /* Not safe. Idempotent. RFC3253, Section 11.2. */ 1962 #define MHD_HTTP_METHOD_STR_MERGE "MERGE" 1963 /* Not safe. Idempotent. RFC3253, Section 13.5. */ 1964 #define MHD_HTTP_METHOD_STR_MKACTIVITY "MKACTIVITY" 1965 /* Not safe. Idempotent. RFC4791, Section 5.3.1; RFC8144, Section 2.3. */ 1966 #define MHD_HTTP_METHOD_STR_MKCALENDAR "MKCALENDAR" 1967 /* Not safe. Idempotent. RFC4918, Section 9.3; RFC5689, Section 3; RFC8144, Section 2.3. */ 1968 #define MHD_HTTP_METHOD_STR_MKCOL "MKCOL" 1969 /* Not safe. Idempotent. RFC4437, Section 6. */ 1970 #define MHD_HTTP_METHOD_STR_MKREDIRECTREF "MKREDIRECTREF" 1971 /* Not safe. Idempotent. RFC3253, Section 6.3. */ 1972 #define MHD_HTTP_METHOD_STR_MKWORKSPACE "MKWORKSPACE" 1973 /* Not safe. Idempotent. RFC4918, Section 9.9. */ 1974 #define MHD_HTTP_METHOD_STR_MOVE "MOVE" 1975 /* Not safe. Idempotent. RFC3648, Section 7. */ 1976 #define MHD_HTTP_METHOD_STR_ORDERPATCH "ORDERPATCH" 1977 /* Not safe. Not idempotent. RFC5789, Section 2. */ 1978 #define MHD_HTTP_METHOD_STR_PATCH "PATCH" 1979 /* Safe. Idempotent. RFC9113, Section 3.4. */ 1980 #define MHD_HTTP_METHOD_STR_PRI "PRI" 1981 /* Safe. Idempotent. RFC4918, Section 9.1; RFC8144, Section 2.1. */ 1982 #define MHD_HTTP_METHOD_STR_PROPFIND "PROPFIND" 1983 /* Not safe. Idempotent. RFC4918, Section 9.2; RFC8144, Section 2.2. */ 1984 #define MHD_HTTP_METHOD_STR_PROPPATCH "PROPPATCH" 1985 /* Not safe. Idempotent. RFC5842, Section 6. */ 1986 #define MHD_HTTP_METHOD_STR_REBIND "REBIND" 1987 /* Safe. Idempotent. RFC3253, Section 3.6; RFC8144, Section 2.1. */ 1988 #define MHD_HTTP_METHOD_STR_REPORT "REPORT" 1989 /* Safe. Idempotent. RFC5323, Section 2. */ 1990 #define MHD_HTTP_METHOD_STR_SEARCH "SEARCH" 1991 /* Not safe. Idempotent. RFC5842, Section 5. */ 1992 #define MHD_HTTP_METHOD_STR_UNBIND "UNBIND" 1993 /* Not safe. Idempotent. RFC3253, Section 4.5. */ 1994 #define MHD_HTTP_METHOD_STR_UNCHECKOUT "UNCHECKOUT" 1995 /* Not safe. Idempotent. RFC2068, Section 19.6.1.3. */ 1996 #define MHD_HTTP_METHOD_STR_UNLINK "UNLINK" 1997 /* Not safe. Idempotent. RFC4918, Section 9.11. */ 1998 #define MHD_HTTP_METHOD_STR_UNLOCK "UNLOCK" 1999 /* Not safe. Idempotent. RFC3253, Section 7.1. */ 2000 #define MHD_HTTP_METHOD_STR_UPDATE "UPDATE" 2001 /* Not safe. Idempotent. RFC4437, Section 7. */ 2002 #define MHD_HTTP_METHOD_STR_UPDATEREDIRECTREF "UPDATEREDIRECTREF" 2003 /* Not safe. Idempotent. RFC3253, Section 3.5. */ 2004 #define MHD_HTTP_METHOD_STR_VERSION_CONTROL "VERSION-CONTROL" 2005 2006 /** @} */ /* end of group methods */ 2007 2008 #ifndef MHD_HTTP_POSTENCODING_DEFINED 2009 2010 2011 /** 2012 * @brief Possible encodings for HTML forms submitted as HTTP POST requests 2013 * 2014 * @defgroup postenc HTTP POST encodings 2015 * See also: https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#form-submission-2 2016 * @{ 2017 */ 2018 enum MHD_FIXED_ENUM_MHD_APP_SET_ MHD_HTTP_PostEncoding 2019 { 2020 /** 2021 * No post encoding / broken data / unknown encoding 2022 */ 2023 MHD_HTTP_POST_ENCODING_OTHER = 0 2024 , 2025 /** 2026 * "application/x-www-form-urlencoded" 2027 * See https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#url-encoded-form-data 2028 * See https://url.spec.whatwg.org/#application/x-www-form-urlencoded 2029 * See https://datatracker.ietf.org/doc/html/rfc3986#section-2 2030 */ 2031 MHD_HTTP_POST_ENCODING_FORM_URLENCODED = 1 2032 , 2033 /** 2034 * "multipart/form-data" 2035 * See https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#multipart-form-data 2036 * See https://www.rfc-editor.org/rfc/rfc7578.html 2037 */ 2038 MHD_HTTP_POST_ENCODING_MULTIPART_FORMDATA = 2 2039 , 2040 /** 2041 * "text/plain" 2042 * Introduced by HTML5 2043 * See https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#plain-text-form-data 2044 * @warning Format is ambiguous. Do not use unless there is a very strong reason. 2045 */ 2046 MHD_HTTP_POST_ENCODING_TEXT_PLAIN = 3 2047 }; 2048 2049 2050 /** @} */ /* end of group postenc */ 2051 2052 #define MHD_HTTP_POSTENCODING_DEFINED 1 2053 #endif /* ! MHD_HTTP_POSTENCODING_DEFINED */ 2054 2055 2056 /** 2057 * @brief Standard headers found in HTTP requests and responses. 2058 * 2059 * See: https://www.iana.org/assignments/http-fields/http-fields.xhtml 2060 * 2061 * @defgroup headers HTTP headers 2062 * Registry export date: 2023-10-02 2063 * @{ 2064 */ 2065 2066 /* Main HTTP headers. */ 2067 /* Permanent. RFC9110, Section 12.5.1: HTTP Semantics */ 2068 #define MHD_HTTP_HEADER_ACCEPT "Accept" 2069 /* Deprecated. RFC9110, Section 12.5.2: HTTP Semantics */ 2070 #define MHD_HTTP_HEADER_ACCEPT_CHARSET "Accept-Charset" 2071 /* Permanent. RFC9110, Section 12.5.3: HTTP Semantics */ 2072 #define MHD_HTTP_HEADER_ACCEPT_ENCODING "Accept-Encoding" 2073 /* Permanent. RFC9110, Section 12.5.4: HTTP Semantics */ 2074 #define MHD_HTTP_HEADER_ACCEPT_LANGUAGE "Accept-Language" 2075 /* Permanent. RFC9110, Section 14.3: HTTP Semantics */ 2076 #define MHD_HTTP_HEADER_ACCEPT_RANGES "Accept-Ranges" 2077 /* Permanent. RFC9111, Section 5.1: HTTP Caching */ 2078 #define MHD_HTTP_HEADER_AGE "Age" 2079 /* Permanent. RFC9110, Section 10.2.1: HTTP Semantics */ 2080 #define MHD_HTTP_HEADER_ALLOW "Allow" 2081 /* Permanent. RFC9110, Section 11.6.3: HTTP Semantics */ 2082 #define MHD_HTTP_HEADER_AUTHENTICATION_INFO "Authentication-Info" 2083 /* Permanent. RFC9110, Section 11.6.2: HTTP Semantics */ 2084 #define MHD_HTTP_HEADER_AUTHORIZATION "Authorization" 2085 /* Permanent. RFC9111, Section 5.2 */ 2086 #define MHD_HTTP_HEADER_CACHE_CONTROL "Cache-Control" 2087 /* Permanent. RFC9112, Section 9.6: HTTP/1.1 */ 2088 #define MHD_HTTP_HEADER_CLOSE "Close" 2089 /* Permanent. RFC9110, Section 7.6.1: HTTP Semantics */ 2090 #define MHD_HTTP_HEADER_CONNECTION "Connection" 2091 /* Permanent. RFC9110, Section 8.4: HTTP Semantics */ 2092 #define MHD_HTTP_HEADER_CONTENT_ENCODING "Content-Encoding" 2093 /* Permanent. RFC9110, Section 8.5: HTTP Semantics */ 2094 #define MHD_HTTP_HEADER_CONTENT_LANGUAGE "Content-Language" 2095 /* Permanent. RFC9110, Section 8.6: HTTP Semantics */ 2096 #define MHD_HTTP_HEADER_CONTENT_LENGTH "Content-Length" 2097 /* Permanent. RFC9110, Section 8.7: HTTP Semantics */ 2098 #define MHD_HTTP_HEADER_CONTENT_LOCATION "Content-Location" 2099 /* Permanent. RFC9110, Section 14.4: HTTP Semantics */ 2100 #define MHD_HTTP_HEADER_CONTENT_RANGE "Content-Range" 2101 /* Permanent. RFC9110, Section 8.3: HTTP Semantics */ 2102 #define MHD_HTTP_HEADER_CONTENT_TYPE "Content-Type" 2103 /* Permanent. RFC9110, Section 6.6.1: HTTP Semantics */ 2104 #define MHD_HTTP_HEADER_DATE "Date" 2105 /* Permanent. RFC9110, Section 8.8.3: HTTP Semantics */ 2106 #define MHD_HTTP_HEADER_ETAG "ETag" 2107 /* Permanent. RFC9110, Section 10.1.1: HTTP Semantics */ 2108 #define MHD_HTTP_HEADER_EXPECT "Expect" 2109 /* Permanent. RFC9111, Section 5.3: HTTP Caching */ 2110 #define MHD_HTTP_HEADER_EXPIRES "Expires" 2111 /* Permanent. RFC9110, Section 10.1.2: HTTP Semantics */ 2112 #define MHD_HTTP_HEADER_FROM "From" 2113 /* Permanent. RFC9110, Section 7.2: HTTP Semantics */ 2114 #define MHD_HTTP_HEADER_HOST "Host" 2115 /* Permanent. RFC9110, Section 13.1.1: HTTP Semantics */ 2116 #define MHD_HTTP_HEADER_IF_MATCH "If-Match" 2117 /* Permanent. RFC9110, Section 13.1.3: HTTP Semantics */ 2118 #define MHD_HTTP_HEADER_IF_MODIFIED_SINCE "If-Modified-Since" 2119 /* Permanent. RFC9110, Section 13.1.2: HTTP Semantics */ 2120 #define MHD_HTTP_HEADER_IF_NONE_MATCH "If-None-Match" 2121 /* Permanent. RFC9110, Section 13.1.5: HTTP Semantics */ 2122 #define MHD_HTTP_HEADER_IF_RANGE "If-Range" 2123 /* Permanent. RFC9110, Section 13.1.4: HTTP Semantics */ 2124 #define MHD_HTTP_HEADER_IF_UNMODIFIED_SINCE "If-Unmodified-Since" 2125 /* Permanent. RFC9110, Section 8.8.2: HTTP Semantics */ 2126 #define MHD_HTTP_HEADER_LAST_MODIFIED "Last-Modified" 2127 /* Permanent. RFC9110, Section 10.2.2: HTTP Semantics */ 2128 #define MHD_HTTP_HEADER_LOCATION "Location" 2129 /* Permanent. RFC9110, Section 7.6.2: HTTP Semantics */ 2130 #define MHD_HTTP_HEADER_MAX_FORWARDS "Max-Forwards" 2131 /* Permanent. RFC9112, Appendix B.1: HTTP/1.1 */ 2132 #define MHD_HTTP_HEADER_MIME_VERSION "MIME-Version" 2133 /* Deprecated. RFC9111, Section 5.4: HTTP Caching */ 2134 #define MHD_HTTP_HEADER_PRAGMA "Pragma" 2135 /* Permanent. RFC9110, Section 11.7.1: HTTP Semantics */ 2136 #define MHD_HTTP_HEADER_PROXY_AUTHENTICATE "Proxy-Authenticate" 2137 /* Permanent. RFC9110, Section 11.7.3: HTTP Semantics */ 2138 #define MHD_HTTP_HEADER_PROXY_AUTHENTICATION_INFO "Proxy-Authentication-Info" 2139 /* Permanent. RFC9110, Section 11.7.2: HTTP Semantics */ 2140 #define MHD_HTTP_HEADER_PROXY_AUTHORIZATION "Proxy-Authorization" 2141 /* Permanent. RFC9110, Section 14.2: HTTP Semantics */ 2142 #define MHD_HTTP_HEADER_RANGE "Range" 2143 /* Permanent. RFC9110, Section 10.1.3: HTTP Semantics */ 2144 #define MHD_HTTP_HEADER_REFERER "Referer" 2145 /* Permanent. RFC9110, Section 10.2.3: HTTP Semantics */ 2146 #define MHD_HTTP_HEADER_RETRY_AFTER "Retry-After" 2147 /* Permanent. RFC9110, Section 10.2.4: HTTP Semantics */ 2148 #define MHD_HTTP_HEADER_SERVER "Server" 2149 /* Permanent. RFC9110, Section 10.1.4: HTTP Semantics */ 2150 #define MHD_HTTP_HEADER_TE "TE" 2151 /* Permanent. RFC9110, Section 6.6.2: HTTP Semantics */ 2152 #define MHD_HTTP_HEADER_TRAILER "Trailer" 2153 /* Permanent. RFC9112, Section 6.1: HTTP Semantics */ 2154 #define MHD_HTTP_HEADER_TRANSFER_ENCODING "Transfer-Encoding" 2155 /* Permanent. RFC9110, Section 7.8: HTTP Semantics */ 2156 #define MHD_HTTP_HEADER_UPGRADE "Upgrade" 2157 /* Permanent. RFC9110, Section 10.1.5: HTTP Semantics */ 2158 #define MHD_HTTP_HEADER_USER_AGENT "User-Agent" 2159 /* Permanent. RFC9110, Section 12.5.5: HTTP Semantics */ 2160 #define MHD_HTTP_HEADER_VARY "Vary" 2161 /* Permanent. RFC9110, Section 7.6.3: HTTP Semantics */ 2162 #define MHD_HTTP_HEADER_VIA "Via" 2163 /* Permanent. RFC9110, Section 11.6.1: HTTP Semantics */ 2164 #define MHD_HTTP_HEADER_WWW_AUTHENTICATE "WWW-Authenticate" 2165 /* Permanent. RFC9110, Section 12.5.5: HTTP Semantics */ 2166 #define MHD_HTTP_HEADER_ASTERISK "*" 2167 2168 /* Additional HTTP headers. */ 2169 /* Permanent. RFC 3229: Delta encoding in HTTP */ 2170 #define MHD_HTTP_HEADER_A_IM "A-IM" 2171 /* Permanent. RFC 2324: Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0) */ 2172 #define MHD_HTTP_HEADER_ACCEPT_ADDITIONS "Accept-Additions" 2173 /* Permanent. RFC 8942, Section 3.1: HTTP Client Hints */ 2174 #define MHD_HTTP_HEADER_ACCEPT_CH "Accept-CH" 2175 /* Permanent. RFC 7089: HTTP Framework for Time-Based Access to Resource States -- Memento */ 2176 #define MHD_HTTP_HEADER_ACCEPT_DATETIME "Accept-Datetime" 2177 /* Permanent. RFC 2295: Transparent Content Negotiation in HTTP */ 2178 #define MHD_HTTP_HEADER_ACCEPT_FEATURES "Accept-Features" 2179 /* Permanent. RFC 5789: PATCH Method for HTTP */ 2180 #define MHD_HTTP_HEADER_ACCEPT_PATCH "Accept-Patch" 2181 /* Permanent. Linked Data Platform 1.0 */ 2182 #define MHD_HTTP_HEADER_ACCEPT_POST "Accept-Post" 2183 /* Permanent. RFC-ietf-httpbis-message-signatures-19, Section 5.1: HTTP Message Signatures */ 2184 #define MHD_HTTP_HEADER_ACCEPT_SIGNATURE "Accept-Signature" 2185 /* Permanent. Fetch */ 2186 #define MHD_HTTP_HEADER_ACCESS_CONTROL_ALLOW_CREDENTIALS \ 2187 "Access-Control-Allow-Credentials" 2188 /* Permanent. Fetch */ 2189 #define MHD_HTTP_HEADER_ACCESS_CONTROL_ALLOW_HEADERS \ 2190 "Access-Control-Allow-Headers" 2191 /* Permanent. Fetch */ 2192 #define MHD_HTTP_HEADER_ACCESS_CONTROL_ALLOW_METHODS \ 2193 "Access-Control-Allow-Methods" 2194 /* Permanent. Fetch */ 2195 #define MHD_HTTP_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN \ 2196 "Access-Control-Allow-Origin" 2197 /* Permanent. Fetch */ 2198 #define MHD_HTTP_HEADER_ACCESS_CONTROL_EXPOSE_HEADERS \ 2199 "Access-Control-Expose-Headers" 2200 /* Permanent. Fetch */ 2201 #define MHD_HTTP_HEADER_ACCESS_CONTROL_MAX_AGE "Access-Control-Max-Age" 2202 /* Permanent. Fetch */ 2203 #define MHD_HTTP_HEADER_ACCESS_CONTROL_REQUEST_HEADERS \ 2204 "Access-Control-Request-Headers" 2205 /* Permanent. Fetch */ 2206 #define MHD_HTTP_HEADER_ACCESS_CONTROL_REQUEST_METHOD \ 2207 "Access-Control-Request-Method" 2208 /* Permanent. RFC 7639, Section 2: The ALPN HTTP Header Field */ 2209 #define MHD_HTTP_HEADER_ALPN "ALPN" 2210 /* Permanent. RFC 7838: HTTP Alternative Services */ 2211 #define MHD_HTTP_HEADER_ALT_SVC "Alt-Svc" 2212 /* Permanent. RFC 7838: HTTP Alternative Services */ 2213 #define MHD_HTTP_HEADER_ALT_USED "Alt-Used" 2214 /* Permanent. RFC 2295: Transparent Content Negotiation in HTTP */ 2215 #define MHD_HTTP_HEADER_ALTERNATES "Alternates" 2216 /* Permanent. RFC 4437: Web Distributed Authoring and Versioning (WebDAV) Redirect Reference Resources */ 2217 #define MHD_HTTP_HEADER_APPLY_TO_REDIRECT_REF "Apply-To-Redirect-Ref" 2218 /* Permanent. RFC 8053, Section 4: HTTP Authentication Extensions for Interactive Clients */ 2219 #define MHD_HTTP_HEADER_AUTHENTICATION_CONTROL "Authentication-Control" 2220 /* Permanent. RFC9211: The Cache-Status HTTP Response Header Field */ 2221 #define MHD_HTTP_HEADER_CACHE_STATUS "Cache-Status" 2222 /* Permanent. RFC 8607, Section 5.1: Calendaring Extensions to WebDAV (CalDAV): Managed Attachments */ 2223 #define MHD_HTTP_HEADER_CAL_MANAGED_ID "Cal-Managed-ID" 2224 /* Permanent. RFC 7809, Section 7.1: Calendaring Extensions to WebDAV (CalDAV): Time Zones by Reference */ 2225 #define MHD_HTTP_HEADER_CALDAV_TIMEZONES "CalDAV-Timezones" 2226 /* Permanent. RFC9297 */ 2227 #define MHD_HTTP_HEADER_CAPSULE_PROTOCOL "Capsule-Protocol" 2228 /* Permanent. RFC9213: Targeted HTTP Cache Control */ 2229 #define MHD_HTTP_HEADER_CDN_CACHE_CONTROL "CDN-Cache-Control" 2230 /* Permanent. RFC 8586: Loop Detection in Content Delivery Networks (CDNs) */ 2231 #define MHD_HTTP_HEADER_CDN_LOOP "CDN-Loop" 2232 /* Permanent. RFC 8739, Section 3.3: Support for Short-Term, Automatically Renewed (STAR) Certificates in the Automated Certificate Management Environment (ACME) */ 2233 #define MHD_HTTP_HEADER_CERT_NOT_AFTER "Cert-Not-After" 2234 /* Permanent. RFC 8739, Section 3.3: Support for Short-Term, Automatically Renewed (STAR) Certificates in the Automated Certificate Management Environment (ACME) */ 2235 #define MHD_HTTP_HEADER_CERT_NOT_BEFORE "Cert-Not-Before" 2236 /* Permanent. Clear Site Data */ 2237 #define MHD_HTTP_HEADER_CLEAR_SITE_DATA "Clear-Site-Data" 2238 /* Permanent. RFC9440, Section 2: Client-Cert HTTP Header Field */ 2239 #define MHD_HTTP_HEADER_CLIENT_CERT "Client-Cert" 2240 /* Permanent. RFC9440, Section 2: Client-Cert HTTP Header Field */ 2241 #define MHD_HTTP_HEADER_CLIENT_CERT_CHAIN "Client-Cert-Chain" 2242 /* Permanent. RFC-ietf-httpbis-digest-headers-13, Section 2: Digest Fields */ 2243 #define MHD_HTTP_HEADER_CONTENT_DIGEST "Content-Digest" 2244 /* Permanent. RFC 6266: Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP) */ 2245 #define MHD_HTTP_HEADER_CONTENT_DISPOSITION "Content-Disposition" 2246 /* Permanent. The HTTP Distribution and Replication Protocol */ 2247 #define MHD_HTTP_HEADER_CONTENT_ID "Content-ID" 2248 /* Permanent. Content Security Policy Level 3 */ 2249 #define MHD_HTTP_HEADER_CONTENT_SECURITY_POLICY "Content-Security-Policy" 2250 /* Permanent. Content Security Policy Level 3 */ 2251 #define MHD_HTTP_HEADER_CONTENT_SECURITY_POLICY_REPORT_ONLY \ 2252 "Content-Security-Policy-Report-Only" 2253 /* Permanent. RFC 6265: HTTP State Management Mechanism */ 2254 #define MHD_HTTP_HEADER_COOKIE "Cookie" 2255 /* Permanent. HTML */ 2256 #define MHD_HTTP_HEADER_CROSS_ORIGIN_EMBEDDER_POLICY \ 2257 "Cross-Origin-Embedder-Policy" 2258 /* Permanent. HTML */ 2259 #define MHD_HTTP_HEADER_CROSS_ORIGIN_EMBEDDER_POLICY_REPORT_ONLY \ 2260 "Cross-Origin-Embedder-Policy-Report-Only" 2261 /* Permanent. HTML */ 2262 #define MHD_HTTP_HEADER_CROSS_ORIGIN_OPENER_POLICY "Cross-Origin-Opener-Policy" 2263 /* Permanent. HTML */ 2264 #define MHD_HTTP_HEADER_CROSS_ORIGIN_OPENER_POLICY_REPORT_ONLY \ 2265 "Cross-Origin-Opener-Policy-Report-Only" 2266 /* Permanent. Fetch */ 2267 #define MHD_HTTP_HEADER_CROSS_ORIGIN_RESOURCE_POLICY \ 2268 "Cross-Origin-Resource-Policy" 2269 /* Permanent. RFC 5323: Web Distributed Authoring and Versioning (WebDAV) SEARCH */ 2270 #define MHD_HTTP_HEADER_DASL "DASL" 2271 /* Permanent. RFC 4918: HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV) */ 2272 #define MHD_HTTP_HEADER_DAV "DAV" 2273 /* Permanent. RFC 3229: Delta encoding in HTTP */ 2274 #define MHD_HTTP_HEADER_DELTA_BASE "Delta-Base" 2275 /* Permanent. RFC 4918: HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV) */ 2276 #define MHD_HTTP_HEADER_DEPTH "Depth" 2277 /* Permanent. RFC 4918: HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV) */ 2278 #define MHD_HTTP_HEADER_DESTINATION "Destination" 2279 /* Permanent. The HTTP Distribution and Replication Protocol */ 2280 #define MHD_HTTP_HEADER_DIFFERENTIAL_ID "Differential-ID" 2281 /* Permanent. RFC9449: OAuth 2.0 Demonstrating Proof of Possession (DPoP) */ 2282 #define MHD_HTTP_HEADER_DPOP "DPoP" 2283 /* Permanent. RFC9449: OAuth 2.0 Demonstrating Proof of Possession (DPoP) */ 2284 #define MHD_HTTP_HEADER_DPOP_NONCE "DPoP-Nonce" 2285 /* Permanent. RFC 8470: Using Early Data in HTTP */ 2286 #define MHD_HTTP_HEADER_EARLY_DATA "Early-Data" 2287 /* Permanent. RFC9163: Expect-CT Extension for HTTP */ 2288 #define MHD_HTTP_HEADER_EXPECT_CT "Expect-CT" 2289 /* Permanent. RFC 7239: Forwarded HTTP Extension */ 2290 #define MHD_HTTP_HEADER_FORWARDED "Forwarded" 2291 /* Permanent. RFC 7486, Section 6.1.1: HTTP Origin-Bound Authentication (HOBA) */ 2292 #define MHD_HTTP_HEADER_HOBAREG "Hobareg" 2293 /* Permanent. RFC 4918: HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV) */ 2294 #define MHD_HTTP_HEADER_IF "If" 2295 /* Permanent. RFC 6338: Scheduling Extensions to CalDAV */ 2296 #define MHD_HTTP_HEADER_IF_SCHEDULE_TAG_MATCH "If-Schedule-Tag-Match" 2297 /* Permanent. RFC 3229: Delta encoding in HTTP */ 2298 #define MHD_HTTP_HEADER_IM "IM" 2299 /* Permanent. RFC 8473: Token Binding over HTTP */ 2300 #define MHD_HTTP_HEADER_INCLUDE_REFERRED_TOKEN_BINDING_ID \ 2301 "Include-Referred-Token-Binding-ID" 2302 /* Permanent. RFC 2068: Hypertext Transfer Protocol -- HTTP/1.1 */ 2303 #define MHD_HTTP_HEADER_KEEP_ALIVE "Keep-Alive" 2304 /* Permanent. RFC 3253: Versioning Extensions to WebDAV: (Web Distributed Authoring and Versioning) */ 2305 #define MHD_HTTP_HEADER_LABEL "Label" 2306 /* Permanent. HTML */ 2307 #define MHD_HTTP_HEADER_LAST_EVENT_ID "Last-Event-ID" 2308 /* Permanent. RFC 8288: Web Linking */ 2309 #define MHD_HTTP_HEADER_LINK "Link" 2310 /* Permanent. RFC 4918: HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV) */ 2311 #define MHD_HTTP_HEADER_LOCK_TOKEN "Lock-Token" 2312 /* Permanent. RFC 7089: HTTP Framework for Time-Based Access to Resource States -- Memento */ 2313 #define MHD_HTTP_HEADER_MEMENTO_DATETIME "Memento-Datetime" 2314 /* Permanent. RFC 2227: Simple Hit-Metering and Usage-Limiting for HTTP */ 2315 #define MHD_HTTP_HEADER_METER "Meter" 2316 /* Permanent. RFC 2295: Transparent Content Negotiation in HTTP */ 2317 #define MHD_HTTP_HEADER_NEGOTIATE "Negotiate" 2318 /* Permanent. Network Error Logging */ 2319 #define MHD_HTTP_HEADER_NEL "NEL" 2320 /* Permanent. OData Version 4.01 Part 1: Protocol; OASIS; Chet_Ensign */ 2321 #define MHD_HTTP_HEADER_ODATA_ENTITYID "OData-EntityId" 2322 /* Permanent. OData Version 4.01 Part 1: Protocol; OASIS; Chet_Ensign */ 2323 #define MHD_HTTP_HEADER_ODATA_ISOLATION "OData-Isolation" 2324 /* Permanent. OData Version 4.01 Part 1: Protocol; OASIS; Chet_Ensign */ 2325 #define MHD_HTTP_HEADER_ODATA_MAXVERSION "OData-MaxVersion" 2326 /* Permanent. OData Version 4.01 Part 1: Protocol; OASIS; Chet_Ensign */ 2327 #define MHD_HTTP_HEADER_ODATA_VERSION "OData-Version" 2328 /* Permanent. RFC 8053, Section 3: HTTP Authentication Extensions for Interactive Clients */ 2329 #define MHD_HTTP_HEADER_OPTIONAL_WWW_AUTHENTICATE "Optional-WWW-Authenticate" 2330 /* Permanent. RFC 3648: Web Distributed Authoring and Versioning (WebDAV) Ordered Collections Protocol */ 2331 #define MHD_HTTP_HEADER_ORDERING_TYPE "Ordering-Type" 2332 /* Permanent. RFC 6454: The Web Origin Concept */ 2333 #define MHD_HTTP_HEADER_ORIGIN "Origin" 2334 /* Permanent. HTML */ 2335 #define MHD_HTTP_HEADER_ORIGIN_AGENT_CLUSTER "Origin-Agent-Cluster" 2336 /* Permanent. RFC 8613, Section 11.1: Object Security for Constrained RESTful Environments (OSCORE) */ 2337 #define MHD_HTTP_HEADER_OSCORE "OSCORE" 2338 /* Permanent. OASIS Project Specification 01; OASIS; Chet_Ensign */ 2339 #define MHD_HTTP_HEADER_OSLC_CORE_VERSION "OSLC-Core-Version" 2340 /* Permanent. RFC 4918: HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV) */ 2341 #define MHD_HTTP_HEADER_OVERWRITE "Overwrite" 2342 /* Permanent. HTML */ 2343 #define MHD_HTTP_HEADER_PING_FROM "Ping-From" 2344 /* Permanent. HTML */ 2345 #define MHD_HTTP_HEADER_PING_TO "Ping-To" 2346 /* Permanent. RFC 3648: Web Distributed Authoring and Versioning (WebDAV) Ordered Collections Protocol */ 2347 #define MHD_HTTP_HEADER_POSITION "Position" 2348 /* Permanent. RFC 7240: Prefer Header for HTTP */ 2349 #define MHD_HTTP_HEADER_PREFER "Prefer" 2350 /* Permanent. RFC 7240: Prefer Header for HTTP */ 2351 #define MHD_HTTP_HEADER_PREFERENCE_APPLIED "Preference-Applied" 2352 /* Permanent. RFC9218: Extensible Prioritization Scheme for HTTP */ 2353 #define MHD_HTTP_HEADER_PRIORITY "Priority" 2354 /* Permanent. RFC9209: The Proxy-Status HTTP Response Header Field */ 2355 #define MHD_HTTP_HEADER_PROXY_STATUS "Proxy-Status" 2356 /* Permanent. RFC 7469: Public Key Pinning Extension for HTTP */ 2357 #define MHD_HTTP_HEADER_PUBLIC_KEY_PINS "Public-Key-Pins" 2358 /* Permanent. RFC 7469: Public Key Pinning Extension for HTTP */ 2359 #define MHD_HTTP_HEADER_PUBLIC_KEY_PINS_REPORT_ONLY \ 2360 "Public-Key-Pins-Report-Only" 2361 /* Permanent. RFC 4437: Web Distributed Authoring and Versioning (WebDAV) Redirect Reference Resources */ 2362 #define MHD_HTTP_HEADER_REDIRECT_REF "Redirect-Ref" 2363 /* Permanent. HTML */ 2364 #define MHD_HTTP_HEADER_REFRESH "Refresh" 2365 /* Permanent. RFC 8555, Section 6.5.1: Automatic Certificate Management Environment (ACME) */ 2366 #define MHD_HTTP_HEADER_REPLAY_NONCE "Replay-Nonce" 2367 /* Permanent. RFC-ietf-httpbis-digest-headers-13, Section 3: Digest Fields */ 2368 #define MHD_HTTP_HEADER_REPR_DIGEST "Repr-Digest" 2369 /* Permanent. RFC 6638: Scheduling Extensions to CalDAV */ 2370 #define MHD_HTTP_HEADER_SCHEDULE_REPLY "Schedule-Reply" 2371 /* Permanent. RFC 6338: Scheduling Extensions to CalDAV */ 2372 #define MHD_HTTP_HEADER_SCHEDULE_TAG "Schedule-Tag" 2373 /* Permanent. Fetch */ 2374 #define MHD_HTTP_HEADER_SEC_PURPOSE "Sec-Purpose" 2375 /* Permanent. RFC 8473: Token Binding over HTTP */ 2376 #define MHD_HTTP_HEADER_SEC_TOKEN_BINDING "Sec-Token-Binding" 2377 /* Permanent. RFC 6455: The WebSocket Protocol */ 2378 #define MHD_HTTP_HEADER_SEC_WEBSOCKET_ACCEPT "Sec-WebSocket-Accept" 2379 /* Permanent. RFC 6455: The WebSocket Protocol */ 2380 #define MHD_HTTP_HEADER_SEC_WEBSOCKET_EXTENSIONS "Sec-WebSocket-Extensions" 2381 /* Permanent. RFC 6455: The WebSocket Protocol */ 2382 #define MHD_HTTP_HEADER_SEC_WEBSOCKET_KEY "Sec-WebSocket-Key" 2383 /* Permanent. RFC 6455: The WebSocket Protocol */ 2384 #define MHD_HTTP_HEADER_SEC_WEBSOCKET_PROTOCOL "Sec-WebSocket-Protocol" 2385 /* Permanent. RFC 6455: The WebSocket Protocol */ 2386 #define MHD_HTTP_HEADER_SEC_WEBSOCKET_VERSION "Sec-WebSocket-Version" 2387 /* Permanent. Server Timing */ 2388 #define MHD_HTTP_HEADER_SERVER_TIMING "Server-Timing" 2389 /* Permanent. RFC 6265: HTTP State Management Mechanism */ 2390 #define MHD_HTTP_HEADER_SET_COOKIE "Set-Cookie" 2391 /* Permanent. RFC-ietf-httpbis-message-signatures-19, Section 4.2: HTTP Message Signatures */ 2392 #define MHD_HTTP_HEADER_SIGNATURE "Signature" 2393 /* Permanent. RFC-ietf-httpbis-message-signatures-19, Section 4.1: HTTP Message Signatures */ 2394 #define MHD_HTTP_HEADER_SIGNATURE_INPUT "Signature-Input" 2395 /* Permanent. RFC 5023: The Atom Publishing Protocol */ 2396 #define MHD_HTTP_HEADER_SLUG "SLUG" 2397 /* Permanent. Simple Object Access Protocol (SOAP) 1.1 */ 2398 #define MHD_HTTP_HEADER_SOAPACTION "SoapAction" 2399 /* Permanent. RFC 2518: HTTP Extensions for Distributed Authoring -- WEBDAV */ 2400 #define MHD_HTTP_HEADER_STATUS_URI "Status-URI" 2401 /* Permanent. RFC 6797: HTTP Strict Transport Security (HSTS) */ 2402 #define MHD_HTTP_HEADER_STRICT_TRANSPORT_SECURITY "Strict-Transport-Security" 2403 /* Permanent. RFC 8594: The Sunset HTTP Header Field */ 2404 #define MHD_HTTP_HEADER_SUNSET "Sunset" 2405 /* Permanent. Edge Architecture Specification */ 2406 #define MHD_HTTP_HEADER_SURROGATE_CAPABILITY "Surrogate-Capability" 2407 /* Permanent. Edge Architecture Specification */ 2408 #define MHD_HTTP_HEADER_SURROGATE_CONTROL "Surrogate-Control" 2409 /* Permanent. RFC 2295: Transparent Content Negotiation in HTTP */ 2410 #define MHD_HTTP_HEADER_TCN "TCN" 2411 /* Permanent. RFC 4918: HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV) */ 2412 #define MHD_HTTP_HEADER_TIMEOUT "Timeout" 2413 /* Permanent. RFC 8030, Section 5.4: Generic Event Delivery Using HTTP Push */ 2414 #define MHD_HTTP_HEADER_TOPIC "Topic" 2415 /* Permanent. Trace Context */ 2416 #define MHD_HTTP_HEADER_TRACEPARENT "Traceparent" 2417 /* Permanent. Trace Context */ 2418 #define MHD_HTTP_HEADER_TRACESTATE "Tracestate" 2419 /* Permanent. RFC 8030, Section 5.2: Generic Event Delivery Using HTTP Push */ 2420 #define MHD_HTTP_HEADER_TTL "TTL" 2421 /* Permanent. RFC 8030, Section 5.3: Generic Event Delivery Using HTTP Push */ 2422 #define MHD_HTTP_HEADER_URGENCY "Urgency" 2423 /* Permanent. RFC 2295: Transparent Content Negotiation in HTTP */ 2424 #define MHD_HTTP_HEADER_VARIANT_VARY "Variant-Vary" 2425 /* Permanent. RFC-ietf-httpbis-digest-headers-13, Section 4: Digest Fields */ 2426 #define MHD_HTTP_HEADER_WANT_CONTENT_DIGEST "Want-Content-Digest" 2427 /* Permanent. RFC-ietf-httpbis-digest-headers-13, Section 4: Digest Fields */ 2428 #define MHD_HTTP_HEADER_WANT_REPR_DIGEST "Want-Repr-Digest" 2429 /* Permanent. Fetch */ 2430 #define MHD_HTTP_HEADER_X_CONTENT_TYPE_OPTIONS "X-Content-Type-Options" 2431 /* Permanent. HTML */ 2432 #define MHD_HTTP_HEADER_X_FRAME_OPTIONS "X-Frame-Options" 2433 /* Provisional. AMP-Cache-Transform HTTP request header */ 2434 #define MHD_HTTP_HEADER_AMP_CACHE_TRANSFORM "AMP-Cache-Transform" 2435 /* Provisional. OSLC Configuration Management Version 1.0. Part 3: Configuration Specification */ 2436 #define MHD_HTTP_HEADER_CONFIGURATION_CONTEXT "Configuration-Context" 2437 /* Provisional. RFC 6017: Electronic Data Interchange - Internet Integration (EDIINT) Features Header Field */ 2438 #define MHD_HTTP_HEADER_EDIINT_FEATURES "EDIINT-Features" 2439 /* Provisional. OData Version 4.01 Part 1: Protocol; OASIS; Chet_Ensign */ 2440 #define MHD_HTTP_HEADER_ISOLATION "Isolation" 2441 /* Provisional. Permissions Policy */ 2442 #define MHD_HTTP_HEADER_PERMISSIONS_POLICY "Permissions-Policy" 2443 /* Provisional. Repeatable Requests Version 1.0; OASIS; Chet_Ensign */ 2444 #define MHD_HTTP_HEADER_REPEATABILITY_CLIENT_ID "Repeatability-Client-ID" 2445 /* Provisional. Repeatable Requests Version 1.0; OASIS; Chet_Ensign */ 2446 #define MHD_HTTP_HEADER_REPEATABILITY_FIRST_SENT "Repeatability-First-Sent" 2447 /* Provisional. Repeatable Requests Version 1.0; OASIS; Chet_Ensign */ 2448 #define MHD_HTTP_HEADER_REPEATABILITY_REQUEST_ID "Repeatability-Request-ID" 2449 /* Provisional. Repeatable Requests Version 1.0; OASIS; Chet_Ensign */ 2450 #define MHD_HTTP_HEADER_REPEATABILITY_RESULT "Repeatability-Result" 2451 /* Provisional. Reporting API */ 2452 #define MHD_HTTP_HEADER_REPORTING_ENDPOINTS "Reporting-Endpoints" 2453 /* Provisional. Global Privacy Control (GPC) */ 2454 #define MHD_HTTP_HEADER_SEC_GPC "Sec-GPC" 2455 /* Provisional. Resource Timing Level 1 */ 2456 #define MHD_HTTP_HEADER_TIMING_ALLOW_ORIGIN "Timing-Allow-Origin" 2457 /* Deprecated. PEP - an Extension Mechanism for HTTP; status-change-http-experiments-to-historic */ 2458 #define MHD_HTTP_HEADER_C_PEP_INFO "C-PEP-Info" 2459 /* Deprecated. White Paper: Joint Electronic Payment Initiative */ 2460 #define MHD_HTTP_HEADER_PROTOCOL_INFO "Protocol-Info" 2461 /* Deprecated. White Paper: Joint Electronic Payment Initiative */ 2462 #define MHD_HTTP_HEADER_PROTOCOL_QUERY "Protocol-Query" 2463 /* Obsoleted. Access Control for Cross-site Requests */ 2464 #define MHD_HTTP_HEADER_ACCESS_CONTROL "Access-Control" 2465 /* Obsoleted. RFC 2774: An HTTP Extension Framework; status-change-http-experiments-to-historic */ 2466 #define MHD_HTTP_HEADER_C_EXT "C-Ext" 2467 /* Obsoleted. RFC 2774: An HTTP Extension Framework; status-change-http-experiments-to-historic */ 2468 #define MHD_HTTP_HEADER_C_MAN "C-Man" 2469 /* Obsoleted. RFC 2774: An HTTP Extension Framework; status-change-http-experiments-to-historic */ 2470 #define MHD_HTTP_HEADER_C_OPT "C-Opt" 2471 /* Obsoleted. PEP - an Extension Mechanism for HTTP; status-change-http-experiments-to-historic */ 2472 #define MHD_HTTP_HEADER_C_PEP "C-PEP" 2473 /* Obsoleted. RFC 2068: Hypertext Transfer Protocol -- HTTP/1.1; RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1 */ 2474 #define MHD_HTTP_HEADER_CONTENT_BASE "Content-Base" 2475 /* Obsoleted. RFC 2616, Section 14.15: Hypertext Transfer Protocol -- HTTP/1.1; RFC 7231, Appendix B: Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content */ 2476 #define MHD_HTTP_HEADER_CONTENT_MD5 "Content-MD5" 2477 /* Obsoleted. HTML 4.01 Specification */ 2478 #define MHD_HTTP_HEADER_CONTENT_SCRIPT_TYPE "Content-Script-Type" 2479 /* Obsoleted. HTML 4.01 Specification */ 2480 #define MHD_HTTP_HEADER_CONTENT_STYLE_TYPE "Content-Style-Type" 2481 /* Obsoleted. RFC 2068: Hypertext Transfer Protocol -- HTTP/1.1 */ 2482 #define MHD_HTTP_HEADER_CONTENT_VERSION "Content-Version" 2483 /* Obsoleted. RFC 2965: HTTP State Management Mechanism; RFC 6265: HTTP State Management Mechanism */ 2484 #define MHD_HTTP_HEADER_COOKIE2 "Cookie2" 2485 /* Obsoleted. HTML 4.01 Specification */ 2486 #define MHD_HTTP_HEADER_DEFAULT_STYLE "Default-Style" 2487 /* Obsoleted. RFC 2068: Hypertext Transfer Protocol -- HTTP/1.1 */ 2488 #define MHD_HTTP_HEADER_DERIVED_FROM "Derived-From" 2489 /* Obsoleted. RFC 3230: Instance Digests in HTTP; RFC-ietf-httpbis-digest-headers-13, Section 1.3: Digest Fields */ 2490 #define MHD_HTTP_HEADER_DIGEST "Digest" 2491 /* Obsoleted. RFC 2774: An HTTP Extension Framework; status-change-http-experiments-to-historic */ 2492 #define MHD_HTTP_HEADER_EXT "Ext" 2493 /* Obsoleted. Implementation of OPS Over HTTP */ 2494 #define MHD_HTTP_HEADER_GETPROFILE "GetProfile" 2495 /* Obsoleted. RFC 7540, Section 3.2.1: Hypertext Transfer Protocol Version 2 (HTTP/2) */ 2496 #define MHD_HTTP_HEADER_HTTP2_SETTINGS "HTTP2-Settings" 2497 /* Obsoleted. RFC 2774: An HTTP Extension Framework; status-change-http-experiments-to-historic */ 2498 #define MHD_HTTP_HEADER_MAN "Man" 2499 /* Obsoleted. Access Control for Cross-site Requests */ 2500 #define MHD_HTTP_HEADER_METHOD_CHECK "Method-Check" 2501 /* Obsoleted. Access Control for Cross-site Requests */ 2502 #define MHD_HTTP_HEADER_METHOD_CHECK_EXPIRES "Method-Check-Expires" 2503 /* Obsoleted. RFC 2774: An HTTP Extension Framework; status-change-http-experiments-to-historic */ 2504 #define MHD_HTTP_HEADER_OPT "Opt" 2505 /* Obsoleted. The Platform for Privacy Preferences 1.0 (P3P1.0) Specification */ 2506 #define MHD_HTTP_HEADER_P3P "P3P" 2507 /* Obsoleted. PEP - an Extension Mechanism for HTTP */ 2508 #define MHD_HTTP_HEADER_PEP "PEP" 2509 /* Obsoleted. PEP - an Extension Mechanism for HTTP */ 2510 #define MHD_HTTP_HEADER_PEP_INFO "Pep-Info" 2511 /* Obsoleted. PICS Label Distribution Label Syntax and Communication Protocols */ 2512 #define MHD_HTTP_HEADER_PICS_LABEL "PICS-Label" 2513 /* Obsoleted. Implementation of OPS Over HTTP */ 2514 #define MHD_HTTP_HEADER_PROFILEOBJECT "ProfileObject" 2515 /* Obsoleted. PICS Label Distribution Label Syntax and Communication Protocols */ 2516 #define MHD_HTTP_HEADER_PROTOCOL "Protocol" 2517 /* Obsoleted. PICS Label Distribution Label Syntax and Communication Protocols */ 2518 #define MHD_HTTP_HEADER_PROTOCOL_REQUEST "Protocol-Request" 2519 /* Obsoleted. Notification for Proxy Caches */ 2520 #define MHD_HTTP_HEADER_PROXY_FEATURES "Proxy-Features" 2521 /* Obsoleted. Notification for Proxy Caches */ 2522 #define MHD_HTTP_HEADER_PROXY_INSTRUCTION "Proxy-Instruction" 2523 /* Obsoleted. RFC 2068: Hypertext Transfer Protocol -- HTTP/1.1 */ 2524 #define MHD_HTTP_HEADER_PUBLIC "Public" 2525 /* Obsoleted. Access Control for Cross-site Requests */ 2526 #define MHD_HTTP_HEADER_REFERER_ROOT "Referer-Root" 2527 /* Obsoleted. RFC 2310: The Safe Response Header Field; status-change-http-experiments-to-historic */ 2528 #define MHD_HTTP_HEADER_SAFE "Safe" 2529 /* Obsoleted. RFC 2660: The Secure HyperText Transfer Protocol; status-change-http-experiments-to-historic */ 2530 #define MHD_HTTP_HEADER_SECURITY_SCHEME "Security-Scheme" 2531 /* Obsoleted. RFC 2965: HTTP State Management Mechanism; RFC 6265: HTTP State Management Mechanism */ 2532 #define MHD_HTTP_HEADER_SET_COOKIE2 "Set-Cookie2" 2533 /* Obsoleted. Implementation of OPS Over HTTP */ 2534 #define MHD_HTTP_HEADER_SETPROFILE "SetProfile" 2535 /* Obsoleted. RFC 2068: Hypertext Transfer Protocol -- HTTP/1.1 */ 2536 #define MHD_HTTP_HEADER_URI "URI" 2537 /* Obsoleted. RFC 3230: Instance Digests in HTTP; RFC-ietf-httpbis-digest-headers-13, Section 1.3: Digest Fields */ 2538 #define MHD_HTTP_HEADER_WANT_DIGEST "Want-Digest" 2539 /* Obsoleted. RFC9111, Section 5.5: HTTP Caching */ 2540 #define MHD_HTTP_HEADER_WARNING "Warning" 2541 2542 /* Headers removed from the registry. Do not use! */ 2543 /* Obsoleted. RFC4229 */ 2544 #define MHD_HTTP_HEADER_COMPLIANCE "Compliance" 2545 /* Obsoleted. RFC4229 */ 2546 #define MHD_HTTP_HEADER_CONTENT_TRANSFER_ENCODING "Content-Transfer-Encoding" 2547 /* Obsoleted. RFC4229 */ 2548 #define MHD_HTTP_HEADER_COST "Cost" 2549 /* Obsoleted. RFC4229 */ 2550 #define MHD_HTTP_HEADER_MESSAGE_ID "Message-ID" 2551 /* Obsoleted. RFC4229 */ 2552 #define MHD_HTTP_HEADER_NON_COMPLIANCE "Non-Compliance" 2553 /* Obsoleted. RFC4229 */ 2554 #define MHD_HTTP_HEADER_OPTIONAL "Optional" 2555 /* Obsoleted. RFC4229 */ 2556 #define MHD_HTTP_HEADER_RESOLUTION_HINT "Resolution-Hint" 2557 /* Obsoleted. RFC4229 */ 2558 #define MHD_HTTP_HEADER_RESOLVER_LOCATION "Resolver-Location" 2559 /* Obsoleted. RFC4229 */ 2560 #define MHD_HTTP_HEADER_SUBOK "SubOK" 2561 /* Obsoleted. RFC4229 */ 2562 #define MHD_HTTP_HEADER_SUBST "Subst" 2563 /* Obsoleted. RFC4229 */ 2564 #define MHD_HTTP_HEADER_TITLE "Title" 2565 /* Obsoleted. RFC4229 */ 2566 #define MHD_HTTP_HEADER_UA_COLOR "UA-Color" 2567 /* Obsoleted. RFC4229 */ 2568 #define MHD_HTTP_HEADER_UA_MEDIA "UA-Media" 2569 /* Obsoleted. RFC4229 */ 2570 #define MHD_HTTP_HEADER_UA_PIXELS "UA-Pixels" 2571 /* Obsoleted. RFC4229 */ 2572 #define MHD_HTTP_HEADER_UA_RESOLUTION "UA-Resolution" 2573 /* Obsoleted. RFC4229 */ 2574 #define MHD_HTTP_HEADER_UA_WINDOWPIXELS "UA-Windowpixels" 2575 /* Obsoleted. RFC4229 */ 2576 #define MHD_HTTP_HEADER_VERSION "Version" 2577 /* Obsoleted. W3C Mobile Web Best Practices Working Group */ 2578 #define MHD_HTTP_HEADER_X_DEVICE_ACCEPT "X-Device-Accept" 2579 /* Obsoleted. W3C Mobile Web Best Practices Working Group */ 2580 #define MHD_HTTP_HEADER_X_DEVICE_ACCEPT_CHARSET "X-Device-Accept-Charset" 2581 /* Obsoleted. W3C Mobile Web Best Practices Working Group */ 2582 #define MHD_HTTP_HEADER_X_DEVICE_ACCEPT_ENCODING "X-Device-Accept-Encoding" 2583 /* Obsoleted. W3C Mobile Web Best Practices Working Group */ 2584 #define MHD_HTTP_HEADER_X_DEVICE_ACCEPT_LANGUAGE "X-Device-Accept-Language" 2585 /* Obsoleted. W3C Mobile Web Best Practices Working Group */ 2586 #define MHD_HTTP_HEADER_X_DEVICE_USER_AGENT "X-Device-User-Agent" 2587 2588 2589 /** 2590 * Predefined list of headers 2591 * To be filled with HPACK static data 2592 */ 2593 enum MHD_PredefinedHeader 2594 { 2595 MHD_PREDEF_ACCEPT_CHARSET = 15, 2596 MHD_PREDEF_ACCEPT_LANGUAGE = 17 2597 }; 2598 2599 2600 /** @} */ /* end of group headers */ 2601 2602 /** 2603 * A client has requested the given url using the given method 2604 * (#MHD_HTTP_METHOD_GET, #MHD_HTTP_METHOD_PUT, 2605 * #MHD_HTTP_METHOD_DELETE, #MHD_HTTP_METHOD_POST, etc). 2606 * If @a upload_size is not zero and response action is provided by this 2607 * callback, then upload will be discarded and the stream (the connection for 2608 * HTTP/1.1) will be closed after sending the response. 2609 * 2610 * @param cls argument given together with the function 2611 * pointer when the handler was registered with MHD 2612 * @param request the request object 2613 * @param path the requested uri (without arguments after "?") 2614 * @param method the HTTP method used (#MHD_HTTP_METHOD_GET, 2615 * #MHD_HTTP_METHOD_PUT, etc.) 2616 * @param upload_size the size of the message upload content payload, 2617 * #MHD_SIZE_UNKNOWN for chunked uploads (if the 2618 * final chunk has not been processed yet) 2619 * @return action how to proceed, NULL 2620 * if the request must be aborted due to a serious 2621 * error while handling the request (implies closure 2622 * of underling data stream, for HTTP/1.1 it means 2623 * socket closure). 2624 */ 2625 typedef const struct MHD_Action * 2626 (MHD_FN_PAR_NONNULL_ (2) MHD_FN_PAR_NONNULL_ (3) 2627 *MHD_RequestCallback)(void *cls, 2628 struct MHD_Request *MHD_RESTRICT request, 2629 const struct MHD_String *MHD_RESTRICT path, 2630 enum MHD_HTTP_Method method, 2631 uint_fast64_t upload_size); 2632 2633 2634 /** 2635 * Create (but do not yet start) an MHD daemon. 2636 * Usually, various options are set before 2637 * starting the daemon with #MHD_daemon_start(). 2638 * 2639 * @param req_cb the function to be called for incoming requests 2640 * @param req_cb_cls the closure for @a cb 2641 * @return the pointer to the new object on success, 2642 * NULL on error (like out-of-memory) 2643 */ 2644 MHD_EXTERN_ struct MHD_Daemon * 2645 MHD_daemon_create (MHD_RequestCallback req_cb, 2646 void *req_cb_cls) 2647 MHD_FN_MUST_CHECK_RESULT_; 2648 2649 2650 /** 2651 * Start a webserver. 2652 * This function: 2653 * + checks the combination of set options, 2654 * + initialises the TLS library (if TLS is requested), 2655 * + creates the listen socket (if not provided and if allowed), 2656 * + starts the daemon internal threads (if allowed) 2657 * 2658 * @param[in,out] daemon daemon to start; you can no longer set 2659 * options on this daemon after this call! 2660 * @return #MHD_SC_OK on success 2661 * @ingroup daemon 2662 */ 2663 MHD_EXTERN_ enum MHD_StatusCode 2664 MHD_daemon_start (struct MHD_Daemon *daemon) 2665 MHD_FN_PAR_NONNULL_ (1) MHD_FN_MUST_CHECK_RESULT_; 2666 2667 2668 /** 2669 * Stop accepting connections from the listening socket. Allows 2670 * clients to continue processing, but stops accepting new 2671 * connections. Note that the caller is responsible for closing the 2672 * returned socket; however, if MHD is run using threads (anything but 2673 * external select mode), it must not be closed until AFTER 2674 * #MHD_daemon_destroy() has been called (as it is theoretically possible 2675 * that an existing thread is still using it). 2676 * 2677 * @param[in,out] daemon the daemon to stop accepting new connections for 2678 * @return the old listen socket on success, #MHD_INVALID_SOCKET if 2679 * the daemon was already not listening anymore, or 2680 * was never started, or has no listen socket. 2681 * @ingroup daemon 2682 */ 2683 MHD_EXTERN_ MHD_Socket 2684 MHD_daemon_quiesce (struct MHD_Daemon *daemon) 2685 MHD_FN_PAR_NONNULL_ALL_ MHD_FN_PAR_INOUT_ (1); 2686 2687 2688 /** 2689 * Shutdown and destroy an HTTP daemon. 2690 * 2691 * @param[in] daemon daemon to stop 2692 * @ingroup daemon 2693 */ 2694 MHD_EXTERN_ void 2695 MHD_daemon_destroy (struct MHD_Daemon *daemon) 2696 MHD_FN_PAR_NONNULL_ALL_; 2697 2698 /* ******************* External event loop ************************ */ 2699 2700 /** 2701 * @defgroup event External network events processing 2702 */ 2703 2704 /** 2705 * The network status of the socket. 2706 * When set by MHD (by #MHD_SocketRegistrationUpdateCallback or 2707 * similar) it indicates a request to watch for specific socket state: 2708 * watch for readiness for receiving the data, watch for readiness for sending 2709 * the data and/or watch for exception state of the socket. 2710 * When set by application (and provided for #MHD_daemon_event_update() and 2711 * similar) it must indicate the actual status of the socket. 2712 * 2713 * Any actual state is a bitwise OR combination of #MHD_FD_STATE_RECV, 2714 * #MHD_FD_STATE_SEND, #MHD_FD_STATE_EXCEPT. 2715 * @ingroup event 2716 */ 2717 enum MHD_FIXED_ENUM_ MHD_FdState 2718 { 2719 /** 2720 * The socket is not ready for receiving or sending and 2721 * does not have any exceptional state. 2722 * The state never set by MHD, except de-registration of the sockets 2723 * in a #MHD_SocketRegistrationUpdateCallback. 2724 */ 2725 MHD_FD_STATE_NONE = 0 2726 , 2727 /* ** Three bit-flags ** */ 2728 2729 /** 2730 * Indicates that socket should be watched for incoming data 2731 * (when set by #MHD_SocketRegistrationUpdateCallback) 2732 * / socket has incoming data ready to read (when used for 2733 * #MHD_daemon_event_update()) 2734 */ 2735 MHD_FD_STATE_RECV = 1 << 0 2736 , 2737 /** 2738 * Indicates that socket should be watched for availability for sending 2739 * (when set by #MHD_SocketRegistrationUpdateCallback) 2740 * / socket has ability to send data (when used for 2741 * #MHD_daemon_event_update()) 2742 */ 2743 MHD_FD_STATE_SEND = 1 << 1 2744 , 2745 /** 2746 * Indicates that socket should be watched for disconnect, out-of-band 2747 * data available or high priority data available (when set by 2748 * #MHD_SocketRegistrationUpdateCallback) 2749 * / socket has been disconnected, has out-of-band data available or 2750 * has high priority data available (when used for 2751 * #MHD_daemon_event_update()). This status must not include "remote 2752 * peer shut down writing" status. 2753 * Note: #MHD_SocketRegistrationUpdateCallback() always set it as exceptions 2754 * must be always watched. 2755 */ 2756 MHD_FD_STATE_EXCEPT = 1 << 2 2757 , 2758 2759 /* The rest of the list is a bit-wise combination of three main 2760 * states. Application may use three main states directly as 2761 * a bit-mask instead of using of the following values 2762 */ 2763 2764 /** 2765 * Combination of #MHD_FD_STATE_RECV and #MHD_FD_STATE_SEND states. 2766 */ 2767 MHD_FD_STATE_RECV_SEND = MHD_FD_STATE_RECV | MHD_FD_STATE_SEND 2768 , 2769 /** 2770 * Combination of #MHD_FD_STATE_RECV and #MHD_FD_STATE_EXCEPT states. 2771 */ 2772 MHD_FD_STATE_RECV_EXCEPT = MHD_FD_STATE_RECV | MHD_FD_STATE_EXCEPT 2773 , 2774 /** 2775 * Combination of #MHD_FD_STATE_RECV and #MHD_FD_STATE_EXCEPT states. 2776 */ 2777 MHD_FD_STATE_SEND_EXCEPT = MHD_FD_STATE_RECV | MHD_FD_STATE_EXCEPT 2778 , 2779 /** 2780 * Combination of #MHD_FD_STATE_RECV, #MHD_FD_STATE_SEND and 2781 * #MHD_FD_STATE_EXCEPT states. 2782 */ 2783 MHD_FD_STATE_RECV_SEND_EXCEPT = \ 2784 MHD_FD_STATE_RECV | MHD_FD_STATE_SEND | MHD_FD_STATE_EXCEPT 2785 }; 2786 2787 /** 2788 * Checks whether specific @a state is enabled/set in the @a var 2789 */ 2790 #define MHD_FD_STATE_IS_SET(var,state) \ 2791 (MHD_FD_STATE_NONE != \ 2792 ((enum MHD_FdState) (((unsigned int) (var)) \ 2793 & ((unsigned int) (state))))) 2794 2795 /** 2796 * Checks whether RECV is enabled/set in the @a var 2797 */ 2798 #define MHD_FD_STATE_IS_SET_RECV(var) \ 2799 MHD_FD_STATE_IS_SET ((var),MHD_FD_STATE_RECV) 2800 /** 2801 * Checks whether SEND is enabled/set in the @a var 2802 */ 2803 #define MHD_FD_STATE_IS_SET_SEND(var) \ 2804 MHD_FD_STATE_IS_SET ((var),MHD_FD_STATE_SEND) 2805 /** 2806 * Checks whether EXCEPT is enabled/set in the @a var 2807 */ 2808 #define MHD_FD_STATE_IS_SET_EXCEPT(var) \ 2809 MHD_FD_STATE_IS_SET ((var),MHD_FD_STATE_EXCEPT) 2810 2811 2812 /** 2813 * Set/enable specific @a state in the @a var 2814 */ 2815 #define MHD_FD_STATE_SET(var,state) \ 2816 ((var) = \ 2817 (enum MHD_FdState) (((unsigned int) var) | ((unsigned int) state))) 2818 /** 2819 * Set/enable RECV state in the @a var 2820 */ 2821 #define MHD_FD_STATE_SET_RECV(var) MHD_FD_STATE_SET ((var),MHD_FD_STATE_RECV) 2822 /** 2823 * Set/enable SEND state in the @a var 2824 */ 2825 #define MHD_FD_STATE_SET_SEND(var) MHD_FD_STATE_SET ((var),MHD_FD_STATE_SEND) 2826 /** 2827 * Set/enable EXCEPT state in the @a var 2828 */ 2829 #define MHD_FD_STATE_SET_EXCEPT(var) \ 2830 MHD_FD_STATE_SET ((var),MHD_FD_STATE_EXCEPT) 2831 2832 /** 2833 * Clear/disable specific @a state in the @a var 2834 */ 2835 #define MHD_FD_STATE_CLEAR(var,state) \ 2836 ( (var) = \ 2837 (enum MHD_FdState) \ 2838 (((unsigned int) var) \ 2839 & ((enum MHD_FdState) (~((unsigned int) state)))) \ 2840 ) 2841 /** 2842 * Clear/disable RECV state in the @a var 2843 */ 2844 #define MHD_FD_STATE_CLEAR_RECV(var) \ 2845 MHD_FD_STATE_CLEAR ((var),MHD_FD_STATE_RECV) 2846 /** 2847 * Clear/disable SEND state in the @a var 2848 */ 2849 #define MHD_FD_STATE_CLEAR_SEND(var) \ 2850 MHD_FD_STATE_CLEAR ((var),MHD_FD_STATE_SEND) 2851 /** 2852 * Clear/disable EXCEPT state in the @a var 2853 */ 2854 #define MHD_FD_STATE_CLEAR_EXCEPT(var) \ 2855 MHD_FD_STATE_CLEAR ((var),MHD_FD_STATE_EXCEPT) 2856 2857 2858 /** 2859 * The context data to be used for updates of the socket state 2860 */ 2861 struct MHD_EventUpdateContext; 2862 2863 2864 /* Define MHD_APP_SOCKET_CNTX_TYPE to the socket context type before 2865 * including this header. 2866 * This is optional, but improves the types safety. 2867 * For example: 2868 * #define MHD_APP_SOCKET_CNTX_TYPE struct my_structure 2869 */ 2870 #ifndef MHD_APP_SOCKET_CNTX_TYPE 2871 # define MHD_APP_SOCKET_CNTX_TYPE void 2872 #endif 2873 2874 /** 2875 * The callback for registration/de-registration of the sockets to watch. 2876 * 2877 * This callback must not call #MHD_daemon_destroy(), #MHD_daemon_quiesce(), 2878 * #MHD_daemon_add_connection(). 2879 * 2880 * @param cls the closure 2881 * @param fd the socket to watch 2882 * @param watch_for the states of the @a fd to watch, if set to 2883 * #MHD_FD_STATE_NONE the socket must be de-registred 2884 * @param app_cntx_old the old application defined context for the socket, 2885 * NULL if @a fd socket was not registered before 2886 * @param ecb_cntx the context handle to be used 2887 * with #MHD_daemon_event_update() 2888 * @return must be NULL for the removed (de-registred) sockets, 2889 * for new and updated sockets: NULL in case of error (the connection 2890 * will be aborted or daemon failed to start if FD does not belong to 2891 * connection) 2892 * or the new socket context (opaque for MHD, must be non-NULL) 2893 * @sa #MHD_D_OPTION_REREGISTER_ALL 2894 * @ingroup event 2895 */ 2896 typedef MHD_APP_SOCKET_CNTX_TYPE * 2897 (MHD_FN_PAR_NONNULL_ (5) 2898 *MHD_SocketRegistrationUpdateCallback)( 2899 void *cls, 2900 MHD_Socket fd, 2901 enum MHD_FdState watch_for, 2902 MHD_APP_SOCKET_CNTX_TYPE *app_cntx_old, 2903 struct MHD_EventUpdateContext *ecb_cntx); 2904 2905 2906 /** 2907 * Update the sockets state. 2908 * Must be called for every socket that got state updated. 2909 * For #MHD_D_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL() mode 2910 * this function must be called for each socket between any two calls of 2911 * #MHD_daemon_process_reg_events() function. 2912 * Available only for daemons started in 2913 * #MHD_D_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL or 2914 * #MHD_D_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_EDGE modes. 2915 * @param daemon the daemon handle 2916 * @param ecb_cntx the context handle provided 2917 * for #MHD_SocketRegistrationUpdateCallback 2918 * @param fd_current_state the current state of the socket 2919 * @ingroup event 2920 */ 2921 MHD_EXTERN_ void 2922 MHD_daemon_event_update ( 2923 struct MHD_Daemon *MHD_RESTRICT daemon, 2924 struct MHD_EventUpdateContext *MHD_RESTRICT ecb_cntx, 2925 enum MHD_FdState fd_current_state) 2926 MHD_FN_PAR_NONNULL_ (1) MHD_FN_PAR_NONNULL_ (2); 2927 2928 2929 /** 2930 * Perform all daemon activities based on FDs events provided earlier by 2931 * application via #MHD_daemon_event_update(). 2932 * 2933 * This function accepts new connections (if any), performs HTTP communications 2934 * on all active connections, closes connections as needed and performs FDs 2935 * registration updates by calling #MHD_SocketRegistrationUpdateCallback 2936 * callback for every socket that needs to be added/updated/removed. 2937 * 2938 * Available only for daemons started in #MHD_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL or 2939 * #MHD_WM_EXTERNAL_EVENT_LOOP_CB_EDGE modes. 2940 * 2941 * When used in #MHD_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL mode, application must 2942 * provide all updates by calling #MHD_daemon_event_update() for every 2943 * registered FD between any two calls of this function. 2944 * 2945 * @param daemon the daemon handle 2946 * @param[out] next_max_wait_milsec the optional pointer to receive the 2947 next maximum wait time in milliseconds 2948 to be used for the sockets polling 2949 function, can be NULL 2950 * @return #MHD_SC_OK on success, 2951 * error code otherwise 2952 * @sa #MHD_D_OPTION_REREGISTER_ALL 2953 * @ingroup event 2954 */ 2955 MHD_EXTERN_ enum MHD_StatusCode 2956 MHD_daemon_process_reg_events ( 2957 struct MHD_Daemon *MHD_RESTRICT daemon, 2958 uint_fast64_t *MHD_RESTRICT next_max_wait_milsec) 2959 MHD_FN_PAR_NONNULL_ (1); 2960 2961 /* ********************* daemon options ************** */ 2962 2963 2964 /** 2965 * Which threading and polling mode should be used by MHD? 2966 */ 2967 enum MHD_FIXED_ENUM_APP_SET_ MHD_WorkMode 2968 { 2969 /** 2970 * Work mode with no internal threads. 2971 * The application periodically calls #MHD_daemon_process_blocking(), where 2972 * MHD internally checks all sockets automatically. 2973 * This is the default mode. 2974 * Use helper macro #MHD_D_OPTION_WM_EXTERNAL_PERIODIC() to enable 2975 * this mode. 2976 */ 2977 MHD_WM_EXTERNAL_PERIODIC = 0 2978 , 2979 /** 2980 * Work mode with an external event loop with level triggers. 2981 * MHD provides registration of all FDs to be monitored by using 2982 * #MHD_SocketRegistrationUpdateCallback, application performs level triggered 2983 * FDs polling (like select() or poll()), calls function 2984 * #MHD_daemon_event_update() for every registered FD and then calls main 2985 * function MHD_daemon_process_reg_events() to process the data. 2986 * Use helper macro #MHD_D_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL() to enable 2987 * this mode. 2988 * @sa #MHD_D_OPTION_REREGISTER_ALL 2989 */ 2990 MHD_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL = 8 2991 , 2992 /** 2993 * Work mode with an external event loop with edge triggers. 2994 * MHD provides registration of all FDs to be monitored by using 2995 * #MHD_SocketRegistrationUpdateCallback, application performs edge triggered 2996 * sockets polling (like epoll with EPOLLET), calls function 2997 * #MHD_daemon_event_update() for FDs with updated states and then calls main 2998 * function MHD_daemon_process_reg_events() to process the data. 2999 * Use helper macro #MHD_D_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_EDGE() to enable 3000 * this mode. 3001 * @sa #MHD_D_OPTION_REREGISTER_ALL 3002 */ 3003 MHD_WM_EXTERNAL_EVENT_LOOP_CB_EDGE = 9 3004 , 3005 /** 3006 * Work mode with no internal threads and aggregate watch FD. 3007 * Application uses #MHD_DAEMON_INFO_FIXED_AGGREAGATE_FD to get single FD 3008 * that gets triggered by any MHD event. 3009 * This FD can be watched as an aggregate indicator for all MHD events. 3010 * This mode is available only on selected platforms (currently 3011 * GNU/Linux and OpenIndiana only), see #MHD_LIB_INFO_FIXED_HAS_AGGREGATE_FD. 3012 * When the FD is triggered, #MHD_daemon_process_nonblocking() should 3013 * be called. 3014 * Use helper macro #MHD_D_OPTION_WM_EXTERNAL_SINGLE_FD_WATCH() to enable 3015 * this mode. 3016 */ 3017 MHD_WM_EXTERNAL_SINGLE_FD_WATCH = 16 3018 , 3019 /** 3020 * Work mode with one or more worker threads. 3021 * If specified number of threads is one, then daemon starts with single 3022 * worker thread that handles all connections. 3023 * If number of threads is larger than one, then that number of worker 3024 * threads, and handling of connection is distributed among the workers. 3025 * Use helper macro #MHD_D_OPTION_WM_WORKER_THREADS() to enable 3026 * this mode. 3027 */ 3028 MHD_WM_WORKER_THREADS = 24 3029 , 3030 /** 3031 * Work mode with one internal thread for listening and additional threads 3032 * per every connection. Use this if handling requests is CPU-intensive or 3033 * blocking, your application is thread-safe and you have plenty of 3034 * memory (per connection). 3035 * Use helper macro #MHD_D_OPTION_WM_THREAD_PER_CONNECTION() to enable 3036 * this mode. 3037 */ 3038 MHD_WM_THREAD_PER_CONNECTION = 32 3039 }; 3040 3041 /** 3042 * Work mode parameters for #MHD_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL and 3043 * #MHD_WM_EXTERNAL_EVENT_LOOP_CB_EDGE modes 3044 */ 3045 struct MHD_WorkModeExternalEventLoopCBParam 3046 { 3047 /** 3048 * Socket registration callback 3049 */ 3050 MHD_SocketRegistrationUpdateCallback reg_cb; 3051 /** 3052 * Closure for the @a reg_cb 3053 */ 3054 void *reg_cb_cls; 3055 }; 3056 3057 /** 3058 * MHD work mode parameters 3059 */ 3060 union MHD_WorkModeParam 3061 { 3062 /** 3063 * Work mode parameters for #MHD_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL and 3064 * #MHD_WM_EXTERNAL_EVENT_LOOP_CB_EDGE modes 3065 */ 3066 struct MHD_WorkModeExternalEventLoopCBParam v_external_event_loop_cb; 3067 /** 3068 * Number of worker threads for #MHD_WM_WORKER_THREADS. 3069 * If set to one, then daemon starts with single worker thread that process 3070 * all connections. 3071 * If set to value larger than one, then that number of worker threads 3072 * and distributed handling of requests among the workers. 3073 * Zero is treated as one. 3074 */ 3075 unsigned int num_worker_threads; 3076 }; 3077 3078 /** 3079 * Parameter for #MHD_D_O_WORK_MODE(). 3080 * Not recommended to be used directly, better use macro/functions to create it: 3081 * #MHD_WM_OPTION_EXTERNAL_PERIODIC(), 3082 * #MHD_WM_OPTION_EXTERNAL_EVENT_LOOP_CB_LEVEL(), 3083 * #MHD_WM_OPTION_EXTERNAL_EVENT_LOOP_CB_EDGE(), 3084 * #MHD_WM_OPTION_EXTERNAL_SINGLE_FD_WATCH(), 3085 * #MHD_WM_OPTION_WORKER_THREADS(), 3086 * #MHD_WM_OPTION_THREAD_PER_CONNECTION() 3087 */ 3088 struct MHD_WorkModeWithParam 3089 { 3090 /** 3091 * The work mode for MHD 3092 */ 3093 enum MHD_WorkMode mode; 3094 /** 3095 * The parameters used for specified work mode 3096 */ 3097 union MHD_WorkModeParam params; 3098 }; 3099 3100 3101 #if defined(MHD_USE_COMPOUND_LITERALS) && defined(MHD_USE_DESIG_NEST_INIT) 3102 /** 3103 * Create parameter for #MHD_D_O_WORK_MODE() for work mode with 3104 * no internal threads. 3105 * The application periodically calls #MHD_daemon_process_blocking(), where 3106 * MHD internally checks all sockets automatically. 3107 * This is the default mode. 3108 * @return the object of struct MHD_WorkModeWithParam with requested values 3109 */ 3110 # define MHD_WM_OPTION_EXTERNAL_PERIODIC() \ 3111 MHD_NOWARN_COMPOUND_LITERALS_ \ 3112 (const struct MHD_WorkModeWithParam) \ 3113 { \ 3114 .mode = (MHD_WM_EXTERNAL_PERIODIC) \ 3115 } \ 3116 MHD_RESTORE_WARN_COMPOUND_LITERALS_ 3117 3118 /** 3119 * Create parameter for #MHD_D_O_WORK_MODE() for work mode with 3120 * an external event loop with level triggers. 3121 * Application uses #MHD_SocketRegistrationUpdateCallback, level triggered 3122 * sockets polling (like select() or poll()) and #MHD_daemon_event_update(). 3123 * @param cb_val the callback for sockets registration 3124 * @param cb_cls_val the closure for the @a cv_val callback 3125 * @return the object of struct MHD_WorkModeWithParam with requested values 3126 */ 3127 # define MHD_WM_OPTION_EXTERNAL_EVENT_LOOP_CB_LEVEL(cb_val,cb_cls_val) \ 3128 MHD_NOWARN_COMPOUND_LITERALS_ \ 3129 (const struct MHD_WorkModeWithParam) \ 3130 { \ 3131 .mode = (MHD_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL), \ 3132 .params.v_external_event_loop_cb.reg_cb = (cb_val), \ 3133 .params.v_external_event_loop_cb.reg_cb_cls = (cb_cls_val) \ 3134 } \ 3135 MHD_RESTORE_WARN_COMPOUND_LITERALS_ 3136 3137 /** 3138 * Create parameter for #MHD_D_O_WORK_MODE() for work mode with 3139 * an external event loop with edge triggers. 3140 * Application uses #MHD_SocketRegistrationUpdateCallback, edge triggered 3141 * sockets polling (like epoll with EPOLLET) and #MHD_daemon_event_update(). 3142 * @param cb_val the callback for sockets registration 3143 * @param cb_cls_val the closure for the @a cv_val callback 3144 * @return the object of struct MHD_WorkModeWithParam with requested values 3145 */ 3146 # define MHD_WM_OPTION_EXTERNAL_EVENT_LOOP_CB_EDGE(cb_val,cb_cls_val) \ 3147 MHD_NOWARN_COMPOUND_LITERALS_ \ 3148 (const struct MHD_WorkModeWithParam) \ 3149 { \ 3150 .mode = (MHD_WM_EXTERNAL_EVENT_LOOP_CB_EDGE), \ 3151 .params.v_external_event_loop_cb.reg_cb = (cb_val), \ 3152 .params.v_external_event_loop_cb.reg_cb_cls = (cb_cls_val) \ 3153 } \ 3154 MHD_RESTORE_WARN_COMPOUND_LITERALS_ 3155 3156 /** 3157 * Create parameter for #MHD_D_O_WORK_MODE() for work mode with 3158 * no internal threads and aggregate watch FD. 3159 * Application uses #MHD_DAEMON_INFO_FIXED_AGGREAGATE_FD to get single FD 3160 * that gets triggered by any MHD event. 3161 * This FD can be watched as an aggregate indicator for all MHD events. 3162 * This mode is available only on selected platforms (currently 3163 * GNU/Linux only), see #MHD_LIB_INFO_FIXED_HAS_AGGREGATE_FD. 3164 * When the FD is triggered, #MHD_daemon_process_nonblocking() should 3165 * be called. 3166 * @return the object of struct MHD_WorkModeWithParam with requested values 3167 */ 3168 # define MHD_WM_OPTION_EXTERNAL_SINGLE_FD_WATCH() \ 3169 MHD_NOWARN_COMPOUND_LITERALS_ \ 3170 (const struct MHD_WorkModeWithParam) \ 3171 { \ 3172 .mode = (MHD_WM_EXTERNAL_SINGLE_FD_WATCH) \ 3173 } \ 3174 MHD_RESTORE_WARN_COMPOUND_LITERALS_ 3175 3176 /** 3177 * Create parameter for #MHD_D_O_WORK_MODE() for work mode with 3178 * one or more worker threads. 3179 * If number of threads is one, then daemon starts with single worker thread 3180 * that handles all connections. 3181 * If number of threads is larger than one, then that number of worker threads, 3182 * and handling of connection is distributed among the workers. 3183 * @param num_workers the number of worker threads, zero is treated as one 3184 * @return the object of struct MHD_WorkModeWithParam with requested values 3185 */ 3186 # define MHD_WM_OPTION_WORKER_THREADS(num_workers) \ 3187 MHD_NOWARN_COMPOUND_LITERALS_ \ 3188 (const struct MHD_WorkModeWithParam) \ 3189 { \ 3190 .mode = (MHD_WM_WORKER_THREADS), \ 3191 .params.num_worker_threads = (num_workers) \ 3192 } \ 3193 MHD_RESTORE_WARN_COMPOUND_LITERALS_ 3194 3195 /** 3196 * Create parameter for #MHD_D_O_WORK_MODE() for work mode with 3197 * one internal thread for listening and additional threads per every 3198 * connection. Use this if handling requests is CPU-intensive or blocking, 3199 * your application is thread-safe and you have plenty of memory (per 3200 * connection). 3201 * @return the object of struct MHD_WorkModeWithParam with requested values 3202 */ 3203 # define MHD_WM_OPTION_THREAD_PER_CONNECTION() \ 3204 MHD_NOWARN_COMPOUND_LITERALS_ \ 3205 (const struct MHD_WorkModeWithParam) \ 3206 { \ 3207 .mode = (MHD_WM_THREAD_PER_CONNECTION) \ 3208 } \ 3209 MHD_RESTORE_WARN_COMPOUND_LITERALS_ 3210 3211 #else /* !MHD_USE_COMPOUND_LITERALS || !MHD_USE_DESIG_NEST_INIT */ 3212 MHD_NOWARN_UNUSED_FUNC_ 3213 3214 /** 3215 * Create parameter for #MHD_D_O_WORK_MODE() for work mode with 3216 * no internal threads. 3217 * The application periodically calls #MHD_daemon_process_blocking(), where 3218 * MHD internally checks all sockets automatically. 3219 * This is the default mode. 3220 * @return the object of struct MHD_WorkModeWithParam with requested values 3221 */ 3222 static MHD_INLINE struct MHD_WorkModeWithParam 3223 MHD_WM_OPTION_EXTERNAL_PERIODIC (void) 3224 { 3225 struct MHD_WorkModeWithParam wm_val; 3226 3227 wm_val.mode = MHD_WM_EXTERNAL_PERIODIC; 3228 3229 return wm_val; 3230 } 3231 3232 3233 /** 3234 * Create parameter for #MHD_D_O_WORK_MODE() for work mode with 3235 * an external event loop with level triggers. 3236 * Application uses #MHD_SocketRegistrationUpdateCallback, level triggered 3237 * sockets polling (like select() or poll()) and #MHD_daemon_event_update(). 3238 * @param cb_val the callback for sockets registration 3239 * @param cb_cls_val the closure for the @a cv_val callback 3240 * @return the object of struct MHD_WorkModeWithParam with requested values 3241 */ 3242 static MHD_INLINE struct MHD_WorkModeWithParam 3243 MHD_WM_OPTION_EXTERNAL_EVENT_LOOP_CB_LEVEL ( 3244 MHD_SocketRegistrationUpdateCallback cb_val, 3245 void *cb_cls_val) 3246 { 3247 struct MHD_WorkModeWithParam wm_val; 3248 3249 wm_val.mode = MHD_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL; 3250 wm_val.params.v_external_event_loop_cb.reg_cb = cb_val; 3251 wm_val.params.v_external_event_loop_cb.reg_cb_cls = cb_cls_val; 3252 3253 return wm_val; 3254 } 3255 3256 3257 /** 3258 * Create parameter for #MHD_D_O_WORK_MODE() for work mode with 3259 * an external event loop with edge triggers. 3260 * Application uses #MHD_SocketRegistrationUpdateCallback, edge triggered 3261 * sockets polling (like epoll with EPOLLET) and #MHD_daemon_event_update(). 3262 * @param cb_val the callback for sockets registration 3263 * @param cb_cls_val the closure for the @a cv_val callback 3264 * @return the object of struct MHD_WorkModeWithParam with requested values 3265 */ 3266 static MHD_INLINE struct MHD_WorkModeWithParam 3267 MHD_WM_OPTION_EXTERNAL_EVENT_LOOP_CB_EDGE ( 3268 MHD_SocketRegistrationUpdateCallback cb_val, 3269 void *cb_cls_val) 3270 { 3271 struct MHD_WorkModeWithParam wm_val; 3272 3273 wm_val.mode = MHD_WM_EXTERNAL_EVENT_LOOP_CB_EDGE; 3274 wm_val.params.v_external_event_loop_cb.reg_cb = cb_val; 3275 wm_val.params.v_external_event_loop_cb.reg_cb_cls = cb_cls_val; 3276 3277 return wm_val; 3278 } 3279 3280 3281 /** 3282 * Create parameter for #MHD_D_O_WORK_MODE() for work mode with 3283 * no internal threads and aggregate watch FD. 3284 * Application uses #MHD_DAEMON_INFO_FIXED_AGGREAGATE_FD to get single FD 3285 * that gets triggered by any MHD event. 3286 * This FD can be watched as an aggregate indicator for all MHD events. 3287 * This mode is available only on selected platforms (currently 3288 * GNU/Linux only), see #MHD_LIB_INFO_FIXED_HAS_AGGREGATE_FD. 3289 * When the FD is triggered, #MHD_daemon_process_nonblocking() should 3290 * be called. 3291 * @return the object of struct MHD_WorkModeWithParam with requested values 3292 */ 3293 static MHD_INLINE struct MHD_WorkModeWithParam 3294 MHD_WM_OPTION_EXTERNAL_SINGLE_FD_WATCH (void) 3295 { 3296 struct MHD_WorkModeWithParam wm_val; 3297 3298 wm_val.mode = MHD_WM_EXTERNAL_SINGLE_FD_WATCH; 3299 3300 return wm_val; 3301 } 3302 3303 3304 /** 3305 * Create parameter for #MHD_D_O_WORK_MODE() for work mode with 3306 * one or more worker threads. 3307 * If number of threads is one, then daemon starts with single worker thread 3308 * that handles all connections. 3309 * If number of threads is larger than one, then that number of worker threads, 3310 * and handling of connection is distributed among the workers. 3311 * @param num_workers the number of worker threads, zero is treated as one 3312 * @return the object of struct MHD_WorkModeWithParam with requested values 3313 */ 3314 static MHD_INLINE struct MHD_WorkModeWithParam 3315 MHD_WM_OPTION_WORKER_THREADS (unsigned int num_workers) 3316 { 3317 struct MHD_WorkModeWithParam wm_val; 3318 3319 wm_val.mode = MHD_WM_EXTERNAL_EVENT_LOOP_CB_EDGE; 3320 wm_val.params.num_worker_threads = num_workers; 3321 3322 return wm_val; 3323 } 3324 3325 3326 /** 3327 * Create parameter for #MHD_D_O_WORK_MODE() for work mode with 3328 * one internal thread for listening and additional threads per every 3329 * connection. Use this if handling requests is CPU-intensive or blocking, 3330 * your application is thread-safe and you have plenty of memory (per 3331 * connection). 3332 * @return the object of struct MHD_WorkModeWithParam with requested values 3333 */ 3334 static MHD_INLINE struct MHD_WorkModeWithParam 3335 MHD_WM_OPTION_THREAD_PER_CONNECTION (void) 3336 { 3337 struct MHD_WorkModeWithParam wm_val; 3338 3339 wm_val.mode = MHD_WM_THREAD_PER_CONNECTION; 3340 3341 return wm_val; 3342 } 3343 3344 3345 MHD_RESTORE_WARN_UNUSED_FUNC_ 3346 #endif /* !MHD_USE_COMPOUND_LITERALS || !MHD_USE_DESIG_NEST_INIT */ 3347 3348 /** 3349 * @defgroup logging Log events and control 3350 */ 3351 3352 3353 /** 3354 * Type of a callback function used for logging by MHD. 3355 * 3356 * @param cls closure 3357 * @param sc status code of the event 3358 * @param fm format string (`printf()`-style) 3359 * @param ap arguments to @a fm 3360 * @ingroup logging 3361 */ 3362 typedef void 3363 (MHD_FN_PAR_NONNULL_ (3) 3364 MHD_FN_PAR_CSTR_ (3) 3365 *MHD_LoggingCallback)(void *cls, 3366 enum MHD_StatusCode sc, 3367 const char *fm, 3368 va_list ap); 3369 3370 /** 3371 * Parameter for listen socket binding type 3372 */ 3373 enum MHD_FIXED_ENUM_APP_SET_ MHD_DaemonOptionBindType 3374 { 3375 /** 3376 * The listen socket bind to the networks address with sharing the address. 3377 * Several sockets can bind to the same address. 3378 */ 3379 MHD_D_OPTION_BIND_TYPE_SHARED = -1 3380 , 3381 /** 3382 * The listen socket bind to the networks address without sharing the address, 3383 * except allowing binding to port/address which has TIME_WAIT state (the 3384 * state after closing connection). 3385 * On some platforms it may also allow to bind to specific address if other 3386 * socket already bond to the same port of wildcard address (or bind to 3387 * wildcard address when other socket already bond to specific address 3388 * with the same port). 3389 * Typically achieved by enabling 'SO_REUSEADDR' socket option. 3390 * Default. 3391 */ 3392 MHD_D_OPTION_BIND_TYPE_NOT_SHARED = 0 3393 , 3394 /** 3395 * The listen socket bind to the networks address without sharing the address. 3396 * The daemon way fail to start when any sockets still in "TIME_WAIT" state 3397 * on the same port, which effectively prevents quick restart of the daemon 3398 * on the same port. 3399 * On W32 systems it works like #MHD_D_OPTION_BIND_TYPE_NOT_SHARED due to 3400 * the OS limitations. 3401 */ 3402 MHD_D_OPTION_BIND_TYPE_NOT_SHARED_STRICTER = 1 3403 , 3404 /** 3405 * The list socket bind to the networks address in explicit exclusive mode. 3406 * Works as #MHD_D_OPTION_BIND_TYPE_NOT_SHARED_STRICTER on platforms without 3407 * support for the explicit exclusive socket use. 3408 */ 3409 MHD_D_OPTION_BIND_TYPE_EXCLUSIVE = 2 3410 }; 3411 3412 3413 /** 3414 * Possible levels of enforcement for TCP_FASTOPEN. 3415 */ 3416 enum MHD_FIXED_ENUM_APP_SET_ MHD_TCPFastOpenType 3417 { 3418 /** 3419 * Disable use of TCP_FASTOPEN. 3420 */ 3421 MHD_FOM_DISABLE = -1 3422 , 3423 /** 3424 * Enable TCP_FASTOPEN where supported. 3425 * On GNU/Linux it works with a kernel >= 3.6. 3426 * This is the default. 3427 */ 3428 MHD_FOM_AUTO = 0 3429 , 3430 /** 3431 * Require TCP_FASTOPEN. 3432 * Also causes #MHD_daemon_start() to fail if TCP_FASTOPEN cannot be enabled. 3433 */ 3434 MHD_FOM_REQUIRE = 1 3435 }; 3436 3437 3438 /** 3439 * Address family to be used by MHD. 3440 */ 3441 enum MHD_FIXED_ENUM_APP_SET_ MHD_AddressFamily 3442 { 3443 /** 3444 * Option not given, do not listen at all 3445 * (unless listen socket or address specified by 3446 * other means). 3447 */ 3448 MHD_AF_NONE = 0 3449 , 3450 /** 3451 * Pick "best" available method automatically. 3452 */ 3453 MHD_AF_AUTO = 1 3454 , 3455 /** 3456 * Use IPv4 only. 3457 */ 3458 MHD_AF_INET4 = 2 3459 , 3460 /** 3461 * Use IPv6 only. 3462 */ 3463 MHD_AF_INET6 = 3 3464 , 3465 /** 3466 * Use dual stack (IPv4 and IPv6 on the same socket). 3467 */ 3468 MHD_AF_DUAL = 4 3469 , 3470 /** 3471 * Use dual stack (IPv4 and IPv6 on the same socket), 3472 * fallback to pure IPv6 if dual stack is not possible. 3473 */ 3474 MHD_AF_DUAL_v4_OPTIONAL = 5 3475 , 3476 /** 3477 * Use dual stack (IPv4 and IPv6 on the same socket), 3478 * fallback to pure IPv4 if dual stack is not possible. 3479 */ 3480 MHD_AF_DUAL_v6_OPTIONAL = 6 3481 3482 }; 3483 3484 3485 /** 3486 * Sockets polling internal syscalls used by MHD. 3487 */ 3488 enum MHD_FIXED_ENUM_APP_SET_ MHD_SockPollSyscall 3489 { 3490 /** 3491 * Automatic selection of best-available method. This is also the 3492 * default. 3493 */ 3494 MHD_SPS_AUTO = 0 3495 , 3496 /** 3497 * Use select(). 3498 */ 3499 MHD_SPS_SELECT = 1 3500 , 3501 /** 3502 * Use poll(). 3503 */ 3504 MHD_SPS_POLL = 2 3505 , 3506 /** 3507 * Use epoll. 3508 */ 3509 MHD_SPS_EPOLL = 3 3510 , 3511 /** 3512 * Use kqueue. 3513 */ 3514 MHD_SPS_KQUEUE = 4 3515 }; 3516 3517 3518 /** 3519 * Protocol strictness levels enforced by MHD on clients. 3520 * Each level applies different parsing settings for HTTP headers and other 3521 * protocol elements. 3522 */ 3523 enum MHD_FIXED_ENUM_APP_SET_ MHD_ProtocolStrictLevel 3524 { 3525 3526 /* * Basic levels * */ 3527 /** 3528 * A sane default level of protocol enforcement for production use. 3529 * Provides a balance between enhanced security and broader compatibility, 3530 * as permitted by RFCs for HTTP servers. 3531 */ 3532 MHD_PSL_DEFAULT = 0 3533 , 3534 /** 3535 * Apply stricter protocol interpretation while remaining within 3536 * RFC-defined limits for HTTP servers. 3537 * 3538 * At this level (and stricter), using a bare LF instead of CRLF is forbidden, 3539 * and requests that include both a "Transfer-Encoding:" and 3540 * a "Content-Length:" headers are rejected. 3541 * 3542 * Suitable for public servers. 3543 */ 3544 MHD_PSL_STRICT = 1 3545 , 3546 /** 3547 * Be more permissive in interpreting the protocol, while still 3548 * operating within the RFC-defined limits for HTTP servers. 3549 */ 3550 MHD_PSL_PERMISSIVE = -1 3551 , 3552 /* * Special levels * */ 3553 /** 3554 * A stricter protocol interpretation than what is allowed by RFCs for HTTP 3555 * servers. However, it should remain fully compatible with clients correctly 3556 * following all RFC "MUST" requirements for HTTP clients. 3557 * 3558 * For chunked encoding, this level (and more restrictive ones) forbids 3559 * whitespace in chunk extensions. 3560 * For cookie parsing, this level (and more restrictive ones) rejects 3561 * the entire cookie if even a single value within it is incorrectly encoded. 3562 * 3563 * Recommended for testing clients against MHD. Can also be used for 3564 * security-centric applications, though doing so slightly violates 3565 * relevant RFC requirements for HTTP servers. 3566 */ 3567 MHD_PSL_VERY_STRICT = 2 3568 , 3569 /** 3570 * The strictest interpretation of the HTTP protocol, even stricter than 3571 * allowed by RFCs for HTTP servers. 3572 * However, it should remain fully compatible with clients complying with both 3573 * RFC "SHOULD" and "MUST" requirements for HTTP clients. 3574 * 3575 * This level can be used for testing clients against MHD. 3576 * It is not recommended for public services, as it may reject legitimate 3577 * clients that do not follow RFC "SHOULD" requirements. 3578 */ 3579 MHD_PSL_EXTRA_STRICT = 3 3580 , 3581 /** 3582 * A more relaxed protocol interpretation that violates some RFC "SHOULD" 3583 * restrictions for HTTP servers. 3584 * For cookie parsing, this level (and more permissive levels) allows 3585 * whitespace in cookie values. 3586 * 3587 * This level may be used in isolated environments. 3588 */ 3589 MHD_PSL_VERY_PERMISSIVE = -2 3590 , 3591 /** 3592 * The most flexible protocol interpretation, going beyond RFC "MUST" 3593 * requirements for HTTP servers. 3594 * 3595 * This level allows HTTP/1.1 requests without a "Host:" header. 3596 * For cookie parsing, whitespace is allowed before and after 3597 * the '=' character. 3598 * 3599 * Not recommended unless absolutely necessary to communicate with clients 3600 * that have severely broken HTTP implementations. 3601 */ 3602 MHD_PSL_EXTRA_PERMISSIVE = -3, 3603 }; 3604 3605 /** 3606 * The way Strict Level is enforced. 3607 * MHD can be compiled with limited set of strictness levels. 3608 * These values instructs MHD how to apply the request level. 3609 */ 3610 enum MHD_FIXED_ENUM_APP_SET_ MHD_UseStictLevel 3611 { 3612 /** 3613 * Use requested level if available or the nearest stricter 3614 * level. 3615 * Fail if only more permissive levels available. 3616 * Recommended value. 3617 */ 3618 MHD_USL_THIS_OR_STRICTER = 0 3619 , 3620 /** 3621 * Use requested level only. 3622 * Fail if this level is not available. 3623 */ 3624 MHD_USL_PRECISE = 1 3625 , 3626 /** 3627 * Use requested level if available or the nearest level (stricter 3628 * or more permissive). 3629 */ 3630 MHD_USL_NEAREST = 2 3631 }; 3632 3633 3634 /** 3635 * Connection memory buffer zeroing mode. 3636 * Works as a hardening measure. 3637 */ 3638 enum MHD_FIXED_ENUM_APP_SET_ MHD_ConnBufferZeroingMode 3639 { 3640 /** 3641 * Do not perform zeroing of connection memory buffer. 3642 * Default mode. 3643 */ 3644 MHD_CONN_BUFFER_ZEROING_DISABLED = 0 3645 , 3646 /** 3647 * Perform connection memory buffer zeroing before processing request. 3648 */ 3649 MHD_CONN_BUFFER_ZEROING_BASIC = 1 3650 , 3651 /** 3652 * Perform connection memory buffer zeroing before processing request and 3653 * when reusing buffer memory areas during processing request. 3654 */ 3655 MHD_CONN_BUFFER_ZEROING_HEAVY = 2 3656 }; 3657 3658 3659 /* ********************** (d) TLS support ********************** */ 3660 3661 /** 3662 * The TLS backend choice 3663 */ 3664 enum MHD_FIXED_ENUM_APP_SET_ MHD_TlsBackend 3665 { 3666 /** 3667 * Disable TLS, use plain TCP connections (default) 3668 */ 3669 MHD_TLS_BACKEND_NONE = 0 3670 , 3671 /** 3672 * Use best available TLS backend. 3673 */ 3674 MHD_TLS_BACKEND_ANY = 1 3675 , 3676 /** 3677 * Use GnuTLS as TLS backend. 3678 */ 3679 MHD_TLS_BACKEND_GNUTLS = 2 3680 , 3681 /** 3682 * Use OpenSSL as TLS backend. 3683 */ 3684 MHD_TLS_BACKEND_OPENSSL = 3 3685 , 3686 /** 3687 * Use MbedTLS as TLS backend. 3688 */ 3689 MHD_TLS_BACKEND_MBEDTLS = 4 3690 }; 3691 3692 /** 3693 * Values for #MHD_D_O_DAUTH_NONCE_BIND_TYPE. 3694 * 3695 * These values can limit the scope of validity of MHD-generated nonces. 3696 * Values can be combined with bitwise OR. 3697 * Any value, except #MHD_D_OPTION_VALUE_DAUTH_BIND_NONCE_NONE, enforce function 3698 * #MHD_digest_auth_check() (and similar functions) to check nonce by 3699 * re-generating it again with the same parameters, which is CPU-intensive 3700 * operation. 3701 */ 3702 enum MHD_FIXED_FLAGS_ENUM_APP_SET_ MHD_DaemonOptionValueDAuthBindNonce 3703 { 3704 /** 3705 * Generated nonces are valid for any request from any client until expired. 3706 * This is default and recommended value. 3707 * #MHD_digest_auth_check() (and similar functions) would check only whether 3708 * the nonce value that is used by client has been generated by MHD and not 3709 * expired yet. 3710 * It is recommended because RFC 7616 allows clients to use the same nonce 3711 * for any request in the same "protection space". 3712 * When checking client's authorisation requests CPU is loaded less if this 3713 * value is used. 3714 * This mode gives MHD maximum flexibility for nonces generation and can 3715 * prevent possible nonce collisions (and corresponding log warning messages) 3716 * when clients' requests are intensive. 3717 * This value cannot be biwise-OR combined with other values. 3718 */ 3719 MHD_D_OPTION_VALUE_DAUTH_BIND_NONCE_NONE = 0 3720 , 3721 /** 3722 * Generated nonces are valid only for the same realm. 3723 */ 3724 MHD_D_OPTION_VALUE_DAUTH_BIND_NONCE_REALM = (1 << 0) 3725 , 3726 /** 3727 * Generated nonces are valid only for the same URI (excluding parameters 3728 * after '?' in URI) and request method (GET, POST etc). 3729 * Not recommended unless "protection space" is limited to a single URI as 3730 * RFC 7616 allows clients to reuse server-generated nonces for any URI 3731 * in the same "protection space" which by default consists of all server 3732 * URIs. 3733 */ 3734 MHD_D_OPTION_VALUE_DAUTH_BIND_NONCE_URI = (1 << 1) 3735 , 3736 3737 /** 3738 * Generated nonces are valid only for the same URI including URI parameters 3739 * and request method (GET, POST etc). 3740 * This value implies #MHD_D_OPTION_VALUE_DAUTH_BIND_NONCE_URI. 3741 * Not recommended for that same reasons as 3742 * #MHD_D_OPTION_VALUE_DAUTH_BIND_NONCE_URI. 3743 */ 3744 MHD_D_OPTION_VALUE_DAUTH_BIND_NONCE_URI_PARAMS = (1 << 2) 3745 , 3746 3747 /** 3748 * Generated nonces are valid only for the single client's IP. 3749 * While it looks like security improvement, in practice the same client may 3750 * jump from one IP to another (mobile or Wi-Fi handover, DHCP re-assignment, 3751 * Multi-NAT, different proxy chain and other reasons), while IP address 3752 * spoofing could be used relatively easily. 3753 */ 3754 MHD_D_OPTION_VALUE_DAUTH_BIND_NONCE_CLIENT_IP = (1 << 3) 3755 }; 3756 3757 3758 struct MHD_ServerCredentialsContext; 3759 3760 3761 /** 3762 * Context required to provide a pre-shared key to the 3763 * server. 3764 * 3765 * @param mscc the context 3766 * @param psk_size the number of bytes in @a psk 3767 * @param psk the pre-shared-key; should be allocated with malloc(), 3768 * will be freed by MHD 3769 */ 3770 MHD_EXTERN_ enum MHD_StatusCode 3771 MHD_connection_set_psk ( 3772 struct MHD_ServerCredentialsContext *mscc, 3773 size_t psk_size, 3774 const /*void? */ char psk[MHD_FN_PAR_DYN_ARR_SIZE_ (psk_size)]); 3775 3776 #define MHD_connection_set_psk_unavailable(mscc) \ 3777 MHD_connection_set_psk (mscc, 0, NULL) 3778 3779 3780 /** 3781 * Function called to lookup the pre-shared key (PSK) for a given 3782 * HTTP connection based on the @a username. MHD will suspend handling of 3783 * the @a connection until the application calls #MHD_connection_set_psk(). 3784 * If looking up the PSK fails, the application must still call 3785 * #MHD_connection_set_psk_unavailable(). 3786 * 3787 * @param cls closure 3788 * @param connection the HTTPS connection 3789 * @param username the user name claimed by the other side 3790 * @param mscc context to pass to #MHD_connection_set_psk(). 3791 */ 3792 typedef void 3793 (*MHD_PskServerCredentialsCallback)( 3794 void *cls, 3795 const struct MHD_Connection *MHD_RESTRICT connection, 3796 const struct MHD_String *MHD_RESTRICT username, 3797 struct MHD_ServerCredentialsContext *mscc); 3798 3799 3800 /** 3801 * The specified callback will be called one time, 3802 * after network initialisation, TLS pre-initialisation, but before 3803 * the start of the internal threads (if allowed). 3804 * 3805 * This callback may use introspection call to retrieve and adjust 3806 * some of the daemon aspects. For example, TLS backend handler can be used 3807 * to configure some TLS aspects. 3808 * @param cls the callback closure 3809 */ 3810 typedef void 3811 (*MHD_DaemonReadyCallback)(void *cls); 3812 3813 3814 /** 3815 * Allow or deny a client to connect. 3816 * 3817 * @param cls closure 3818 * @param addr_len length of @a addr 3819 * @param addr address information from the client 3820 * @see #MHD_D_OPTION_ACCEPT_POLICY() 3821 * @return #MHD_YES if connection is allowed, #MHD_NO if not 3822 */ 3823 typedef enum MHD_Bool 3824 (*MHD_AcceptPolicyCallback)(void *cls, 3825 size_t addr_len, 3826 const struct sockaddr *addr); 3827 3828 3829 /** 3830 * The data for the #MHD_EarlyUriLogCallback 3831 */ 3832 struct MHD_EarlyUriCbData 3833 { 3834 /** 3835 * The request handle. 3836 * Headers are not yet available. 3837 */ 3838 struct MHD_Request *request; 3839 3840 /** 3841 * The full URI ("request target") from the HTTP request, including URI 3842 * parameters (the part after '?') 3843 */ 3844 struct MHD_String full_uri; 3845 3846 /** 3847 * The request HTTP method 3848 */ 3849 enum MHD_HTTP_Method method; 3850 }; 3851 3852 /** 3853 * Function called by MHD to allow the application to log the @a full_uri 3854 * of the new request. 3855 * This is the only moment when unmodified URI is provided. 3856 * After this callback MHD parses the URI and modifies it by extracting 3857 * GET parameters in-place. 3858 * 3859 * If this callback is set then it is the first application function called 3860 * for the new request. 3861 * 3862 * If #MHD_RequestEndedCallback is also set then it is guaranteed that 3863 * #MHD_RequestEndedCallback is called for the same request. Application 3864 * may allocate request specific data in this callback and de-allocate 3865 * the data in #MHD_RequestEndedCallback. 3866 * 3867 * @param cls client-defined closure 3868 * @param req_data the request data 3869 * @param request_app_context_ptr the pointer to variable that can be set to 3870 * the application context for the request; 3871 * initially the variable set to NULL 3872 */ 3873 typedef void 3874 (MHD_FN_PAR_NONNULL_ALL_ MHD_FN_PAR_INOUT_ (3) 3875 *MHD_EarlyUriLogCallback)(void *cls, 3876 const struct MHD_EarlyUriCbData *req_data, 3877 void **request_app_context_ptr); 3878 3879 3880 /** 3881 * The `enum MHD_ConnectionNotificationCode` specifies types 3882 * of connection notifications. 3883 * @ingroup request 3884 */ 3885 enum MHD_FIXED_ENUM_MHD_SET_ MHD_ConnectionNotificationCode 3886 { 3887 3888 /** 3889 * A new connection has been started. 3890 * @ingroup request 3891 */ 3892 MHD_CONNECTION_NOTIFY_STARTED = 0 3893 , 3894 /** 3895 * A connection is closed. 3896 * @ingroup request 3897 */ 3898 MHD_CONNECTION_NOTIFY_CLOSED = 1 3899 3900 }; 3901 3902 /** 3903 * Extra details for connection notifications. 3904 * Currently not used 3905 */ 3906 union MHD_ConnectionNotificationDetails 3907 { 3908 /** 3909 * Unused 3910 */ 3911 int reserved1; 3912 }; 3913 3914 3915 /** 3916 * The connection notification data structure 3917 */ 3918 struct MHD_ConnectionNotificationData 3919 { 3920 /** 3921 * The connection handle 3922 */ 3923 struct MHD_Connection *connection; 3924 /** 3925 * The connection-specific application context data (opaque for MHD). 3926 * Initially set to NULL (for connections added by MHD) or set by 3927 * @a connection_cntx parameter for connections added by 3928 * #MHD_daemon_add_connection(). 3929 */ 3930 void *application_context; 3931 /** 3932 * The code of the event 3933 */ 3934 enum MHD_ConnectionNotificationCode code; 3935 /** 3936 * Event details 3937 */ 3938 union MHD_ConnectionNotificationDetails details; 3939 }; 3940 3941 3942 /** 3943 * Signature of the callback used by MHD to notify the 3944 * application about started/stopped network connections 3945 * 3946 * @param cls client-defined closure 3947 * @param[in,out] data the details about the event 3948 * @see #MHD_D_OPTION_NOTIFY_CONNECTION() 3949 * @ingroup request 3950 */ 3951 typedef void 3952 (MHD_FN_PAR_NONNULL_ (2) 3953 *MHD_NotifyConnectionCallback)(void *cls, 3954 struct MHD_ConnectionNotificationData *data); 3955 3956 3957 /** 3958 * The type of stream notifications. 3959 * @ingroup request 3960 */ 3961 enum MHD_FIXED_ENUM_MHD_SET_ MHD_StreamNotificationCode 3962 { 3963 /** 3964 * A new stream has been started. 3965 * @ingroup request 3966 */ 3967 MHD_STREAM_NOTIFY_STARTED = 0 3968 , 3969 /** 3970 * A stream is closed. 3971 * @ingroup request 3972 */ 3973 MHD_STREAM_NOTIFY_CLOSED = 1 3974 }; 3975 3976 /** 3977 * Additional information about stream started event 3978 */ 3979 struct MHD_StreamNotificationDetailStarted 3980 { 3981 /** 3982 * Set to #MHD_YES of the stream was started by client 3983 */ 3984 enum MHD_Bool by_client; 3985 }; 3986 3987 /** 3988 * Additional information about stream events 3989 */ 3990 union MHD_StreamNotificationDetail 3991 { 3992 /** 3993 * Information for event #MHD_STREAM_NOTIFY_STARTED 3994 */ 3995 struct MHD_StreamNotificationDetailStarted started; 3996 }; 3997 3998 /** 3999 * Stream notification data structure 4000 */ 4001 struct MHD_StreamNotificationData 4002 { 4003 /** 4004 * The handle of the stream 4005 */ 4006 struct MHD_Stream *stream; 4007 /** 4008 * The code of the event 4009 */ 4010 enum MHD_StreamNotificationCode code; 4011 /** 4012 * Detailed information about notification event 4013 */ 4014 union MHD_StreamNotificationDetail details; 4015 }; 4016 4017 4018 /** 4019 * Signature of the callback used by MHD to notify the 4020 * application about started/stopped data stream 4021 * For HTTP/1.1 it is the same like network connection 4022 * with 1:1 match. 4023 * 4024 * @param cls client-defined closure 4025 * @param data the details about the event 4026 * @see #MHD_D_OPTION_NOTIFY_STREAM() 4027 * @ingroup request 4028 */ 4029 typedef void 4030 (MHD_FN_PAR_NONNULL_ (2) 4031 *MHD_NotifyStreamCallback)( 4032 void *cls, 4033 const struct MHD_StreamNotificationData *data); 4034 4035 #include "microhttpd2_generated_daemon_options.h" 4036 4037 4038 /** 4039 * The `enum MHD_RequestEndedCode` specifies reasons 4040 * why a request has been ended. 4041 * @ingroup request 4042 */ 4043 enum MHD_FIXED_ENUM_MHD_SET_ MHD_RequestEndedCode 4044 { 4045 4046 /** 4047 * The response was successfully sent. 4048 * @ingroup request 4049 */ 4050 MHD_REQUEST_ENDED_COMPLETED_OK = 0 4051 , 4052 /** 4053 * The response was successfully sent and connection is being switched 4054 * to another protocol. 4055 * @ingroup request 4056 */ 4057 MHD_REQUEST_ENDED_COMPLETED_OK_UPGRADE = 1 4058 , 4059 /** 4060 * No activity on the connection for the number of seconds specified using 4061 * #MHD_C_OPTION_TIMEOUT(). 4062 * @ingroup request 4063 */ 4064 MHD_REQUEST_ENDED_TIMEOUT_REACHED = 10 4065 , 4066 /** 4067 * The connection was broken or TLS protocol error. 4068 * @ingroup request 4069 */ 4070 MHD_REQUEST_ENDED_CONNECTION_ERROR = 20 4071 , 4072 /** 4073 * The client terminated the connection by closing the socket either 4074 * completely or for writing (TCP half-closed) before sending complete 4075 * request. 4076 * @ingroup request 4077 */ 4078 MHD_REQUEST_ENDED_CLIENT_ABORT = 30 4079 , 4080 /** 4081 * The request is not valid according to HTTP specifications. 4082 * @ingroup request 4083 */ 4084 MHD_REQUEST_ENDED_HTTP_PROTOCOL_ERROR = 31 4085 , 4086 /** 4087 * The application aborted request without response. 4088 * @ingroup request 4089 */ 4090 MHD_REQUEST_ENDED_BY_APP_ABORT = 40 4091 , 4092 /** 4093 * The request was aborted due to the application failed to provide a valid 4094 * response. 4095 * @ingroup request 4096 */ 4097 MHD_REQUEST_ENDED_BY_APP_ERROR = 41 4098 , 4099 /** 4100 * The request was aborted due to the application failed to register external 4101 * event monitoring for the connection. 4102 * @ingroup request 4103 */ 4104 MHD_REQUEST_ENDED_BY_EXT_EVENT_ERROR = 42 4105 , 4106 /** 4107 * Error handling the connection due to resources exhausted. 4108 * @ingroup request 4109 */ 4110 MHD_REQUEST_ENDED_NO_RESOURCES = 50 4111 , 4112 /** 4113 * The request was aborted due to error reading file for file-backed response 4114 * @ingroup request 4115 */ 4116 MHD_REQUEST_ENDED_FILE_ERROR = 51 4117 , 4118 /** 4119 * The request was aborted due to error generating valid nonce for Digest Auth 4120 * @ingroup request 4121 */ 4122 MHD_REQUEST_ENDED_NONCE_ERROR = 52 4123 , 4124 /** 4125 * Closing the session since MHD is being shut down. 4126 * @ingroup request 4127 */ 4128 MHD_REQUEST_ENDED_DAEMON_SHUTDOWN = 60 4129 }; 4130 4131 /** 4132 * Additional information about request ending 4133 */ 4134 union MHD_RequestEndedDetail 4135 { 4136 /** 4137 * Reserved member. 4138 * Do not use. 4139 */ 4140 void *reserved; 4141 }; 4142 4143 /** 4144 * Request termination data structure 4145 */ 4146 struct MHD_RequestEndedData 4147 { 4148 /** 4149 * The request handle. 4150 * Note that most of the request data may be already unvailable. 4151 */ 4152 struct MHD_Request *req; 4153 /** 4154 * The code of the event 4155 */ 4156 enum MHD_RequestEndedCode code; 4157 /** 4158 * Detailed information about the event 4159 */ 4160 union MHD_RequestEndedDetail details; 4161 }; 4162 4163 4164 /** 4165 * Signature of the callback used by MHD to notify the application 4166 * about completed requests. 4167 * 4168 * This is the last callback called for any request (if provided by 4169 * the application). 4170 * 4171 * @param cls client-defined closure 4172 * @param data the details about the event 4173 * @param request_app_context the application request context, as possibly set 4174 by the #MHD_EarlyUriLogCallback 4175 * @see #MHD_R_OPTION_TERMINATION_CALLBACK() 4176 * @ingroup request 4177 */ 4178 typedef void 4179 (*MHD_RequestEndedCallback) (void *cls, 4180 const struct MHD_RequestEndedData *data, 4181 void *request_app_context); 4182 4183 4184 #include "microhttpd2_generated_response_options.h"