libmicrohttpd2

HTTP server C library (MHD 2.x, alpha)
Log | Files | Refs | README | LICENSE

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