responses.inc (43822B)
1 @cindex response 2 3 @noindent 4 Response handling by MHD is asynchronous with respect to the 5 application execution flow. Instances of type @code{struct MHD_Response} 6 are not tightly associated with a request or a daemon; 7 they are managed with reference counting. 8 9 @deftp {C Struct} MHD_Response 10 Handle for a response to be returned to an HTTP client. 11 A response includes the HTTP status code, HTTP headers, 12 a body and possibly HTTP footers. 13 @end deftp 14 15 @cindex action 16 17 In the simplest case we allocate a new @code{struct MHD_Response} 18 for each request, use it to create an action and it is (automatically) 19 destroyed: 20 21 @example 22 @verbatiminclude examples/simple_reply_fragment.c 23 @end example 24 25 The above code will cause MHD to @code{close()} a connection in 26 case the memory allocation failed (and log nothing), but unless 27 an application really needs to handle even such an error more 28 gracefully, the above code is already fine even in terms of 29 error handling and leaks no memory (assuming the action is 30 returned to MHD). 31 32 However, MHD also allows responses to be reused and the same response 33 structure to be used multiple times. This is explained in more detail 34 under @ref{MHD_R_OPTION_REUSABLE} in the section on 35 @ref{libmicrohttpd-response-performance,,Response options for 36 performance optimization}. 37 38 @menu 39 * libmicrohttpd-response enqueue:: Returning a response. 40 * libmicrohttpd-response create:: Creating responses. 41 * libmicrohttpd-response headers:: Adding headers to a response. 42 * libmicrohttpd2-response options:: Setting response options. 43 * libmicrohttpd-upgrade:: Creating a response for protocol upgrades. 44 @end menu 45 46 @c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 47 48 @c ------------------------------------------------------------ 49 @node libmicrohttpd-response enqueue 50 @section Enqueuing a response 51 52 As we have discussed in the previous chapters and shown in the example 53 above, handling a request requires applications to return a 54 @code{struct MHD_Action} that tells MHD how to continue. The most 55 common way to create an action is from a @code{struct MHD_Response} 56 via @code{MHD_action_from_response}. 57 58 @anchor{MHD_action_from_response} 59 @deftypefun {struct MHD_Action *} MHD_action_from_response (struct MHD_Request *request, struct MHD_Response *response) 60 61 This instructs MHD to transmit the given @var{response} to 62 the client. The @var{request} must match the request handle 63 given to the call that is returning the action. 64 65 @table @var 66 @item request 67 the request to create an action for; 68 69 @item response 70 the response to convert. If this argument is NULL then this 71 function will behave equivalent to @code{MHD_action_abort_connection()}. 72 @end table 73 74 Returns an action on success. The action returned must be returned to 75 MHD, otherwise there @emph{may} be a memory leak. This function 76 checks that no other action was already created for the given 77 @var{request} and returns @code{NULL} on API usage errors or possibly 78 in out-of-memory situations. The application @emph{may} try to create 79 a different action in this case, but most likely should just give MHD 80 the @code{NULL} value for the action to close the connection. 81 82 @end deftypefun 83 84 Note that calling @code{MHD_action_from_response()} will typically 85 consume a response and cause its resources to be released 86 by MHD once the response has been sent. Thus, after converting 87 a response to an action applications do not have to call 88 @code{MHD_response_destroy()} @emph{unless} they used 89 @ref{MHD_R_OPTION_REUSABLE} as explained below. 90 91 92 @node libmicrohttpd-response create 93 @section Creating responses 94 95 @cindex lifetime 96 @subsection Destroying responses 97 98 There are various ways for applications to create a @code{struct 99 MHD_Response}. Almost all of these functions will have to allocate 100 memory and may fail, returning @code{NULL} to indicate that the 101 response generation failed. To avoid leaking memory, any response that 102 was successfull created must @emph{either} be converted into an action 103 via @code{MHD_action_from_response()} or explicitly destroyed via 104 @code{MHD_response_destroy()}. 105 106 @anchor{MHD_response_destroy} 107 @deftypefun void MHD_response_destroy (struct MHD_Response *response) 108 Destroys a response and associated resources (decrement the 109 reference counter). Note that MHD may keep some of the resources 110 around if the response is still in the queue for some clients, so the 111 memory may not necessarily be freed immediately. 112 113 @table @var 114 @item response 115 the response to destroy. 116 @end table 117 @end deftypefun 118 119 @subsection HTTP status codes 120 @cindex status code 121 122 When creating a response, applications must always specify the HTTP 123 status code that should be returned with the response. MHD provides 124 @code{enum MHD_HTTP_StatusCode} with all supported HTTP status 125 codes. Using other numeric values is possible but not advised: in such 126 cases MHD will be unable to provide the human-readable status code 127 description and clients are likely to be unhappy about the use of 128 non-standard codes. 129 130 @anchor{MHD_HTTP_StatusCode} 131 @deftp {Enumeration} MHD_HTTP_StatusCode 132 133 Represents canonical HTTP status codes. 134 135 @table @code 136 @include manual/http-status-texi.gen 137 @end table 138 @end deftp 139 140 141 @subsection Responses from memory buffers 142 143 You can use any of the following functions (or convenience macros) 144 to create responses from static data in memory: 145 146 @anchor{MHD_response_from_buffer} 147 @deftypefun {struct MHD_Response *} MHD_response_from_buffer (enum MHD_HTTP_StatusCode sc, size_t buffer_size, const char *buffer, MHD_FreeCallback free_cb, void *free_cb_cls) 148 149 Create a response object with a callback that can be used to free resources after the response has been sent to the client. 150 151 @table @var 152 @item sc 153 HTTP status code for the response; 154 155 @item size 156 size of the data portion of the response; 157 158 @item buffer 159 the body to return, must contain at least @var{size} bytes of data; 160 the application must ensure that data in @var{buffer} remains valid 161 at least until the response was sent; 162 163 @item free_cb 164 function to call to release application data associated with 165 the response (usually @var{buffer}) after transmitting the 166 response is complete. For example, if @var{buffer} is the 167 result of @code{mmap()} the callback may invoke 168 @code{munmap()}. Similarly, if @var{buffer} was part of an 169 allocation on the heap, the callback may simply call 170 @code{free()}. You may pass @code{NULL} to indicate that 171 no cleanup function is needed; however, in that case it 172 might be simpler to use @code{MHD_response_from_buffer_static()}. 173 174 @item free_cb_cls 175 additional argument to pass to the @var{free_cb}. 176 A common value to pass is @var{buffer}. 177 @end table 178 179 Return @code{NULL} on error (i.e. invalid arguments, out of memory). 180 @end deftypefun 181 182 @anchor{MHD_FreeCallback} 183 @deftypefn {Function Pointer} void (*MHD_FreeCallback) (void *cls) 184 185 Functions of this type are invoked by MHD whenever it wants to give 186 the application a chance to free resources. 187 188 @table @var 189 @item cls 190 custom value provided by the application together with the 191 actual function pointer; should identify the resources to be released 192 @end table 193 @end deftypefn 194 195 When releasing resources is unnecessary, applications can instead 196 use the simplified @code{MHD_response_from_buffer_static()} API 197 that simply omits the @var{free_cb} and @var{free_cb_cls} arguments. 198 199 @anchor{MHD_response_from_buffer_static} 200 @deftypefun {struct MHD_Response *} MHD_response_from_buffer_static (enum MHD_HTTP_StatusCode sc, size_t buffer_size, const char *buffer) 201 Create a response object without the need to free resources after the response has been sent to the client. 202 203 @table @var 204 @item sc 205 HTTP status code for the response. 206 207 @item size 208 size of the data portion of the response; 209 210 @item buffer 211 the body to return, must contain at least @var{size} bytes of data; 212 the application must ensure that data in @var{buffer} remains valid 213 at least until the response was sent; can be NULL if @var{size} is zero, 214 but in this case it might be simpler to use @code{MHD_response_from_empty()}. 215 @end table 216 217 Return @code{NULL} on error (i.e. invalid arguments, out of memory). 218 @end deftypefun 219 220 @anchor{MHD_response_from_buffer_copy} 221 @deftypefun {struct MHD_Response *} MHD_response_from_buffer_copy (enum MHD_HTTP_StatusCode sc, size_t buffer_size, const char buffer[buffer_size]) 222 223 Create a response object from an ephemeral @var{buffer}. The data 224 in the @var{buffer} will be copied into internal storage of MHD. 225 226 @table @var 227 @item sc 228 HTTP status code for the response. 229 230 @item size 231 size of the data portion of the response; 232 233 @item buffer 234 the body to return, must contain at least @var{size} bytes of data; 235 the @var{buffer} can become invalid immediately after the 236 call to @code{MHD_response_from_buffer_copy()} returns as MHD 237 will make a copy of the data contained in it. 238 @end table 239 240 Return @code{NULL} on error (i.e. invalid arguments, out of memory). 241 @end deftypefun 242 243 @anchor{MHD_response_from_empty} 244 @deftypefun {struct MHD_Response *} MHD_response_from_empty (enum MHD_HTTP_StatusCode sc) 245 Create an response with an empty body. 246 247 @table @var 248 @item sc 249 HTTP status code for the response. A common value would be @code{MHD_HTTP_NO_CONTENT}. 250 @end table 251 252 Return @code{NULL} on error (i.e. invalid arguments, out of memory). 253 @end deftypefun 254 255 Finally, in rare cases, the response data may not be available in a 256 continuous block in memory and it might be more efficient to not copy 257 the data into a continous area just for the network transfer (or 258 encryption). In this case, applications can initialize an array of 259 @code{struct MHD_IoVec} data structures and use 260 @code{MHD_response_from_iovec()} to point MHD to the various fragments 261 of the body and enable (if supported) the kernel (or NIC) to assemble 262 the final response dynamcially from the fragments in 263 memory.@footnote{See the @code{writev()} POSIX call for an example of 264 the type of scatter input operationg system interface that MHD might 265 use to implement this.} 266 267 @cindex iovec 268 @cindex scatter write 269 @cindex writev 270 @anchor{MHD_response_from_iovec} 271 @deftypefun {struct MHD_Response *} MHD_response_from_iovec (enum MHD_HTTP_StatusCode sc, unsigned int iov_count, const struct MHD_IoVec iov[iov_count], MHD_FreeCallback free_cb, void *free_cb_cls) 272 273 Create a response object from an array of memory buffers. 274 @table @var 275 @item sc 276 HTTP status code for the response. 277 278 @item iov_count 279 the number of elements in @var{iov}; 280 281 @item iov 282 the array for response data buffers of length @var{iov_count}, an internal copy of the @var{iov} will be made; however, note that the data pointed to by the @var{iov} is @strong{not} copied and must be preserved unchanged at the given locations until the response is no longer in use and the @var{free_cb} is called; 283 284 @item free_cb 285 the callback to call to free resources associated with @var{iov}; 286 You may pass @code{NULL} to indicate that no cleanup function is needed. 287 288 @item free_cb_cls 289 additional argument to pass to the @var{free_cb}. 290 @end table 291 292 Return @code{NULL} on error (i.e. invalid arguments, out of memory). 293 @end deftypefun 294 295 @anchor{MHD_IoVec} 296 @deftp {C Struct} MHD_IoVec 297 Input/output vector type. Informations MHD about a fragment of 298 data in memory for assembly as part of an HTTP response body. 299 @table @var 300 @item @code{const void *} iov_base 301 Pointer to the memory region for I/O. 302 @item @code{size_t} iov_len 303 The size (in bytes) of the memory region pointed to by @var{iov_base}. 304 @end table 305 @end deftp 306 307 308 @subsection Responses from file descriptors 309 @cindex sendfile 310 311 @anchor{MHD_response_from_fd} 312 @deftypefun {struct MHD_Response *} MHD_response_from_fd (enum MHD_HTTP_StatusCode sc, int fd, uint_fast64_t offset, uint_fast64_t size) 313 Create a response object based on a file descriptor @var{fd} from 314 which the body is supposed to be read. 315 316 @table @var 317 @item sc 318 HTTP status code for the response. 319 320 @item fd 321 file descriptor referring to a file on disk with the 322 data; MHD will @code{close()} the file descriptor when 323 the response is destroyed; @var{fd} should be in @emph{blocking} mode; 324 @var{fd} must be an actual file descriptor (not a pipe or socket) 325 since MHD might use @code{sendfile()} or @code{seek()} on it; 326 327 @item offset 328 offset to start reading from in the file; 329 readings file beyond 2 GiB may be not supported by some 330 operationg systems or MHD builds. 331 @xref{MHD_LIB_INFO_FIXED_HAS_LARGE_FILE}. 332 333 @item size 334 size size of the data portion of the response; 335 sizes larger than 2 GiB may be not supported by 336 some operating systems or MHD builds. 337 @xref{MHD_LIB_INFO_FIXED_HAS_LARGE_FILE}. 338 @end table 339 340 Returns @code{NULL} on error (i.e. invalid arguments, out of memory). 341 The @var{fd} is closed on error. 342 @end deftypefun 343 344 @cindex splice 345 @anchor{MHD_response_from_pipe} 346 @deftypefun {struct MHD_Response *} MHD_response_from_pipe (enum MHD_HTTP_StatusCode sc, int fd) 347 348 Create a response object where the response body is created by reading from 349 the provided pipe. 350 @c FIXME: will it also work for sockets? Is this using splice()? Clarify! 351 352 @table @var 353 @item sc 354 HTTP status code for the response. 355 356 @item fd 357 file descriptor of the read-end of a pipe; will be 358 closed when response is destroyed. 359 The descriptor should be in blocking-IO mode. 360 @end table 361 362 Returns @code{NULL} on error (i.e. out of memory). 363 @c FIXME: closes fd on error? 364 @end deftypefun 365 366 367 @subsection Responses from dynamic generators 368 369 This API is useful for applications that dynamically create the 370 response body, possibly even with significant delays between 371 chunks. 372 373 @c FIXME: this comment seems wrong, see above for from_pipe()! 374 @c This is also the only API that applications can use to 375 @c return responses for which they do not know the length up-front. 376 377 @cindex dynamic responses 378 @cindex generation 379 380 @anchor{MHD_response_from_callback} 381 @deftypefun {struct MHD_Response *} MHD_response_from_callback (enum MHD_HTTP_StatusCode sc, uint_fast64_t size, MHD_DynamicContentCreator dyn_cont, void *dyn_cont_cls, MHD_FreeCallback dyn_cont_fc) 382 383 Create a response object with a body that will be yielded over 384 time by the @code{dyn_cont} callback. 385 386 @table @var 387 @item sc 388 HTTP status code for the response. 389 390 @item size 391 size of the body of the response, applications should pass 392 @code{MHD_SIZE_UNKNOWN} if the size of the body is not yet known; 393 394 @item dyn_cont 395 callback that MHD will use to obtain the response body 396 397 @item dyn_cont_cls 398 extra argument that MHD will pass to @var{dyn_cont} and 399 @var{dyn_cont_fc} 400 401 @item dyn_cont_fc 402 callback that MHD will call to allow the application to 403 free resources associated with @var{dyn_cont_cls}. 404 @end table 405 406 Return @code{NULL} on error (i.e. invalid arguments, out of memory). 407 @end deftypefun 408 409 The interesting work for dynamic response generation happens in the 410 dynamic content creation callback, which must be a function of 411 type @code{MHD_DynamicContentCreator}. 412 413 @anchor{MHD_DynamicContentCreator} 414 @deftypefn {Function Pointer} {struct MHD_DynamicContentCreatorAction *} (*MHD_DynamicContentCreator) (void *dyn_cont_cls, struct MHD_DynamicContentCreatorContext *ctx, uint_fast64_t pos, void *buf, size_t max) 415 416 @table @var 417 @item dyn_cont_cls 418 closure argument that was associated with the callback 419 420 @item ctx 421 the context to produce the action to return; 422 the pointer is only valid until the callback returns; 423 equivalent to the @var{request} argument given to 424 functions of type @code{MHD_RequestCallback}; 425 426 @item pos 427 position in the datastream to access; 428 note that if a @code{struct MHD_Response} is re-used, 429 it is possible for the same dynamic content creator to 430 be queried multiple times for the same data; 431 however, if a @code{struct MHD_Response} is not re-used, 432 libmicrohttpd guarantees that @var{pos} will be 433 the sum of all data sizes previously yielded by this callback 434 435 @item buf 436 buffer where the application may write data that should be 437 included in the body at offset @var{pos}; @var{buf} has 438 @var{max} bytes available; 439 440 @item max 441 maximum number of bytes the application may copy to @var{buf}; 442 if the size of the content of the response is known then the 443 size of the buffer is never larger than amount of data left 444 @end table 445 446 Most importantly, the callback must also return a 447 @code{struct MHD_DynamicContentCreatorAction} which determines 448 the next step in creating the body. Applications may 449 return @code{NULL} in which case response generation will 450 be aborted and MHD will @code{close()} the connection. 451 @end deftypefn 452 453 @cindex dynamic content creator action 454 455 @anchor{MHD_DynamicContentCreatorAction} 456 @deftp {C Struct} MHD_DynamicContentCreatorAction 457 Special type of action that must be returned by a 458 @code{MHD_DynamicContentCreator}. 459 @end deftp 460 461 Various possibilities exist for applications to create 462 an @code{struct MHD_DynamicContentCreatorAction} (DCC action). Note 463 that at most one @code{struct MHD_DynamicContentCreatorAction} 464 can be created per @var{ctx}. 465 466 We begin with DCC actions that end the process of 467 dynamic response generation: 468 469 @anchor{MHD_DCC_action_abort} 470 @deftypefun {struct MHD_DynamicContentCreatorAction *} MHD_DCC_action_abort (struct MHD_DynamicContentCreatorContext *ctx) 471 472 Aborts handling the request by closing the connection. This 473 is actually simply a macro that is equivalent to just @code{NULL}, 474 except that it also suggests to the compiler that it it should 475 not emit a warning for not using @var{ctx}. 476 477 @end deftypefun 478 479 @anchor{MHD_DCC_action_finish} 480 @deftypefun {struct MHD_DynamicContentCreatorAction *} MHD_DCC_action_finish (struct MHD_DynamicContentCreatorContext *ctx) 481 482 Create a "finished" action that signals MHD that the dynamic content creation 483 is finished. Note that this will cause MHD to @code{close()} the connection 484 if the amount of data yielded by the content creation logic is less than 485 the @var{size} promised to @code{MHD_response_from_callback()}. 486 487 @table @var 488 @item ctx 489 context that was given to the @code{MHD_DynamicContentCreator} for 490 which a @code{struct MHD_DynamicContentCreatorAction} should be generated. 491 @end table 492 493 @code{NULL} is returned in case of any error. 494 @end deftypefun 495 496 497 HTTP has not only headers, but also the lesser-known concept of 498 @emph{footers}. Applications can specify footers (for example, 499 to append a checksum after dynamic content creation) using 500 @code{MHD_DCC_action_finish_with_footer()}. 501 502 @anchor{MHD_DCC_action_finish_with_footer} 503 @deftypefun {struct MHD_DynamicContentCreatorAction *} MHD_DCC_action_finish_with_footer (struct MHD_DynamicContentCreatorContext *ctx, size_t num_footers, const struct MHD_NameValueCStr *footers) 504 505 Create a "finished" action that signals MHD that the dynamic content creation 506 is finished. Note that this will cause MHD to @code{close()} the connection 507 if the amount of data yielded by the content creation logic is less than 508 the @var{size} promised to @code{MHD_response_from_callback()}. 509 510 @table @var 511 @item ctx 512 context that was given to the @code{MHD_DynamicContentCreator} for 513 which a @code{struct MHD_DynamicContentCreatorAction} should be generated; 514 515 @item num_footers 516 length of the @var{footers} array; 517 518 @item footers 519 array of @var{num_footers} HTTP footers to return. 520 @end table 521 522 @code{NULL} is returned in case of any error. 523 @end deftypefun 524 525 The @var{footers} are provided as key-value pairs of 0-terminated C strings 526 in a @code{struct MHD_NameValueCStr}. In this context, both members must 527 not be @code{NULL}. 528 529 @anchor{MHD_NameValueCStr} 530 @deftp {C Struct} MHD_NameValueCStr name value 531 Name with value pair as C strings. 532 @table @var 533 @item @code{const char *} name 534 The name or key of the field. Must never be @code{NULL}. 535 @item @code{const char *} value 536 The value to be returned under the name or key. 537 In some cases, @var{value} is allowed to be absent, 538 which is indicated by a @code{NULL} pointer. 539 @end table 540 @end deftp 541 542 @cindex long-polling 543 544 Applications may not want to finish generating a response, but also 545 may not (yet) have more data to return to the client. In this case, 546 applications must @emph{suspend} response generation. This is done 547 using @code{MHD_DCC_action_suspend()}. 548 549 @anchor{MHD_DCC_action_suspend} 550 @deftypefun {struct MHD_DynamicContentCreatorAction *} MHD_DCC_action_suspend (struct MHD_DynamicContentCreatorContext *ctx) 551 552 Creates a DCC action that suspends response generation. The connection 553 is not closed! MHD merely waits for the application to resume response 554 generation via a call to @code{MHD_request_resume()}. This is 555 especially useful for long-polling where response generation is not 556 computationally bound. This is common in cases where client and server 557 need to wait (possibly for an extended period of time) on some 558 external event to happen before the server can generate a response. 559 560 @table @var 561 @item ctx 562 context that was given to the @code{MHD_DynamicContentCreator} for 563 which a @code{struct MHD_DynamicContentCreatorAction} should be generated; 564 @end table 565 566 @code{NULL} is returned in case of any error. 567 @end deftypefun 568 569 After dynamic content creation was suspended with 570 @code{MHD_DCC_action_suspend()}, applications @strong{must} 571 (eventually) call @code{MHD_request_resume()} to continue 572 processing the client's request. 573 574 Finally, we consider DCC actions that can be used to signal MHD data to be 575 returned in the MHD body. 576 577 @anchor{MHD_DCC_action_continue} 578 @deftypefun {struct MHD_DynamicContentCreatorAction *} MHD_DCC_action_continue (struct MHD_DynamicContentCreatorContext *ctx, size_t data_size) 579 580 Creates an action that indicates that a chunk of @var{data_size} bytes 581 was provided in the @var{buf} that MHD provided to the 582 @code{MHD_DynamicContentCreator} callback 583 and that MHD should continue to call the content generator for more 584 (as soon as MHD has more buffer space available). 585 586 @table @var 587 @item ctx 588 context that was given to the @code{MHD_DynamicContentCreator} for 589 which a @code{struct MHD_DynamicContentCreatorAction} should be generated; 590 591 @item data_size 592 number of bytes that were written by the application into @var{buf}; 593 must be non-zero; 594 @end table 595 596 @code{NULL} is returned in case of any error. 597 @end deftypefun 598 599 A small variation of the above API can be used to associate 600 a chunk-extension (see RFC 9112, 7.1) with the chunk: 601 602 @deftypefun {struct MHD_DynamicContentCreatorAction *} MHD_DCC_action_continue_ce (struct MHD_DynamicContentCreatorContext *ctx, size_t data_size, const char *chunk_ext) 603 604 Creates an action that indicates that a chunk of @var{data_size} bytes 605 was provided in the @var{buf} that MHD provided to the 606 @code{MHD_DynamicContentCreator} callback 607 and that MHD should continue to call the content generator for more 608 (as soon as MHD has more buffer space available). 609 Furthermore, the chunk of data that was returned is optionally 610 associated with a chunk-extension (@var{ce}) that MHD should 611 include in the transmission if possible. 612 613 @table @var 614 @item ctx 615 context that was given to the @code{MHD_DynamicContentCreator} for 616 which a @code{struct MHD_DynamicContentCreatorAction} should be generated; 617 618 @item data_size 619 number of bytes that were written by the application into @var{buf}; 620 must be non-zero; 621 622 @item chunk_ext 623 optional pointer to a chunk extension string; 624 can be @code{NULL} to not use chunk extension, 625 ignored if chunked encoding is not used by MHD 626 (say because the client is using HTTP/1.0 and 627 the connection is only used for a single request). 628 @end table 629 630 @code{NULL} is returned in case of any error. 631 @end deftypefun 632 633 While writing new data that an application may dynamically generate 634 directly into MHD's @var{buf} is usually ideal, copying existing 635 data over into the buffer provided by MHD may not be ideal. 636 Applications can also instruct MHD to include data from 637 locations in the application's memory, and in fact it is 638 possible to @emph{mix} both strategies using 639 @code{MHD_DCC_action_continue_zc()}: 640 641 @anchor{MHD_DCC_action_continue_zc} 642 @deftypefun {struct MHD_DynamicContentCreatorAction *} MHD_DCC_action_continue_zc (struct MHD_DynamicContentCreatorContext *ctx, size_t data_size, const struct MHD_DynContentZCIoVec *iov_data, const char *chunk_ext) 643 644 Yields a chunk of body data to MHD with (optional) chunk-extension. 645 The data is provided in the MHD buffer and/or in the zero-copy @var{iov_data}. 646 647 If data is provided both in the MHD buffer and @var{ivo_data} then 648 data in the MHD buffer is sent first, followed by the @var{iov_data}. 649 The total size of the data in the buffer and in @var{iov_data} @strong{must} 650 be non-zero. 651 652 @table @var 653 @item ctx 654 context that was given to the @code{MHD_DynamicContentCreator} for 655 which a @code{struct MHD_DynamicContentCreatorAction} should be generated; 656 657 @item data_size 658 the amount of the data placed to the provided MHD buffer (@var{buf}), 659 cannot be larger than provided buffer size, 660 must be non-zero if @var{iov_data} is @code{NULL} or has no data; 661 662 @item iov_data 663 optional pointer to a vector of data fragments to send, 664 must not be NULL and have non-zero bytes of data if @var{data_size} 665 is zero; 666 667 @item chunk_ext 668 optional pointer to a chunk extension string; 669 can be @code{NULL} to not use chunk extension, 670 ignored if chunked encoding is not used by MHD 671 (say because the client is using HTTP/1.0 and 672 the connection is only used for a single request). 673 @end table 674 675 It is an error if the total response body size is known and the 676 amount of data yielded in total by the dynamic content creation logic 677 exceeds that amount. In this case, this function will fail and 678 return @code{NULL}. 679 680 @end deftypefun 681 682 The @code{struct MHD_DynContentZCIoVec} adds an application 683 cleanup callback to an array of @code{struct MHD_IoVec}s: 684 685 @cindex iovec 686 @cindex writev 687 @cindex scatter write 688 689 @anchor{MHD_DynContentZCIoVec} 690 @deftp {C Struct} MHD_DynContentZCIoVec 691 Structure to pass various memory buffers to MHD together with 692 a callback for cleaning up after MHD is done using the data. 693 @table @var 694 @item @code{size_t} iov_count 695 The length of the @var{iov} array; 696 697 @item @code{const struct MHD_ioVec *} iov 698 Pointer to an array of length @var{iov_count} identifying data chunks 699 to return as part of the body; 700 701 @item @code{MHD_FreeCallback} iov_fcb 702 Function to call to free resources associated with @var{iov}. 703 Can be @code{NULL} if releasing these resources is not necessary 704 after finishing the response generation; 705 706 @item @code{void *} iov_fcb_cls 707 Parameter to pass to @var{iov_fcb}. 708 @end table 709 710 @end deftp 711 712 713 @node libmicrohttpd-response headers 714 @section Adding headers to a response 715 @cindex header 716 @cindex Connection 717 @cindex Date 718 @cindex Content-Length 719 @cindex Transfer-Encoding 720 721 After creating a response, but @emph{before} using it to create an 722 @code{struct MHD_Action}, applications may add custom HTTP headers 723 to a response. Note that MHD will automatically set some common 724 HTTP headers, in particular ``Content-Length'', ``Transfer-Encoding'', 725 ``Date`` and ``Connection''. 726 727 @code{MHD_response_add_header()} prevents applications from setting a 728 ``Transfer-Encoding'' header to values other than ``identity'' or 729 ``chunked'' as other transfer encodings are not supported by MHD. Note 730 that usually MHD will pick the correct transfer encoding 731 automatically; however, applications can use the header to force a 732 particular behavior. 733 734 @code{MHD_response_add_header()} prevents applications from setting a 735 ``Connection'' header to values other than ``close'' or 736 ``keep-alive''. Note that usually MHD will pick a sane value 737 automatically; however, applications can use the header to force a 738 particular behavior. 739 740 @code{MHD_response_add_header()} also prevents applications from setting a 741 ``Content-Length'' header unless special options are set for the 742 response (see @ref{libmicrohttpd2-response options,,response options}) as 743 MHD will automatically set a correct ``Content-Length'' header if it 744 is possible and allowed by the HTTP protocol. 745 746 @anchor{MHD_response_add_header} 747 @deftypefun {enum MHD_StatusCode} MHD_response_add_header (struct MHD_Response *response, const char *name, const char *value) 748 749 Add a header line to the response. 750 751 @table @var 752 @item response 753 which response to add a header for, @code{NULL} is tolerated; 754 755 @item name 756 the name of the header to add; 757 an internal copy of the string will be made; 758 must not contain newlines, carriage returns or 759 tabulator characters; 760 761 @item value 762 the value of the header to add; 763 an internal copy of the string will be made; 764 must not contain newlines, carriage returns or 765 tabulator characters. 766 @end table 767 768 On success @code{MHD_SC_OK} is returned. 769 @end deftypefun 770 771 @cindex HTTP2 772 @cindex predefined HTTP header 773 @cindex header 774 775 HTTP2 introduced @emph{predefined} (standard) HTTP headers. For such 776 headers, it is (slightly) more efficient to set the headers using 777 values from the @code{enum MHD_PredefinedHeader} instead of specifying 778 the name as a string.@footnote{The main reason being that HTTP2 can 779 encode these headers using a number instead of a string, and by having 780 the application directly provide the numeric value MHD does not have 781 to map the string to the number.} 782 783 @deftypefun {enum MHD_StatusCode} MHD_response_add_predef_header (struct MHD_Response *response, enum MHD_PredefinedHeader stk, const char *content) 784 Adds a header line to the response. 785 786 @table @var 787 @item response 788 which response to add a header for, @code{NULL} is tolerated; 789 790 @item stk 791 code of the predefined header; 792 793 @item content 794 the value of the header to add 795 an internal copy of the string will be made. 796 @end table 797 798 Notice that the content must not contain newlines, carriage returns or 799 tabulator characters. On success @code{MHD_SC_OK} is returned. 800 @end deftypefun 801 802 @anchor{MHD_PredefinedHeader} 803 @deftp {Enumeration} MHD_PredefinedHeader 804 805 Predefined list of canonical HTTP headers, useful for HTTP2 806 header packing (HPACK). 807 808 @c FIXME: the table seems rather incomplete (also in libmicrohttpd2.h), 809 @c and we should probably generate it via GANA (like HTTP status codes) 810 @table @code 811 @item MHD_PREDEF_ACCEPT_CHARSET 812 15: ``Accept-Charset`` 813 @item MHD_PREDEF_ACCEPT_LANGUAGE 814 17: ``Accept-Language`` 815 @end table 816 @end deftp 817 818 MHD provides a convenience function to map @code{enum MHD_PredefinedHeader} 819 values to the human readable names: 820 821 @deftypefun {const struct MHD_String *} MHD_predef_header_to_string (enum MHD_PredefinedHeader stk) 822 Get textual representation of the predefined header. 823 824 @table @var 825 @item stk 826 code of the predefined header; 827 @end table 828 829 @c FIXME: shouldn't it then be a StringNullable!??!? 830 Returns a pointer to the text version, or @code{NULL} if 831 @var{stk} is not known. 832 @end deftypefun 833 834 835 @node libmicrohttpd2-response options 836 @section Setting response options 837 @cindex option 838 839 This section is about setting response options. In principle, setting 840 response options works like setting other options in 841 MHD. @xref{libmicrohttpd2-doptions,,Configuring your HTTP daemon}. 842 843 MHD response options are represented using a @code{struct 844 MHD_ResponseOptionAndValue}. However, applications should never be 845 concerned with the internals of this data structure, and only use the 846 provided API functions and macros explained in this chapter to 847 construct these options. 848 849 MHD offers three main ways to set options for a @code{struct MHD_Response}: 850 851 @itemize 852 @item @code{MHD_response_set_options()} sets an array of options, 853 @item @code{MHD_response_set_option()} sets an individual option, and 854 @item @code{MHD_RESPONSE_SET_OPTIONS()} sets a list of options. 855 @end itemize 856 857 All three approaches can be combined for the same response 858 to set various options. We will now look at each of them. 859 860 @code{MHD_response_set_options()} is useful if the application needs 861 complex code to first initialize a set of options, or if it has a 862 static data buffer with all of the options (say in ROM). It is also 863 the function use to implement the other styles. 864 865 @deftypefun {struct MHD_StatusCode} MHD_response_set_options (struct MHD_Response *response, const struct MHD_ResponseOptionAndValue *options, size_t options_max_num) 866 867 @table @var 868 @item response 869 the response to configure 870 871 @item options 872 array of options to set, either @code{MHD_D_OPTION_TERIMINATE()}-terminated or 873 limited by @var{options_max_num} (whatever comes first). 874 875 @item options_max_num 876 maximum number of options to process from the @var{options} array, 877 or @code{MHD_OPTIONS_ARRAY_MAX_SIZE} to process all options from 878 @var{options} until the @code{MHD_D_OPTION_TERMINATE()}-terminator. 879 880 @end table 881 882 Returns @code{MHD_SC_OK} on success, otherwise the error code of 883 the first option that could not be set. 884 @end deftypefun 885 886 To set only a single option, MHD defines a simple convenience API with 887 @code{MHD_response_set_option()}. This is useful if there is only one 888 option to be set, or if error handling for that specific option is 889 somehow special (like not failing when setting this particular option 890 failed). 891 892 @deftypefun {struct MHD_StatusCode} MHD_response_set_option (struct MHD_Response *response, const struct MHD_ResponseOptionAndValue *option) 893 894 @table @var 895 @item response 896 the response to configure 897 898 @item option 899 the option to set 900 901 @end table 902 903 Returns @code{MHD_SC_OK} on success, otherwise the error code from 904 trying to set the @var{option}. 905 @end deftypefun 906 907 908 An easy way to set a bunch of options without having to worry 909 about explicitly allocating an array or checking each return 910 value is to use @code{MHD_RESPONSE_SET_OPTIONS()}. 911 912 @anchor{MHD_RESPONSE_SET_OPTIONS} 913 @deftypefun {struct MHD_StatusCode} MHD_RESPONSE_SET_OPTIONS (struct MHD_Response *response, ...) 914 915 @table @var 916 @item response 917 the response to configure 918 919 @item ... 920 variable-length list of @code{MHD_ResponseOptionAndValue} options 921 to set; does @emph{not} need to be terminated via 922 @code{MHD_D_OPTION_TERMINATE()} as such a terminator is added 923 automatically. 924 925 @end table 926 927 Returns @code{MHD_SC_OK} on success, otherwise the error code of 928 the first option that could not be set. 929 @end deftypefun 930 931 The remaining sections of this section discuss the various 932 response options available to applications today. 933 934 @include manual/response_options.inc 935 936 937 @node libmicrohttpd-upgrade 938 @section Creating a response for protocol upgrades 939 @cindex WebSockets 940 @cindex HTTP Upgrade 941 @cindex HTTP2 942 @cindex RFC2817 943 944 With RFC 2817 a mechanism to switch protocols within HTTP was 945 introduced. Here, a client sends a request with a ``Connection: 946 Upgrade'' header. The server responds with a ``101 Switching 947 Protocols'' response header, after which the two parties begin to 948 speak a different (non-HTTP) protocol over the TCP connection. 949 950 This mechanism is used for upgrading HTTP 1.1 connections to HTTP2 or 951 HTTPS, as well as for implementing WebSockets. Which protocol 952 upgrade is performed is negotiated between server and client in 953 additional headers, in particular the ``Upgrade'' header. 954 955 MHD supports switching protocols using this mechanism 956 by returning a special @code{MHD_action_upgrade()} action 957 from the @ref{MHD_RequestCallback,,@code{MHD_RequestCallback}}. 958 959 Note that support for upgrading connections is an @emph{optional} 960 feature that could be left out especially in embedded builds. Use 961 @ref{MHD_LIB_INFO_FIXED_HAS_UPGRADE,,@code{MHD_LIB_INFO_FIXED_HAS_UPGRADE}} 962 to check if the library supports it. Furthermore, connection upgrades 963 can be disabled for a daemon using 964 @code{MHD_D_OPTION_DISALLOW_UPGRADE()} for some potential minor 965 performance benefit. Thus, you may want to make sure the feature is 966 actually properly enabled. 967 968 @anchor{MHD_action_upgrade} 969 @deftypefun {const struct MHD_Action *} MHD_action_upgrade (struct MHD_Request *request, const char *upgrade_hdr_value, MHD_UpgradeHandler upgrade_handler, void *upgrade_handler_cls, size_t num_headers, const struct MHD_NameValueCStr *headers) 970 971 Create a action object that can be used for 101 Upgrade 972 responses, for example to implement WebSockets. After sending the 973 response, control over the data stream is given to the callback (which 974 can then, for example, start some bi-directional communication). 975 The callback will @emph{only} be called after the response header 976 was successfully passed to the OS; if there are communication errors 977 before, the usual MHD connection error handling code will be performed. 978 979 When creating this type of response, the "Connection: Upgrade" 980 header will be set automatically for you. 981 982 983 @table @var 984 @item request 985 the request to create action for; 986 987 @item upgrade_hdr_value 988 the value of the (mandatory) "Upgrade:" header, must not be @code{NULL}; 989 990 @item upgrade_handler 991 function to call with the "upgraded" socket; 992 993 @item upgrade_handler_cls 994 closure for @var{upgrade_handler}; 995 996 @item num_headers 997 number of elements in the @var{headers} array, 998 must be zero if @var{headers} is @code{NULL}; 999 1000 @item headers 1001 optional pointer to an array of additional HTTP headers to return in 1002 the response (the strings will be copied and do not need to be 1003 preserved by the application after this function returns); 1004 can be @code{NULL} if @var{num_headers} is zero; 1005 1006 @end table 1007 1008 @code{NULL} is returned on error (i.e. invalid arguments, out of memory). 1009 @end deftypefun 1010 1011 The @var{upgrade_handler} argument has the following type: 1012 1013 @anchor{MHD_UpgradeHandler} 1014 @deftypefn {Function Pointer} void (*MHD_UpgradeHandler) (void *cls, struct MHD_Request *request, struct MHD_UpgradeHandle *urh) 1015 1016 Applications must implement functions of this type which be called 1017 once MHD has transmitted the header of the response to the connection 1018 that is being upgraded. At this point, the application is expected to 1019 take over the connection represented by @var{urh} and use @var{urh} to speak 1020 the non-HTTP protocol to which the connection was upgraded with the client. 1021 1022 The application must call @code{MHD_upgraded_send()}, 1023 @code{MHD_upgraded_recv()} and eventually @code{MHD_upgraded_close()} 1024 to interact with the client. @code{MHD_upgraded_close()} must be 1025 called before destroying the daemon. 1026 1027 "Upgraded" connection will not time out, but are still counted for daemon 1028 global connections limit and for per-IP limit (if set). 1029 1030 Except when in "thread-per-connection" mode, implementations of this 1031 function should never block (as it will be called from within the main 1032 event loop). 1033 1034 @table @var 1035 @item cls 1036 matches the @code{upgrade_handler_cls} that was given to @code{MHD_action_upgrade()}; 1037 1038 @item request 1039 identifies the request of the connection that is being upgraded; 1040 1041 @item urh 1042 handle to interact with the client. 1043 @c FIXME: C comment talks about MHD_upgrade_operation(), seems outdated! 1044 @end table 1045 1046 @end deftypefn 1047 1048 @c FIXME: Evgeny: this is correct, right? 1049 When upgrading a connection, applications using an external event loop may 1050 use the connection @ref{libmicrohttpd-request-status-info,,request 1051 introspection API} to obtain the socket underlying the HTTP request 1052 and then add that socket to their own event loop to decide when to 1053 call @code{MHD_upgraded_recv()} and @code{MHD_upgraded_send()}. 1054 1055 @anchor{MHD_upgraded_recv} 1056 @deftypefun {enum MHD_StatusCode} MHD_upgraded_recv (struct MHD_UpgradeHandle *urh, size_t recv_buf_size, void *recv_buf, size_t *received_size, uint_fast64_t max_wait_millisec) 1057 1058 Receive data on the HTTP-Upgraded connection. 1059 1060 The function will return if one of the following happens: 1061 @itemize 1062 @item Any amount of data has been received, 1063 @item The specified timeout was reached, or 1064 @item a network error occured. 1065 @end itemize 1066 1067 @table @var 1068 @item urh 1069 identifies the HTTP-upgraded connection handle 1070 1071 @item recv_buf_size 1072 size of the @var{recv_buf} 1073 1074 @item recv_buf 1075 application buffer where MHD should place received data 1076 1077 @item received_size 1078 pointer where to return the number of bytes received 1079 @c FIXME: header lacks [out], English not so good 1080 1081 @item max_wait_millisec 1082 the maximum wait time for the data, non-blocking operation if set to zero, 1083 wait indefinitely if set larger or equal to @code{MHD_WAIT_INDEFINITELY}; 1084 the function may return earlier if waiting is interrupted for some reason. 1085 @end table 1086 Returns: 1087 @table @code 1088 @item MHD_SC_OK 1089 if any data was received (check the @var{received_size}) or 1090 remote shut down send side (indicated by @var{received_size} 1091 set to zero); 1092 1093 @item MHD_SC_UPGRADED_NET_TIMEOUT 1094 if no data was received but and timeout was reached; 1095 1096 @item MHD_SC_UPGRADED_NET_CONN_CLOSED 1097 if the network connection has been closed, 1098 @c FIXME: should the application still call MHD_upgraded_close()? If so, we should say so explicitly! 1099 1100 @item MHD_SC_UPGRADED_NET_CONN_BROKEN 1101 if a broken network connection has been detected, 1102 1103 @item MHD_SC_UPGRADED_TLS_ERROR 1104 if a TLS error occured (only possible with TLS connections), 1105 1106 @item MHD_SC_UPGRADED_NET_HARD_ERROR 1107 if any other network or sockets unrecoverable error occured, 1108 1109 @item MHD_SC_UPGRADED_HANDLE_INVALID 1110 if @var{urh} is invalid, 1111 1112 @item MHD_SC_UPGRADED_WAITING_NOT_SUPPORTED 1113 if timed wait is not supported by this MHD build or platform 1114 @end table 1115 @end deftypefun 1116 1117 @cindex upgraded handle 1118 1119 After the upgrade, the application must use the 1120 @code{struct MHD_UpgradedHandle} to continue the 1121 interaction with the client. 1122 1123 @anchor{MHD_UpgradedHandle} 1124 @deftp {C Struct} MHD_UpgradedHandle 1125 Handle for response that has been "upgraded" (say to a WebSocket). 1126 @end deftp 1127 1128 Using the handle, the application primarily has 1129 three ways to interact with the client: 1130 @itemize 1131 @item send data, 1132 @item receive data, or 1133 @item close the connection. 1134 @end itemize 1135 1136 @anchor{MHD_upgraded_send} 1137 @deftypefun {enum MHD_StatusCode} MHD_upgraded_send (struct MHD_UpgradeHandle *urh, size_t send_buf_size, const void *send_buf, size_t *sent_size, uint_fast64_t max_wait_millisec, enum MHD_Bool more_data_to_come) 1138 1139 Sends data on an HTTP-Upgraded connection. 1140 1141 The function will return if one of the following happens: 1142 @itemize 1143 @item All provided data has been sent, 1144 @c FIXME: Truly *all*? So always blocking? Not ideal! Discuss! 1145 @item The timeout was reached, or 1146 @item a network error occurs 1147 @end itemize 1148 1149 1150 @table @var 1151 @item urh 1152 identifies the upgraded connection to transmit data on 1153 1154 @item send_buf_size 1155 the number of bytes of data in the @var{send_buf} 1156 1157 @item send_buf 1158 the buffer with the data to send 1159 1160 @item sent_size 1161 the pointer where MHD will return the number of bytes of data actually sent 1162 1163 @item max_wait_millisec 1164 the maximum wait time for the data, non-blocking operation if set to zero, 1165 wait indefinitely if larger or equal to @code{MHD_WAIT_INDEFINITELY} 1166 1167 @item more_data_to_come 1168 should be set to @code{MHD_YES} if the provided data in the 1169 @var{send_buf} is part of a larger data package, like an incomplete 1170 message or part of a data stream (and not the final part), and thus 1171 more data is expected to be sent soon over the same connection; set to 1172 @code{MHD_NO} if the data in the @var{send_buf} is the complete 1173 message or the final part of the message (or file) and it should be 1174 pushed to the network (and to the client) as soon as possible; 1175 basically controls network buffering (see Nagle's algorithm and 1176 TCP PUSH). 1177 @end table 1178 1179 Returns: 1180 @table @code 1181 @item MHD_SC_OK 1182 if any data was sent (check the @var{sent_size}); 1183 1184 @item MHD_SC_UPGRADED_NET_TIMEOUT 1185 if no data was sent and the timeout was reached; 1186 1187 @item MHD_SC_UPGRADED_NET_CONN_CLOSED 1188 if the network connection has been closed, 1189 @c FIXME: should the application still call MHD_upgraded_close()? If so, we should say so explicitly! 1190 1191 @item MHD_SC_UPGRADED_NET_CONN_BROKEN 1192 if a broken network connection has been detected, 1193 1194 @item MHD_SC_UPGRADED_TLS_ERROR 1195 if a TLS error occured (only possible with TLS connections), 1196 1197 @item MHD_SC_UPGRADED_NET_HARD_ERROR 1198 if any other network or sockets unrecoverable error occured, 1199 1200 @item MHD_SC_UPGRADED_HANDLE_INVALID 1201 if @var{urh} is invalid, 1202 1203 @item MHD_SC_UPGRADED_WAITING_NOT_SUPPORTED 1204 if timed wait is not supported by this MHD build or platform 1205 @end table 1206 1207 @end deftypefun 1208 1209 1210 @anchor{MHD_upgraded_close} 1211 @deftypefun {enum MHD_StatusCode} MHD_upgraded_close (struct MHD_UpgradeHandle *urh) 1212 Close HTTP-Upgraded connection handle. 1213 1214 The handle cannot be used after successful return from this function. 1215 1216 The function cannot fail if called correctly (the daemon is not destroyed 1217 and the upgraded connection has not been closed previously). 1218 1219 @table @var 1220 @item urh 1221 identifies the upgraded connection to close 1222 @end table 1223 Returns @code{MHD_SC_OK} on success, otherwise an error code. 1224 @end deftypefun