libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

response.c (77474B)


      1 /*
      2      This file is part of libmicrohttpd
      3      Copyright (C) 2007-2021 Daniel Pittman and Christian Grothoff
      4      Copyright (C) 2015-2023 Evgeny Grin (Karlson2k)
      5 
      6      This library is free software; you can redistribute it and/or
      7      modify it under the terms of the GNU Lesser General Public
      8      License as published by the Free Software Foundation; either
      9      version 2.1 of the License, or (at your option) any later version.
     10 
     11      This library is distributed in the hope that it will be useful,
     12      but WITHOUT ANY WARRANTY; without even the implied warranty of
     13      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14      Lesser General Public License for more details.
     15 
     16      You should have received a copy of the GNU Lesser General Public
     17      License along with this library; if not, write to the Free Software
     18      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
     19 */
     20 /**
     21  * @file response.c
     22  * @brief  Methods for managing response objects
     23  * @author Daniel Pittman
     24  * @author Christian Grothoff
     25  * @author Karlson2k (Evgeny Grin)
     26  */
     27 
     28 #define MHD_NO_DEPRECATION 1
     29 
     30 #include "mhd_options.h"
     31 #ifdef HAVE_SYS_IOCTL_H
     32 #include <sys/ioctl.h>
     33 #endif /* HAVE_SYS_IOCTL_H */
     34 #if defined(_WIN32) && ! defined(__CYGWIN__)
     35 #include <windows.h>
     36 #endif /* _WIN32 && !__CYGWIN__ */
     37 
     38 #include "internal.h"
     39 #include "response.h"
     40 #include "mhd_limits.h"
     41 #include "mhd_sockets.h"
     42 #include "mhd_itc.h"
     43 #include "mhd_str.h"
     44 #include "connection.h"
     45 #include "memorypool.h"
     46 #include "mhd_send.h"
     47 #include "mhd_compat.h"
     48 #include "mhd_assert.h"
     49 
     50 
     51 #if defined(MHD_W32_MUTEX_)
     52 #ifndef WIN32_LEAN_AND_MEAN
     53 #define WIN32_LEAN_AND_MEAN 1
     54 #endif /* !WIN32_LEAN_AND_MEAN */
     55 #include <windows.h>
     56 #endif /* MHD_W32_MUTEX_ */
     57 #if defined(_WIN32)
     58 #include <io.h> /* for lseek(), read() */
     59 #endif /* _WIN32 */
     60 
     61 
     62 /**
     63  * Size of single file read operation for
     64  * file-backed responses.
     65  */
     66 #ifndef MHD_FILE_READ_BLOCK_SIZE
     67 #ifdef _WIN32
     68 #define MHD_FILE_READ_BLOCK_SIZE 16384 /* 16k */
     69 #else /* _WIN32 */
     70 #define MHD_FILE_READ_BLOCK_SIZE 4096 /* 4k */
     71 #endif /* _WIN32 */
     72 #endif /* !MHD_FD_BLOCK_SIZE */
     73 
     74 /**
     75  * Insert a new header at the first position of the response
     76  */
     77 #define _MHD_insert_header_first(presponse, phdr) do { \
     78   mhd_assert (NULL == phdr->next); \
     79   mhd_assert (NULL == phdr->prev); \
     80   if (NULL == presponse->first_header) \
     81   { \
     82     mhd_assert (NULL == presponse->last_header); \
     83     presponse->first_header = phdr; \
     84     presponse->last_header = phdr;  \
     85   } \
     86   else \
     87   { \
     88     mhd_assert (NULL != presponse->last_header);        \
     89     presponse->first_header->prev = phdr; \
     90     phdr->next = presponse->first_header; \
     91     presponse->first_header = phdr;       \
     92   } \
     93 } while (0)
     94 
     95 /**
     96  * Insert a new header at the last position of the response
     97  */
     98 #define _MHD_insert_header_last(presponse, phdr) do { \
     99   mhd_assert (NULL == phdr->next); \
    100   mhd_assert (NULL == phdr->prev); \
    101   if (NULL == presponse->last_header) \
    102   { \
    103     mhd_assert (NULL == presponse->first_header); \
    104     presponse->last_header = phdr;  \
    105     presponse->first_header = phdr; \
    106   } \
    107   else \
    108   { \
    109     mhd_assert (NULL != presponse->first_header);      \
    110     presponse->last_header->next = phdr; \
    111     phdr->prev = presponse->last_header; \
    112     presponse->last_header = phdr;       \
    113   } \
    114 } while (0)
    115 
    116 
    117 /**
    118  * Remove a header from the response
    119  */
    120 #define _MHD_remove_header(presponse, phdr) do { \
    121   mhd_assert (NULL != presponse->first_header); \
    122   mhd_assert (NULL != presponse->last_header);  \
    123   if (NULL == phdr->prev) \
    124   { \
    125     mhd_assert (phdr == presponse->first_header); \
    126     presponse->first_header = phdr->next; \
    127   } \
    128   else \
    129   { \
    130     mhd_assert (phdr != presponse->first_header); \
    131     mhd_assert (phdr == phdr->prev->next); \
    132     phdr->prev->next = phdr->next; \
    133   } \
    134   if (NULL == phdr->next) \
    135   { \
    136     mhd_assert (phdr == presponse->last_header); \
    137     presponse->last_header = phdr->prev; \
    138   } \
    139   else \
    140   { \
    141     mhd_assert (phdr != presponse->last_header); \
    142     mhd_assert (phdr == phdr->next->prev); \
    143     phdr->next->prev = phdr->prev; \
    144   } \
    145 } while (0)
    146 
    147 /**
    148  * Add preallocated strings a header or footer line to the response without
    149  * checking.
    150  *
    151  * Header/footer strings are not checked and assumed to be correct.
    152  *
    153  * The string must not be statically allocated!
    154  * The strings must be malloc()'ed and zero terminated. The strings will
    155  * be free()'ed when the response is destroyed.
    156  *
    157  * @param response response to add a header to
    158  * @param kind header or footer
    159  * @param header the header string to add, must be malloc()'ed and
    160  *               zero-terminated
    161  * @param header_len the length of the @a header
    162  * @param content the value string to add, must be malloc()'ed and
    163  *                zero-terminated
    164  * @param content_len the length of the @a content
    165  */
    166 bool
    167 MHD_add_response_entry_no_alloc_ (struct MHD_Response *response,
    168                                   enum MHD_ValueKind kind,
    169                                   char *header,
    170                                   size_t header_len,
    171                                   char *content,
    172                                   size_t content_len)
    173 {
    174   struct MHD_HTTP_Res_Header *hdr;
    175 
    176   mhd_assert (0 != header_len);
    177   mhd_assert (0 != content_len);
    178   if (NULL == (hdr = MHD_calloc_ (1, sizeof (struct MHD_HTTP_Res_Header))))
    179     return false;
    180 
    181   hdr->header = header;
    182   hdr->header_size = header_len;
    183   hdr->value = content;
    184   hdr->value_size = content_len;
    185   hdr->kind = kind;
    186   _MHD_insert_header_last (response, hdr);
    187 
    188   return true; /* Success exit point */
    189 }
    190 
    191 
    192 /**
    193  * Add a header or footer line to the response without checking.
    194  *
    195  * It is assumed that parameters are correct.
    196  *
    197  * @param response response to add a header to
    198  * @param kind header or footer
    199  * @param header the header to add, does not need to be zero-terminated
    200  * @param header_len the length of the @a header
    201  * @param content value to add, does not need to be zero-terminated
    202  * @param content_len the length of the @a content
    203  * @return false on error (like out-of-memory),
    204  *         true if succeed
    205  */
    206 bool
    207 MHD_add_response_entry_no_check_ (struct MHD_Response *response,
    208                                   enum MHD_ValueKind kind,
    209                                   const char *header,
    210                                   size_t header_len,
    211                                   const char *content,
    212                                   size_t content_len)
    213 {
    214   char *header_malloced;
    215   char *value_malloced;
    216 
    217   mhd_assert (0 != header_len);
    218   mhd_assert (0 != content_len);
    219   header_malloced = malloc (header_len + 1);
    220   if (NULL == header_malloced)
    221     return false;
    222 
    223   memcpy (header_malloced, header, header_len);
    224   header_malloced[header_len] = 0;
    225 
    226   value_malloced = malloc (content_len + 1);
    227   if (NULL != value_malloced)
    228   {
    229     memcpy (value_malloced, content, content_len);
    230     value_malloced[content_len] = 0;
    231 
    232     if (MHD_add_response_entry_no_alloc_ (response, kind,
    233                                           header_malloced, header_len,
    234                                           value_malloced, content_len))
    235       return true; /* Success exit point */
    236 
    237     free (value_malloced);
    238   }
    239   free (header_malloced);
    240 
    241   return false; /* Failure exit point */
    242 }
    243 
    244 
    245 /**
    246  * Add a header or footer line to the response.
    247  *
    248  * @param header the header to add, does not need to be zero-terminated
    249  * @param header_len the length of the @a header
    250  * @param content value to add, does not need to be zero-terminated
    251  * @param content_len the length of the @a content
    252  * @return false on error (out-of-memory, invalid header or content),
    253  *         true if succeed
    254  */
    255 static bool
    256 add_response_entry_n (struct MHD_Response *response,
    257                       enum MHD_ValueKind kind,
    258                       const char *header,
    259                       size_t header_len,
    260                       const char *content,
    261                       size_t content_len)
    262 {
    263   if (NULL == response)
    264     return false;
    265   if (0 == header_len)
    266     return false;
    267   if (0 == content_len)
    268     return false;
    269   if (NULL != memchr (header, '\t', header_len))
    270     return false;
    271   if (NULL != memchr (header, ' ', header_len))
    272     return false;
    273   if (NULL != memchr (header, '\r', header_len))
    274     return false;
    275   if (NULL != memchr (header, '\n', header_len))
    276     return false;
    277   if (NULL != memchr (content, '\r', content_len))
    278     return false;
    279   if (NULL != memchr (content, '\n', content_len))
    280     return false;
    281 
    282   return MHD_add_response_entry_no_check_ (response, kind, header, header_len,
    283                                            content, content_len);
    284 }
    285 
    286 
    287 /**
    288  * Add a header or footer line to the response.
    289  *
    290  * @param response response to add a header to
    291  * @param kind header or footer
    292  * @param header the header to add
    293  * @param content value to add
    294  * @return #MHD_NO on error (i.e. invalid header or content format).
    295  */
    296 static enum MHD_Result
    297 add_response_entry (struct MHD_Response *response,
    298                     enum MHD_ValueKind kind,
    299                     const char *header,
    300                     const char *content)
    301 {
    302   size_t header_len;
    303   size_t content_len;
    304 
    305   if (NULL == content)
    306     return MHD_NO;
    307 
    308   header_len = strlen (header);
    309   content_len = strlen (content);
    310   return add_response_entry_n (response, kind, header,
    311                                header_len, content,
    312                                content_len) ? MHD_YES : MHD_NO;
    313 }
    314 
    315 
    316 /**
    317  * Add "Connection:" header to the response with special processing.
    318  *
    319  * "Connection:" header value will be combined with any existing "Connection:"
    320  * header, "close" token (if any) will be de-duplicated and moved to the first
    321  * position.
    322  *
    323  * @param response the response to add a header to
    324  * @param value the value to add
    325  * @return #MHD_NO on error (no memory).
    326  */
    327 static enum MHD_Result
    328 add_response_header_connection (struct MHD_Response *response,
    329                                 const char *value)
    330 {
    331   static const char *key = MHD_HTTP_HEADER_CONNECTION;
    332   /** the length of the "Connection" key */
    333   static const size_t key_len =
    334     MHD_STATICSTR_LEN_ (MHD_HTTP_HEADER_CONNECTION);
    335   size_t value_len; /**< the length of the @a value */
    336   size_t old_value_len; /**< the length of the existing "Connection" value */
    337   size_t buf_size;  /**< the size of the buffer */
    338   size_t norm_len;  /**< the length of the normalised value */
    339   char *buf;        /**< the temporal buffer */
    340   struct MHD_HTTP_Res_Header *hdr; /**< existing "Connection" header */
    341   bool value_has_close; /**< the @a value has "close" token */
    342   bool already_has_close; /**< existing "Connection" header has "close" token */
    343   size_t pos = 0;   /**< position of addition in the @a buf */
    344 
    345   if ( (NULL != strchr (value, '\r')) ||
    346        (NULL != strchr (value, '\n')) )
    347     return MHD_NO;
    348 
    349   if (0 != (response->flags_auto & MHD_RAF_HAS_CONNECTION_HDR))
    350   {
    351     hdr = MHD_get_response_element_n_ (response, MHD_HEADER_KIND,
    352                                        key, key_len);
    353     already_has_close =
    354       (0 != (response->flags_auto & MHD_RAF_HAS_CONNECTION_CLOSE));
    355     mhd_assert (already_has_close == (0 == memcmp (hdr->value, "close", 5)));
    356     mhd_assert (NULL != hdr);
    357   }
    358   else
    359   {
    360     hdr = NULL;
    361     already_has_close = false;
    362     mhd_assert (NULL == MHD_get_response_element_n_ (response,
    363                                                      MHD_HEADER_KIND,
    364                                                      key, key_len));
    365     mhd_assert (0 == (response->flags_auto & MHD_RAF_HAS_CONNECTION_CLOSE));
    366   }
    367   if (NULL != hdr)
    368     old_value_len = hdr->value_size + 2; /* additional size for ", " */
    369   else
    370     old_value_len = 0;
    371 
    372   value_len = strlen (value);
    373   if (value_len >= SSIZE_MAX)
    374     return MHD_NO;
    375   /* Additional space for normalisation and zero-termination */
    376   norm_len = value_len + value_len / 2 + 1;
    377   if (norm_len >= SSIZE_MAX)
    378     return MHD_NO;
    379   buf_size = old_value_len + (size_t) norm_len;
    380 
    381   buf = malloc (buf_size);
    382   if (NULL == buf)
    383     return MHD_NO;
    384   if (1)
    385   { /* local scope */
    386     ssize_t norm_len_s = (ssize_t) norm_len;
    387     /* Remove "close" token (if any), it will be moved to the front */
    388     value_has_close = MHD_str_remove_token_caseless_ (value, value_len, "close",
    389                                                       MHD_STATICSTR_LEN_ ( \
    390                                                         "close"),
    391                                                       buf + old_value_len,
    392                                                       &norm_len_s);
    393     mhd_assert (0 <= norm_len_s);
    394     if (0 > norm_len_s)
    395     {
    396       /* Must never happen with realistic sizes */
    397       free (buf);
    398       return MHD_NO;
    399     }
    400     else
    401       norm_len = (size_t) norm_len_s;
    402   }
    403 #ifdef UPGRADE_SUPPORT
    404   if ( (NULL != response->upgrade_handler) && value_has_close)
    405   { /* The "close" token cannot be used with connection "upgrade" */
    406     free (buf);
    407     return MHD_NO;
    408   }
    409 #endif /* UPGRADE_SUPPORT */
    410   if (0 != norm_len)
    411     MHD_str_remove_tokens_caseless_ (buf + old_value_len, &norm_len,
    412                                      "keep-alive",
    413                                      MHD_STATICSTR_LEN_ ("keep-alive"));
    414   if (0 == norm_len)
    415   { /* New value is empty after normalisation */
    416     if (! value_has_close)
    417     { /* The new value had no tokens */
    418       free (buf);
    419       return MHD_NO;
    420     }
    421     if (already_has_close)
    422     { /* The "close" token is already present, nothing to modify */
    423       free (buf);
    424       return MHD_YES;
    425     }
    426   }
    427   /* Add "close" token if required */
    428   if (value_has_close && ! already_has_close)
    429   {
    430     /* Need to insert "close" token at the first position */
    431     mhd_assert (buf_size >= old_value_len + norm_len   \
    432                 + MHD_STATICSTR_LEN_ ("close, ") + 1);
    433     if (0 != norm_len)
    434       memmove (buf + MHD_STATICSTR_LEN_ ("close, ") + old_value_len,
    435                buf + old_value_len, norm_len + 1);
    436     memcpy (buf, "close", MHD_STATICSTR_LEN_ ("close"));
    437     pos += MHD_STATICSTR_LEN_ ("close");
    438   }
    439   /* Add old value tokens (if any) */
    440   if (0 != old_value_len)
    441   {
    442     if (0 != pos)
    443     {
    444       buf[pos++] = ',';
    445       buf[pos++] = ' ';
    446     }
    447     memcpy (buf + pos, hdr->value,
    448             hdr->value_size);
    449     pos += hdr->value_size;
    450   }
    451   /* Add new value token (if any) */
    452   if (0 != norm_len)
    453   {
    454     if (0 != pos)
    455     {
    456       buf[pos++] = ',';
    457       buf[pos++] = ' ';
    458     }
    459     /* The new value tokens must be already at the correct position */
    460     mhd_assert ((value_has_close && ! already_has_close) ? \
    461                 (MHD_STATICSTR_LEN_ ("close, ") + old_value_len == pos) : \
    462                 (old_value_len == pos));
    463     pos += norm_len;
    464   }
    465   mhd_assert (buf_size > pos);
    466   buf[pos] = 0; /* Null terminate the result */
    467 
    468   if (NULL == hdr)
    469   {
    470     struct MHD_HTTP_Res_Header *new_hdr; /**< new "Connection" header */
    471     /* Create new response header entry */
    472     new_hdr = MHD_calloc_ (1, sizeof (struct MHD_HTTP_Res_Header));
    473     if (NULL != new_hdr)
    474     {
    475       new_hdr->header = malloc (key_len + 1);
    476       if (NULL != new_hdr->header)
    477       {
    478         memcpy (new_hdr->header, key, key_len + 1);
    479         new_hdr->header_size = key_len;
    480         new_hdr->value = buf;
    481         new_hdr->value_size = pos;
    482         new_hdr->kind = MHD_HEADER_KIND;
    483         if (value_has_close)
    484           response->flags_auto = (MHD_RAF_HAS_CONNECTION_HDR
    485                                   | MHD_RAF_HAS_CONNECTION_CLOSE);
    486         else
    487           response->flags_auto = MHD_RAF_HAS_CONNECTION_HDR;
    488         _MHD_insert_header_first (response, new_hdr);
    489         return MHD_YES;
    490       }
    491       free (new_hdr);
    492     }
    493     free (buf);
    494     return MHD_NO;
    495   }
    496 
    497   /* Update existing header entry */
    498   free (hdr->value);
    499   hdr->value = buf;
    500   hdr->value_size = pos;
    501   if (value_has_close && ! already_has_close)
    502     response->flags_auto |= MHD_RAF_HAS_CONNECTION_CLOSE;
    503   return MHD_YES;
    504 }
    505 
    506 
    507 /**
    508  * Remove tokens from "Connection:" header of the response.
    509  *
    510  * Provided tokens will be removed from "Connection:" header value.
    511  *
    512  * @param response the response to manipulate "Connection:" header
    513  * @param value the tokens to remove
    514  * @return #MHD_NO on error (no headers or tokens found).
    515  */
    516 static enum MHD_Result
    517 del_response_header_connection (struct MHD_Response *response,
    518                                 const char *value)
    519 {
    520   struct MHD_HTTP_Res_Header *hdr; /**< existing "Connection" header */
    521 
    522   hdr = MHD_get_response_element_n_ (response, MHD_HEADER_KIND,
    523                                      MHD_HTTP_HEADER_CONNECTION,
    524                                      MHD_STATICSTR_LEN_ ( \
    525                                        MHD_HTTP_HEADER_CONNECTION));
    526   if (NULL == hdr)
    527     return MHD_NO;
    528 
    529   if (! MHD_str_remove_tokens_caseless_ (hdr->value, &hdr->value_size, value,
    530                                          strlen (value)))
    531     return MHD_NO;
    532   if (0 == hdr->value_size)
    533   {
    534     _MHD_remove_header (response, hdr);
    535     free (hdr->value);
    536     free (hdr->header);
    537     free (hdr);
    538     response->flags_auto &=
    539       ~((enum MHD_ResponseAutoFlags) MHD_RAF_HAS_CONNECTION_HDR
    540         | (enum MHD_ResponseAutoFlags) MHD_RAF_HAS_CONNECTION_CLOSE);
    541   }
    542   else
    543   {
    544     hdr->value[hdr->value_size] = 0; /* Null-terminate the result */
    545     if (0 != (response->flags_auto
    546               & ~((enum MHD_ResponseAutoFlags) MHD_RAF_HAS_CONNECTION_CLOSE)))
    547     {
    548       if (MHD_STATICSTR_LEN_ ("close") == hdr->value_size)
    549       {
    550         if (0 != memcmp (hdr->value, "close", MHD_STATICSTR_LEN_ ("close")))
    551           response->flags_auto &=
    552             ~((enum MHD_ResponseAutoFlags) MHD_RAF_HAS_CONNECTION_CLOSE);
    553       }
    554       else if (MHD_STATICSTR_LEN_ ("close, ") < hdr->value_size)
    555       {
    556         if (0 != memcmp (hdr->value, "close, ",
    557                          MHD_STATICSTR_LEN_ ("close, ")))
    558           response->flags_auto &=
    559             ~((enum MHD_ResponseAutoFlags) MHD_RAF_HAS_CONNECTION_CLOSE);
    560       }
    561       else
    562         response->flags_auto &=
    563           ~((enum MHD_ResponseAutoFlags) MHD_RAF_HAS_CONNECTION_CLOSE);
    564     }
    565   }
    566   return MHD_YES;
    567 }
    568 
    569 
    570 /**
    571  * Add a header line to the response.
    572  *
    573  * When reply is generated with queued response, some headers are generated
    574  * automatically. Automatically generated headers are only sent to the client,
    575  * but not added back to the response object.
    576  *
    577  * The list of automatic headers:
    578  * + "Date" header is added automatically unless already set by
    579  *   this function
    580  *   @see #MHD_USE_SUPPRESS_DATE_NO_CLOCK
    581  * + "Content-Length" is added automatically when required, attempt to set
    582  *   it manually by this function is ignored.
    583  *   @see #MHD_RF_INSANITY_HEADER_CONTENT_LENGTH
    584  * + "Transfer-Encoding" with value "chunked" is added automatically,
    585  *   when chunked transfer encoding is used automatically. Same header with
    586  *   the same value can be set manually by this function to enforce chunked
    587  *   encoding, however for HTTP/1.0 clients chunked encoding will not be used
    588  *   and manually set "Transfer-Encoding" header is automatically removed
    589  *   for HTTP/1.0 clients
    590  * + "Connection" may be added automatically with value "Keep-Alive" (only
    591  *   for HTTP/1.0 clients) or "Close". The header "Connection" with value
    592  *   "Close" could be set by this function to enforce closure of
    593  *   the connection after sending this response. "Keep-Alive" cannot be
    594  *   enforced and will be removed automatically.
    595  *   @see #MHD_RF_SEND_KEEP_ALIVE_HEADER
    596  *
    597  * Some headers are pre-processed by this function:
    598  * * "Connection" headers are combined into single header entry, value is
    599  *   normilised, "Keep-Alive" tokens are removed.
    600  * * "Transfer-Encoding" header: the only one header is allowed, the only
    601  *   allowed value is "chunked".
    602  * * "Date" header: the only one header is allowed, the second added header
    603  *   replaces the first one.
    604  * * "Content-Length" application-defined header is not allowed.
    605  *   @see #MHD_RF_INSANITY_HEADER_CONTENT_LENGTH
    606  *
    607  * Headers are used in order as they were added.
    608  *
    609  * @param response the response to add a header to
    610  * @param header the header name to add, no need to be static, an internal copy
    611  *               will be created automatically
    612  * @param content the header value to add, no need to be static, an internal
    613  *                copy will be created automatically
    614  * @return #MHD_YES on success,
    615  *         #MHD_NO on error (i.e. invalid header or content format),
    616  *         or out of memory
    617  * @ingroup response
    618  */
    619 _MHD_EXTERN enum MHD_Result
    620 MHD_add_response_header (struct MHD_Response *response,
    621                          const char *header,
    622                          const char *content)
    623 {
    624   if (MHD_str_equal_caseless_ (header, MHD_HTTP_HEADER_CONNECTION))
    625     return add_response_header_connection (response, content);
    626 
    627   if (MHD_str_equal_caseless_ (header,
    628                                MHD_HTTP_HEADER_TRANSFER_ENCODING))
    629   {
    630     if (! MHD_str_equal_caseless_ (content, "chunked"))
    631       return MHD_NO;   /* Only "chunked" encoding is allowed */
    632     if (0 != (response->flags_auto & MHD_RAF_HAS_TRANS_ENC_CHUNKED))
    633       return MHD_YES;  /* Already has "chunked" encoding header */
    634     if ( (0 != (response->flags_auto & MHD_RAF_HAS_CONTENT_LENGTH)) &&
    635          (0 == (MHD_RF_INSANITY_HEADER_CONTENT_LENGTH & response->flags)) )
    636       return MHD_NO; /* Has "Content-Length" header and no "Insanity" flag */
    637     if (MHD_NO != add_response_entry (response,
    638                                       MHD_HEADER_KIND,
    639                                       header,
    640                                       content))
    641     {
    642       response->flags_auto |= MHD_RAF_HAS_TRANS_ENC_CHUNKED;
    643       return MHD_YES;
    644     }
    645     return MHD_NO;
    646   }
    647   if (MHD_str_equal_caseless_ (header,
    648                                MHD_HTTP_HEADER_DATE))
    649   {
    650     if (0 != (response->flags_auto & MHD_RAF_HAS_DATE_HDR))
    651     {
    652       struct MHD_HTTP_Res_Header *hdr;
    653       hdr = MHD_get_response_element_n_ (response, MHD_HEADER_KIND,
    654                                          MHD_HTTP_HEADER_DATE,
    655                                          MHD_STATICSTR_LEN_ ( \
    656                                            MHD_HTTP_HEADER_DATE));
    657       mhd_assert (NULL != hdr);
    658       _MHD_remove_header (response, hdr);
    659       if (NULL != hdr->value)
    660         free (hdr->value);
    661       free (hdr->header);
    662       free (hdr);
    663     }
    664     if (MHD_NO != add_response_entry (response,
    665                                       MHD_HEADER_KIND,
    666                                       header,
    667                                       content))
    668     {
    669       response->flags_auto |= MHD_RAF_HAS_DATE_HDR;
    670       return MHD_YES;
    671     }
    672     return MHD_NO;
    673   }
    674 
    675   if (MHD_str_equal_caseless_ (header,
    676                                MHD_HTTP_HEADER_CONTENT_LENGTH))
    677   {
    678     /* Generally MHD sets automatically correct "Content-Length" always when
    679      * needed.
    680      * Custom "Content-Length" header is allowed only in special cases. */
    681     if ( (0 != (MHD_RF_INSANITY_HEADER_CONTENT_LENGTH & response->flags)) ||
    682          ((0 != (MHD_RF_HEAD_ONLY_RESPONSE & response->flags)) &&
    683           (0 == (response->flags_auto & (MHD_RAF_HAS_TRANS_ENC_CHUNKED
    684                                          | MHD_RAF_HAS_CONTENT_LENGTH)))) )
    685     {
    686       if (MHD_NO != add_response_entry (response,
    687                                         MHD_HEADER_KIND,
    688                                         header,
    689                                         content))
    690       {
    691         response->flags_auto |= MHD_RAF_HAS_CONTENT_LENGTH;
    692         return MHD_YES;
    693       }
    694     }
    695     return MHD_NO;
    696   }
    697 
    698   return add_response_entry (response,
    699                              MHD_HEADER_KIND,
    700                              header,
    701                              content);
    702 }
    703 
    704 
    705 /**
    706  * Add a footer line to the response.
    707  *
    708  * @param response response to remove a header from
    709  * @param footer the footer to delete
    710  * @param content value to delete
    711  * @return #MHD_NO on error (i.e. invalid footer or content format).
    712  * @ingroup response
    713  */
    714 _MHD_EXTERN enum MHD_Result
    715 MHD_add_response_footer (struct MHD_Response *response,
    716                          const char *footer,
    717                          const char *content)
    718 {
    719   return add_response_entry (response,
    720                              MHD_FOOTER_KIND,
    721                              footer,
    722                              content);
    723 }
    724 
    725 
    726 /**
    727  * Delete a header (or footer) line from the response.
    728  *
    729  * For "Connection" headers this function remove all tokens from existing
    730  * value. Successful result means that at least one token has been removed.
    731  * If all tokens are removed from "Connection" header, the empty "Connection"
    732  * header removed.
    733  *
    734  * @param response response to remove a header from
    735  * @param header the header to delete
    736  * @param content value to delete
    737  * @return #MHD_NO on error (no such header known)
    738  * @ingroup response
    739  */
    740 _MHD_EXTERN enum MHD_Result
    741 MHD_del_response_header (struct MHD_Response *response,
    742                          const char *header,
    743                          const char *content)
    744 {
    745   struct MHD_HTTP_Res_Header *pos;
    746   size_t header_len;
    747   size_t content_len;
    748 
    749   if ( (NULL == header) ||
    750        (NULL == content) )
    751     return MHD_NO;
    752   header_len = strlen (header);
    753 
    754   if ((0 != (response->flags_auto & MHD_RAF_HAS_CONNECTION_HDR)) &&
    755       (MHD_STATICSTR_LEN_ (MHD_HTTP_HEADER_CONNECTION) == header_len) &&
    756       MHD_str_equal_caseless_bin_n_ (header, MHD_HTTP_HEADER_CONNECTION,
    757                                      header_len))
    758     return del_response_header_connection (response, content);
    759 
    760   content_len = strlen (content);
    761   pos = response->first_header;
    762   while (NULL != pos)
    763   {
    764     if ((header_len == pos->header_size) &&
    765         (content_len == pos->value_size) &&
    766         (0 == memcmp (header,
    767                       pos->header,
    768                       header_len)) &&
    769         (0 == memcmp (content,
    770                       pos->value,
    771                       content_len)))
    772     {
    773       _MHD_remove_header (response, pos);
    774       free (pos->header);
    775       free (pos->value);
    776       free (pos);
    777       if ( (MHD_STATICSTR_LEN_ (MHD_HTTP_HEADER_TRANSFER_ENCODING) ==
    778             header_len) &&
    779            MHD_str_equal_caseless_bin_n_ (header,
    780                                           MHD_HTTP_HEADER_TRANSFER_ENCODING,
    781                                           header_len) )
    782         response->flags_auto &=
    783           ~((enum MHD_ResponseAutoFlags) MHD_RAF_HAS_TRANS_ENC_CHUNKED);
    784       else if ( (MHD_STATICSTR_LEN_ (MHD_HTTP_HEADER_DATE) ==
    785                  header_len) &&
    786                 MHD_str_equal_caseless_bin_n_ (header,
    787                                                MHD_HTTP_HEADER_DATE,
    788                                                header_len) )
    789         response->flags_auto &=
    790           ~((enum MHD_ResponseAutoFlags) MHD_RAF_HAS_DATE_HDR);
    791       else if ( (MHD_STATICSTR_LEN_ (MHD_HTTP_HEADER_CONTENT_LENGTH) ==
    792                  header_len) &&
    793                 MHD_str_equal_caseless_bin_n_ (header,
    794                                                MHD_HTTP_HEADER_CONTENT_LENGTH,
    795                                                header_len) )
    796       {
    797         if (NULL == MHD_get_response_element_n_ (response,
    798                                                  MHD_HEADER_KIND,
    799                                                  MHD_HTTP_HEADER_CONTENT_LENGTH,
    800                                                  header_len))
    801           response->flags_auto &=
    802             ~((enum MHD_ResponseAutoFlags) MHD_RAF_HAS_CONTENT_LENGTH);
    803       }
    804       return MHD_YES;
    805     }
    806     pos = pos->next;
    807   }
    808   return MHD_NO;
    809 }
    810 
    811 
    812 /**
    813  * Get all of the headers (and footers) added to a response.
    814  *
    815  * @param response response to query
    816  * @param iterator callback to call on each header;
    817  *        maybe NULL (then just count headers)
    818  * @param iterator_cls extra argument to @a iterator
    819  * @return number of entries iterated over
    820  * @ingroup response
    821  */
    822 _MHD_EXTERN int
    823 MHD_get_response_headers (struct MHD_Response *response,
    824                           MHD_KeyValueIterator iterator,
    825                           void *iterator_cls)
    826 {
    827   int numHeaders = 0;
    828   struct MHD_HTTP_Res_Header *pos;
    829 
    830   for (pos = response->first_header;
    831        NULL != pos;
    832        pos = pos->next)
    833   {
    834     numHeaders++;
    835     if ((NULL != iterator) &&
    836         (MHD_NO == iterator (iterator_cls,
    837                              pos->kind,
    838                              pos->header,
    839                              pos->value)))
    840       break;
    841   }
    842   return numHeaders;
    843 }
    844 
    845 
    846 /**
    847  * Get a particular header (or footer) from the response.
    848  *
    849  * @param response response to query
    850  * @param key which header to get
    851  * @return NULL if header does not exist
    852  * @ingroup response
    853  */
    854 _MHD_EXTERN const char *
    855 MHD_get_response_header (struct MHD_Response *response,
    856                          const char *key)
    857 {
    858   struct MHD_HTTP_Res_Header *pos;
    859   size_t key_size;
    860 
    861   if (NULL == key)
    862     return NULL;
    863 
    864   key_size = strlen (key);
    865   for (pos = response->first_header;
    866        NULL != pos;
    867        pos = pos->next)
    868   {
    869     if ((pos->header_size == key_size) &&
    870         (MHD_str_equal_caseless_bin_n_ (pos->header, key, pos->header_size)))
    871       return pos->value;
    872   }
    873   return NULL;
    874 }
    875 
    876 
    877 /**
    878  * Get a particular header (or footer) element from the response.
    879  *
    880  * Function returns the first found element.
    881  * @param response response to query
    882  * @param kind the kind of element: header or footer
    883  * @param key the key which header to get
    884  * @param key_len the length of the @a key
    885  * @return NULL if header element does not exist
    886  * @ingroup response
    887  */
    888 struct MHD_HTTP_Res_Header *
    889 MHD_get_response_element_n_ (struct MHD_Response *response,
    890                              enum MHD_ValueKind kind,
    891                              const char *key,
    892                              size_t key_len)
    893 {
    894   struct MHD_HTTP_Res_Header *pos;
    895 
    896   mhd_assert (NULL != key);
    897   mhd_assert (0 != key[0]);
    898   mhd_assert (0 != key_len);
    899 
    900   for (pos = response->first_header;
    901        NULL != pos;
    902        pos = pos->next)
    903   {
    904     if ((pos->header_size == key_len) &&
    905         (kind == pos->kind) &&
    906         (MHD_str_equal_caseless_bin_n_ (pos->header, key, pos->header_size)))
    907       return pos;
    908   }
    909   return NULL;
    910 }
    911 
    912 
    913 /**
    914  * Check whether response header contains particular token.
    915  *
    916  * Token could be surrounded by spaces and tabs and delimited by comma.
    917  * Case-insensitive match used for header names and tokens.
    918  *
    919  * @param response  the response to query
    920  * @param key       header name
    921  * @param key_len   the length of @a key, not including optional
    922  *                  terminating null-character.
    923  * @param token     the token to find
    924  * @param token_len the length of @a token, not including optional
    925  *                  terminating null-character.
    926  * @return true if token is found in specified header,
    927  *         false otherwise
    928  */
    929 bool
    930 MHD_check_response_header_token_ci (const struct MHD_Response *response,
    931                                     const char *key,
    932                                     size_t key_len,
    933                                     const char *token,
    934                                     size_t token_len)
    935 {
    936   struct MHD_HTTP_Res_Header *pos;
    937 
    938   if ( (NULL == key) ||
    939        ('\0' == key[0]) ||
    940        (NULL == token) ||
    941        ('\0' == token[0]) )
    942     return false;
    943 
    944   /* Token must not contain binary zero! */
    945   mhd_assert (strlen (token) == token_len);
    946 
    947   for (pos = response->first_header;
    948        NULL != pos;
    949        pos = pos->next)
    950   {
    951     if ( (pos->kind == MHD_HEADER_KIND) &&
    952          (key_len == pos->header_size) &&
    953          MHD_str_equal_caseless_bin_n_ (pos->header,
    954                                         key,
    955                                         key_len) &&
    956          MHD_str_has_token_caseless_ (pos->value,
    957                                       token,
    958                                       token_len) )
    959       return true;
    960   }
    961   return false;
    962 }
    963 
    964 
    965 /**
    966  * Create a response object.
    967  * The response object can be extended with header information and then be used
    968  * any number of times.
    969  *
    970  * If response object is used to answer HEAD request then the body of the
    971  * response is not used, while all headers (including automatic headers) are
    972  * used.
    973  *
    974  * @param size size of the data portion of the response, #MHD_SIZE_UNKNOWN for unknown
    975  * @param block_size preferred block size for querying crc (advisory only,
    976  *                   MHD may still call @a crc using smaller chunks); this
    977  *                   is essentially the buffer size used for IO, clients
    978  *                   should pick a value that is appropriate for IO and
    979  *                   memory performance requirements
    980  * @param crc callback to use to obtain response data
    981  * @param crc_cls extra argument to @a crc
    982  * @param crfc callback to call to free @a crc_cls resources
    983  * @return NULL on error (i.e. invalid arguments, out of memory)
    984  * @ingroup response
    985  */
    986 _MHD_EXTERN struct MHD_Response *
    987 MHD_create_response_from_callback (uint64_t size,
    988                                    size_t block_size,
    989                                    MHD_ContentReaderCallback crc,
    990                                    void *crc_cls,
    991                                    MHD_ContentReaderFreeCallback crfc)
    992 {
    993   struct MHD_Response *response;
    994 
    995   if ((NULL == crc) || (0 == block_size))
    996     return NULL;
    997   if (NULL == (response = MHD_calloc_ (1, sizeof (struct MHD_Response)
    998                                        + block_size)))
    999     return NULL;
   1000   response->fd = -1;
   1001   response->data = (void *) &response[1];
   1002   response->data_buffer_size = block_size;
   1003 #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS)
   1004   if (! MHD_mutex_init_ (&response->mutex))
   1005   {
   1006     free (response);
   1007     return NULL;
   1008   }
   1009 #endif
   1010   response->crc = crc;
   1011   response->crfc = crfc;
   1012   response->crc_cls = crc_cls;
   1013   response->reference_count = 1;
   1014   response->total_size = size;
   1015   return response;
   1016 }
   1017 
   1018 
   1019 /**
   1020  * Set special flags and options for a response.
   1021  *
   1022  * @param response the response to modify
   1023  * @param flags to set for the response
   1024  * @param ... #MHD_RO_END terminated list of options
   1025  * @return #MHD_YES on success, #MHD_NO on error
   1026  */
   1027 _MHD_EXTERN enum MHD_Result
   1028 MHD_set_response_options (struct MHD_Response *response,
   1029                           enum MHD_ResponseFlags flags,
   1030                           ...)
   1031 {
   1032   va_list ap;
   1033   enum MHD_Result ret;
   1034   enum MHD_ResponseOptions ro;
   1035 
   1036   if (0 != (response->flags_auto & MHD_RAF_HAS_CONTENT_LENGTH))
   1037   { /* Response has custom "Content-Lengh" header */
   1038     if ( (0 != (response->flags & MHD_RF_INSANITY_HEADER_CONTENT_LENGTH)) &&
   1039          (0 == (flags & MHD_RF_INSANITY_HEADER_CONTENT_LENGTH)))
   1040     { /* Request to remove MHD_RF_INSANITY_HEADER_CONTENT_LENGTH flag */
   1041       return MHD_NO;
   1042     }
   1043     if ( (0 != (response->flags & MHD_RF_HEAD_ONLY_RESPONSE)) &&
   1044          (0 == (flags & MHD_RF_HEAD_ONLY_RESPONSE)))
   1045     { /* Request to remove MHD_RF_HEAD_ONLY_RESPONSE flag */
   1046       if (0 == (flags & MHD_RF_INSANITY_HEADER_CONTENT_LENGTH))
   1047         return MHD_NO;
   1048     }
   1049   }
   1050 
   1051   if ( (0 != (flags & MHD_RF_HEAD_ONLY_RESPONSE)) &&
   1052        (0 != response->total_size) )
   1053     return MHD_NO;
   1054 
   1055   ret = MHD_YES;
   1056   response->flags = flags;
   1057 
   1058   va_start (ap, flags);
   1059   while (MHD_RO_END != (ro = va_arg (ap, enum MHD_ResponseOptions)))
   1060   {
   1061     switch (ro)
   1062     {
   1063     case MHD_RO_END: /* Not possible */
   1064       break;
   1065     default:
   1066       ret = MHD_NO;
   1067       break;
   1068     }
   1069   }
   1070   va_end (ap);
   1071   return ret;
   1072 }
   1073 
   1074 
   1075 /**
   1076  * Given a file descriptor, read data from the file
   1077  * to generate the response.
   1078  *
   1079  * @param cls pointer to the response
   1080  * @param pos offset in the file to access
   1081  * @param buf where to write the data
   1082  * @param max number of bytes to write at most
   1083  * @return number of bytes written
   1084  */
   1085 static ssize_t
   1086 file_reader (void *cls,
   1087              uint64_t pos,
   1088              char *buf,
   1089              size_t max)
   1090 {
   1091   struct MHD_Response *response = cls;
   1092 #if ! defined(_WIN32) || defined(__CYGWIN__)
   1093   ssize_t n;
   1094 #else  /* _WIN32 && !__CYGWIN__ */
   1095   const HANDLE fh = (HANDLE) (uintptr_t) _get_osfhandle (response->fd);
   1096 #endif /* _WIN32 && !__CYGWIN__ */
   1097   const int64_t offset64 = (int64_t) (pos + response->fd_off);
   1098 
   1099   if (offset64 < 0)
   1100     return MHD_CONTENT_READER_END_WITH_ERROR; /* seek to required position is not possible */
   1101 
   1102 #if ! defined(_WIN32) || defined(__CYGWIN__)
   1103   if (max > SSIZE_MAX)
   1104     max = SSIZE_MAX; /* Clamp to maximum return value. */
   1105 
   1106 #if defined(HAVE_PREAD64)
   1107   n = pread64 (response->fd, buf, max, offset64);
   1108 #elif defined(HAVE_PREAD)
   1109   if ( (sizeof(off_t) < sizeof (uint64_t)) &&
   1110        (offset64 > (uint64_t) INT32_MAX) )
   1111     return MHD_CONTENT_READER_END_WITH_ERROR; /* Read at required position is not possible. */
   1112 
   1113   n = pread (response->fd, buf, max, (off_t) offset64);
   1114 #else  /* ! HAVE_PREAD */
   1115 #if defined(HAVE_LSEEK64)
   1116   if (lseek64 (response->fd,
   1117                offset64,
   1118                SEEK_SET) != offset64)
   1119     return MHD_CONTENT_READER_END_WITH_ERROR; /* can't seek to required position */
   1120 #else  /* ! HAVE_LSEEK64 */
   1121   if ( (sizeof(off_t) < sizeof (uint64_t)) &&
   1122        (offset64 > (uint64_t) INT32_MAX) )
   1123     return MHD_CONTENT_READER_END_WITH_ERROR; /* seek to required position is not possible */
   1124 
   1125   if (lseek (response->fd,
   1126              (off_t) offset64,
   1127              SEEK_SET) != (off_t) offset64)
   1128     return MHD_CONTENT_READER_END_WITH_ERROR; /* can't seek to required position */
   1129 #endif /* ! HAVE_LSEEK64 */
   1130   n = read (response->fd,
   1131             buf,
   1132             max);
   1133 
   1134 #endif /* ! HAVE_PREAD */
   1135   if (0 == n)
   1136     return MHD_CONTENT_READER_END_OF_STREAM;
   1137   if (n < 0)
   1138     return MHD_CONTENT_READER_END_WITH_ERROR;
   1139   return n;
   1140 #else /* _WIN32 && !__CYGWIN__ */
   1141   if (INVALID_HANDLE_VALUE == fh)
   1142     return MHD_CONTENT_READER_END_WITH_ERROR; /* Value of 'response->fd' is not valid. */
   1143   else
   1144   {
   1145     OVERLAPPED f_ol = {0, 0, {{0, 0}}, 0};   /* Initialize to zero. */
   1146     ULARGE_INTEGER pos_uli;
   1147     DWORD toRead = (max > INT32_MAX) ? INT32_MAX : (DWORD) max;
   1148     DWORD resRead;
   1149 
   1150     pos_uli.QuadPart = (uint64_t) offset64;   /* Simple transformation 64bit -> 2x32bit. */
   1151     f_ol.Offset = pos_uli.LowPart;
   1152     f_ol.OffsetHigh = pos_uli.HighPart;
   1153     if (! ReadFile (fh, (void *) buf, toRead, &resRead, &f_ol))
   1154       return MHD_CONTENT_READER_END_WITH_ERROR;   /* Read error. */
   1155     if (0 == resRead)
   1156       return MHD_CONTENT_READER_END_OF_STREAM;
   1157     return (ssize_t) resRead;
   1158   }
   1159 #endif /* _WIN32 && !__CYGWIN__ */
   1160 }
   1161 
   1162 
   1163 /**
   1164  * Given a pipe descriptor, read data from the pipe
   1165  * to generate the response.
   1166  *
   1167  * @param cls pointer to the response
   1168  * @param pos offset in the pipe to access (ignored)
   1169  * @param buf where to write the data
   1170  * @param max number of bytes to write at most
   1171  * @return number of bytes written
   1172  */
   1173 static ssize_t
   1174 pipe_reader (void *cls,
   1175              uint64_t pos,
   1176              char *buf,
   1177              size_t max)
   1178 {
   1179   struct MHD_Response *response = cls;
   1180   ssize_t n;
   1181 
   1182   (void) pos;
   1183 
   1184 #ifndef _WIN32
   1185   if (SSIZE_MAX < max)
   1186     max = SSIZE_MAX;
   1187   n = read (response->fd,
   1188             buf,
   1189             (MHD_SCKT_SEND_SIZE_) max);
   1190 #else  /* _WIN32 */
   1191   if (UINT_MAX < max)
   1192     max = INT_MAX;
   1193   n = read (response->fd,
   1194             buf,
   1195             (unsigned int) max);
   1196 #endif /* _WIN32 */
   1197 
   1198   if (0 == n)
   1199     return MHD_CONTENT_READER_END_OF_STREAM;
   1200   if (n < 0)
   1201     return MHD_CONTENT_READER_END_WITH_ERROR;
   1202   return n;
   1203 }
   1204 
   1205 
   1206 /**
   1207  * Destroy file reader context.  Closes the file
   1208  * descriptor.
   1209  *
   1210  * @param cls pointer to file descriptor
   1211  */
   1212 static void
   1213 free_callback (void *cls)
   1214 {
   1215   struct MHD_Response *response = cls;
   1216 
   1217   (void) close (response->fd);
   1218   response->fd = -1;
   1219 }
   1220 
   1221 
   1222 #undef MHD_create_response_from_fd_at_offset
   1223 
   1224 /**
   1225  * Create a response object with the content of provided file with
   1226  * specified offset used as the response body.
   1227  *
   1228  * The response object can be extended with header information and then
   1229  * be used any number of times.
   1230  *
   1231  * If response object is used to answer HEAD request then the body
   1232  * of the response is not used, while all headers (including automatic
   1233  * headers) are used.
   1234  *
   1235  * @param size size of the data portion of the response
   1236  * @param fd file descriptor referring to a file on disk with the
   1237  *        data; will be closed when response is destroyed;
   1238  *        fd should be in 'blocking' mode
   1239  * @param offset offset to start reading from in the file;
   1240  *        Be careful! `off_t` may have been compiled to be a
   1241  *        64-bit variable for MHD, in which case your application
   1242  *        also has to be compiled using the same options! Read
   1243  *        the MHD manual for more details.
   1244  * @return NULL on error (i.e. invalid arguments, out of memory)
   1245  * @ingroup response
   1246  */
   1247 _MHD_EXTERN struct MHD_Response *
   1248 MHD_create_response_from_fd_at_offset (size_t size,
   1249                                        int fd,
   1250                                        off_t offset)
   1251 {
   1252   if (0 > offset)
   1253     return NULL;
   1254   return MHD_create_response_from_fd_at_offset64 (size,
   1255                                                   fd,
   1256                                                   (uint64_t) offset);
   1257 }
   1258 
   1259 
   1260 /**
   1261  * Create a response object with the content of provided file with
   1262  * specified offset used as the response body.
   1263  *
   1264  * The response object can be extended with header information and then
   1265  * be used any number of times.
   1266  *
   1267  * If response object is used to answer HEAD request then the body
   1268  * of the response is not used, while all headers (including automatic
   1269  * headers) are used.
   1270  *
   1271  * @param size size of the data portion of the response;
   1272  *        sizes larger than 2 GiB may be not supported by OS or
   1273  *        MHD build; see ::MHD_FEATURE_LARGE_FILE
   1274  * @param fd file descriptor referring to a file on disk with the
   1275  *        data; will be closed when response is destroyed;
   1276  *        fd should be in 'blocking' mode
   1277  * @param offset offset to start reading from in the file;
   1278  *        reading file beyond 2 GiB may be not supported by OS or
   1279  *        MHD build; see ::MHD_FEATURE_LARGE_FILE
   1280  * @return NULL on error (i.e. invalid arguments, out of memory)
   1281  * @ingroup response
   1282  */
   1283 _MHD_EXTERN struct MHD_Response *
   1284 MHD_create_response_from_fd_at_offset64 (uint64_t size,
   1285                                          int fd,
   1286                                          uint64_t offset)
   1287 {
   1288   struct MHD_Response *response;
   1289 
   1290 #if ! defined(HAVE___LSEEKI64) && ! defined(HAVE_LSEEK64)
   1291   if ( (sizeof(uint64_t) > sizeof(off_t)) &&
   1292        ( (size > (uint64_t) INT32_MAX) ||
   1293          (offset > (uint64_t) INT32_MAX) ||
   1294          ((size + offset) >= (uint64_t) INT32_MAX) ) )
   1295     return NULL;
   1296 #endif
   1297   if ( ((int64_t) size < 0) ||
   1298        ((int64_t) offset < 0) ||
   1299        ((int64_t) (size + offset) < 0) )
   1300     return NULL;
   1301 
   1302   response = MHD_create_response_from_callback (size,
   1303                                                 MHD_FILE_READ_BLOCK_SIZE,
   1304                                                 &file_reader,
   1305                                                 NULL,
   1306                                                 &free_callback);
   1307   if (NULL == response)
   1308     return NULL;
   1309   response->fd = fd;
   1310   response->is_pipe = false;
   1311   response->fd_off = offset;
   1312   response->crc_cls = response;
   1313   return response;
   1314 }
   1315 
   1316 
   1317 /**
   1318  * Create a response object with the response body created by reading
   1319  * the provided pipe.
   1320  *
   1321  * The response object can be extended with header information and
   1322  * then be used ONLY ONCE.
   1323  *
   1324  * If response object is used to answer HEAD request then the body
   1325  * of the response is not used, while all headers (including automatic
   1326  * headers) are used.
   1327  *
   1328  * @param fd file descriptor referring to a read-end of a pipe with the
   1329  *        data; will be closed when response is destroyed;
   1330  *        fd should be in 'blocking' mode
   1331  * @return NULL on error (i.e. invalid arguments, out of memory)
   1332  * @ingroup response
   1333  */
   1334 _MHD_EXTERN struct MHD_Response *
   1335 MHD_create_response_from_pipe (int fd)
   1336 {
   1337   struct MHD_Response *response;
   1338 
   1339   response = MHD_create_response_from_callback (MHD_SIZE_UNKNOWN,
   1340                                                 MHD_FILE_READ_BLOCK_SIZE,
   1341                                                 &pipe_reader,
   1342                                                 NULL,
   1343                                                 &free_callback);
   1344   if (NULL == response)
   1345     return NULL;
   1346   response->fd = fd;
   1347   response->is_pipe = true;
   1348   response->crc_cls = response;
   1349   return response;
   1350 }
   1351 
   1352 
   1353 /**
   1354  * Create a response object with the content of provided file used as
   1355  * the response body.
   1356  *
   1357  * The response object can be extended with header information and then
   1358  * be used any number of times.
   1359  *
   1360  * If response object is used to answer HEAD request then the body
   1361  * of the response is not used, while all headers (including automatic
   1362  * headers) are used.
   1363  *
   1364  * @param size size of the data portion of the response
   1365  * @param fd file descriptor referring to a file on disk with the data
   1366  * @return NULL on error (i.e. invalid arguments, out of memory)
   1367  * @ingroup response
   1368  */
   1369 _MHD_EXTERN struct MHD_Response *
   1370 MHD_create_response_from_fd (size_t size,
   1371                              int fd)
   1372 {
   1373   return MHD_create_response_from_fd_at_offset64 (size,
   1374                                                   fd,
   1375                                                   0);
   1376 }
   1377 
   1378 
   1379 /**
   1380  * Create a response object with the content of provided file used as
   1381  * the response body.
   1382  *
   1383  * The response object can be extended with header information and then
   1384  * be used any number of times.
   1385  *
   1386  * If response object is used to answer HEAD request then the body
   1387  * of the response is not used, while all headers (including automatic
   1388  * headers) are used.
   1389  *
   1390  * @param size size of the data portion of the response;
   1391  *        sizes larger than 2 GiB may be not supported by OS or
   1392  *        MHD build; see ::MHD_FEATURE_LARGE_FILE
   1393  * @param fd file descriptor referring to a file on disk with the
   1394  *        data; will be closed when response is destroyed;
   1395  *        fd should be in 'blocking' mode
   1396  * @return NULL on error (i.e. invalid arguments, out of memory)
   1397  * @ingroup response
   1398  */
   1399 _MHD_EXTERN struct MHD_Response *
   1400 MHD_create_response_from_fd64 (uint64_t size,
   1401                                int fd)
   1402 {
   1403   return MHD_create_response_from_fd_at_offset64 (size,
   1404                                                   fd,
   1405                                                   0);
   1406 }
   1407 
   1408 
   1409 /**
   1410  * Create a response object.
   1411  * The response object can be extended with header information and then be used
   1412  * any number of times.
   1413  *
   1414  * If response object is used to answer HEAD request then the body of the
   1415  * response is not used, while all headers (including automatic headers) are
   1416  * used.
   1417  *
   1418  * @param size size of the @a data portion of the response
   1419  * @param data the data itself
   1420  * @param must_free libmicrohttpd should free data when done
   1421  * @param must_copy libmicrohttpd must make a copy of @a data
   1422  *        right away, the data may be released anytime after
   1423  *        this call returns
   1424  * @return NULL on error (i.e. invalid arguments, out of memory)
   1425  * @deprecated use #MHD_create_response_from_buffer instead
   1426  * @ingroup response
   1427  */
   1428 _MHD_EXTERN struct MHD_Response *
   1429 MHD_create_response_from_data (size_t size,
   1430                                void *data,
   1431                                int must_free,
   1432                                int must_copy)
   1433 {
   1434   enum MHD_ResponseMemoryMode mode;
   1435 
   1436   if (0 != must_copy)
   1437     mode = MHD_RESPMEM_MUST_COPY;
   1438   else if (0 != must_free)
   1439     mode = MHD_RESPMEM_MUST_FREE;
   1440   else
   1441     mode = MHD_RESPMEM_PERSISTENT;
   1442 
   1443   return MHD_create_response_from_buffer (size, data, mode);
   1444 }
   1445 
   1446 
   1447 /**
   1448  * Create a response object with the content of provided buffer used as
   1449  * the response body.
   1450  *
   1451  * The response object can be extended with header information and then
   1452  * be used any number of times.
   1453  *
   1454  * If response object is used to answer HEAD request then the body
   1455  * of the response is not used, while all headers (including automatic
   1456  * headers) are used.
   1457  *
   1458  * @param size size of the data portion of the response
   1459  * @param buffer size bytes containing the response's data portion
   1460  * @param mode flags for buffer management
   1461  * @return NULL on error (i.e. invalid arguments, out of memory)
   1462  * @ingroup response
   1463  */
   1464 _MHD_EXTERN struct MHD_Response *
   1465 MHD_create_response_from_buffer (size_t size,
   1466                                  void *buffer,
   1467                                  enum MHD_ResponseMemoryMode mode)
   1468 {
   1469   if (MHD_RESPMEM_MUST_FREE == mode)
   1470     return MHD_create_response_from_buffer_with_free_callback_cls (size,
   1471                                                                    buffer,
   1472                                                                    &free,
   1473                                                                    buffer);
   1474   if (MHD_RESPMEM_MUST_COPY == mode)
   1475     return MHD_create_response_from_buffer_copy (size,
   1476                                                  buffer);
   1477 
   1478   return MHD_create_response_from_buffer_with_free_callback_cls (size,
   1479                                                                  buffer,
   1480                                                                  NULL,
   1481                                                                  NULL);
   1482 }
   1483 
   1484 
   1485 /**
   1486  * Create a response object with the content of provided statically allocated
   1487  * buffer used as the response body.
   1488  *
   1489  * The buffer must be valid for the lifetime of the response. The easiest way
   1490  * to achieve this is to use a statically allocated buffer.
   1491  *
   1492  * The response object can be extended with header information and then
   1493  * be used any number of times.
   1494  *
   1495  * If response object is used to answer HEAD request then the body
   1496  * of the response is not used, while all headers (including automatic
   1497  * headers) are used.
   1498  *
   1499  * @param size the size of the data in @a buffer, can be zero
   1500  * @param buffer the buffer with the data for the response body, can be NULL
   1501  *               if @a size is zero
   1502  * @return NULL on error (i.e. invalid arguments, out of memory)
   1503  * @note Available since #MHD_VERSION 0x00097701
   1504  * @ingroup response
   1505  */
   1506 _MHD_EXTERN struct MHD_Response *
   1507 MHD_create_response_from_buffer_static (size_t size,
   1508                                         const void *buffer)
   1509 {
   1510   return MHD_create_response_from_buffer_with_free_callback_cls (size,
   1511                                                                  buffer,
   1512                                                                  NULL,
   1513                                                                  NULL);
   1514 }
   1515 
   1516 
   1517 /**
   1518  * Create a response object with the content of provided temporal buffer
   1519  * used as the response body.
   1520  *
   1521  * An internal copy of the buffer will be made automatically, so buffer have
   1522  * to be valid only during the call of this function (as a typical example:
   1523  * buffer is a local (non-static) array).
   1524  *
   1525  * The response object can be extended with header information and then
   1526  * be used any number of times.
   1527  *
   1528  * If response object is used to answer HEAD request then the body
   1529  * of the response is not used, while all headers (including automatic
   1530  * headers) are used.
   1531  *
   1532  * @param size the size of the data in @a buffer, can be zero
   1533  * @param buffer the buffer with the data for the response body, can be NULL
   1534  *               if @a size is zero
   1535  * @return NULL on error (i.e. invalid arguments, out of memory)
   1536  * @note Available since #MHD_VERSION 0x00097701
   1537  * @ingroup response
   1538  */
   1539 _MHD_EXTERN struct MHD_Response *
   1540 MHD_create_response_from_buffer_copy (size_t size,
   1541                                       const void *buffer)
   1542 {
   1543   struct MHD_Response *r;
   1544   void *mhd_copy;
   1545 
   1546   if (0 == size)
   1547     return MHD_create_response_from_buffer_with_free_callback_cls (0,
   1548                                                                    NULL,
   1549                                                                    NULL,
   1550                                                                    NULL);
   1551   if (NULL == buffer)
   1552     return NULL;
   1553 
   1554   mhd_copy = malloc (size);
   1555   if (NULL == mhd_copy)
   1556     return NULL;
   1557   memcpy (mhd_copy, buffer, size);
   1558 
   1559   r = MHD_create_response_from_buffer_with_free_callback_cls (size,
   1560                                                               mhd_copy,
   1561                                                               &free,
   1562                                                               mhd_copy);
   1563   if (NULL == r)
   1564     free (mhd_copy);
   1565   else
   1566   {
   1567     /* TODO: remove the next assignment, the buffer should not be modifiable */
   1568     r->data_buffer_size = size;
   1569   }
   1570 
   1571   return r;
   1572 }
   1573 
   1574 
   1575 /**
   1576  * Create a response object with the content of provided buffer used as
   1577  * the response body.
   1578  *
   1579  * The response object can be extended with header information and then
   1580  * be used any number of times.
   1581  *
   1582  * If response object is used to answer HEAD request then the body
   1583  * of the response is not used, while all headers (including automatic
   1584  * headers) are used.
   1585  *
   1586  * @param size size of the data portion of the response
   1587  * @param buffer size bytes containing the response's data portion
   1588  * @param crfc function to call to free the @a buffer
   1589  * @return NULL on error (i.e. invalid arguments, out of memory)
   1590  * @ingroup response
   1591  */
   1592 _MHD_EXTERN struct MHD_Response *
   1593 MHD_create_response_from_buffer_with_free_callback (size_t size,
   1594                                                     void *buffer,
   1595                                                     MHD_ContentReaderFreeCallback
   1596                                                     crfc)
   1597 {
   1598   return MHD_create_response_from_buffer_with_free_callback_cls (size,
   1599                                                                  buffer,
   1600                                                                  crfc,
   1601                                                                  buffer);
   1602 }
   1603 
   1604 
   1605 /**
   1606  * Create a response object with the content of provided buffer used as
   1607  * the response body.
   1608  *
   1609  * The response object can be extended with header information and then
   1610  * be used any number of times.
   1611  *
   1612  * If response object is used to answer HEAD request then the body
   1613  * of the response is not used, while all headers (including automatic
   1614  * headers) are used.
   1615  *
   1616  * @param size size of the data portion of the response
   1617  * @param buffer size bytes containing the response's data portion
   1618  * @param crfc function to call to cleanup, if set to NULL then callback
   1619  *             is not called
   1620  * @param crfc_cls an argument for @a crfc
   1621  * @return NULL on error (i.e. invalid arguments, out of memory)
   1622  * @note Available since #MHD_VERSION 0x00097302
   1623  * @note 'const' qualifier is used for @a buffer since #MHD_VERSION 0x00097701
   1624  * @ingroup response
   1625  */
   1626 _MHD_EXTERN struct MHD_Response *
   1627 MHD_create_response_from_buffer_with_free_callback_cls (size_t size,
   1628                                                         const void *buffer,
   1629                                                         MHD_ContentReaderFreeCallback
   1630                                                         crfc,
   1631                                                         void *crfc_cls)
   1632 {
   1633   struct MHD_Response *r;
   1634 
   1635   if ((NULL == buffer) && (size > 0))
   1636     return NULL;
   1637 #if SIZEOF_SIZE_T >= SIZEOF_UINT64_T
   1638   if (MHD_SIZE_UNKNOWN == size)
   1639     return NULL;
   1640 #endif /* SIZEOF_SIZE_T >= SIZEOF_UINT64_T */
   1641   r = MHD_calloc_ (1, sizeof (struct MHD_Response));
   1642   if (NULL == r)
   1643     return NULL;
   1644 #if defined(MHD_USE_THREADS)
   1645   if (! MHD_mutex_init_ (&r->mutex))
   1646   {
   1647     free (r);
   1648     return NULL;
   1649   }
   1650 #endif
   1651   r->fd = -1;
   1652   r->reference_count = 1;
   1653   r->total_size = size;
   1654   r->data = buffer;
   1655   r->data_size = size;
   1656   r->crfc = crfc;
   1657   r->crc_cls = crfc_cls;
   1658   return r;
   1659 }
   1660 
   1661 
   1662 /**
   1663  * Create a response object with an array of memory buffers
   1664  * used as the response body.
   1665  *
   1666  * The response object can be extended with header information and then
   1667  * be used any number of times.
   1668  *
   1669  * If response object is used to answer HEAD request then the body
   1670  * of the response is not used, while all headers (including automatic
   1671  * headers) are used.
   1672  *
   1673  * @param iov the array for response data buffers, an internal copy of this
   1674  *        will be made
   1675  * @param iovcnt the number of elements in @a iov
   1676  * @param free_cb the callback to clean up any data associated with @a iov when
   1677  *        the response is destroyed.
   1678  * @param cls the argument passed to @a free_cb
   1679  * @return NULL on error (i.e. invalid arguments, out of memory)
   1680  */
   1681 _MHD_EXTERN struct MHD_Response *
   1682 MHD_create_response_from_iovec (const struct MHD_IoVec *iov,
   1683                                 unsigned int iovcnt,
   1684                                 MHD_ContentReaderFreeCallback free_cb,
   1685                                 void *cls)
   1686 {
   1687   struct MHD_Response *response;
   1688   unsigned int i;
   1689   int i_cp = 0;   /**< Index in the copy of iov */
   1690   uint64_t total_size = 0;
   1691   const void *last_valid_buffer = NULL;
   1692 
   1693   if ((NULL == iov) && (0 < iovcnt))
   1694     return NULL;
   1695 
   1696   response = MHD_calloc_ (1, sizeof (struct MHD_Response));
   1697   if (NULL == response)
   1698     return NULL;
   1699   if (! MHD_mutex_init_ (&response->mutex))
   1700   {
   1701     free (response);
   1702     return NULL;
   1703   }
   1704   /* Calculate final size, number of valid elements, and check 'iov' */
   1705   for (i = 0; i < iovcnt; ++i)
   1706   {
   1707     if (0 == iov[i].iov_len)
   1708       continue;     /* skip zero-sized elements */
   1709     if (NULL == iov[i].iov_base)
   1710     {
   1711       i_cp = -1;     /* error */
   1712       break;
   1713     }
   1714     if ( (total_size > (total_size + iov[i].iov_len)) ||
   1715          (INT_MAX == i_cp) ||
   1716          (SSIZE_MAX < (total_size + iov[i].iov_len)) )
   1717     {
   1718       i_cp = -1;     /* overflow */
   1719       break;
   1720     }
   1721     last_valid_buffer = iov[i].iov_base;
   1722     total_size += iov[i].iov_len;
   1723 #if defined(MHD_POSIX_SOCKETS) || ! defined(_WIN64)
   1724     i_cp++;
   1725 #else  /* ! MHD_POSIX_SOCKETS && _WIN64 */
   1726     {
   1727       int64_t i_add;
   1728 
   1729       i_add = (int64_t) (iov[i].iov_len / ULONG_MAX);
   1730       if (0 != iov[i].iov_len % ULONG_MAX)
   1731         i_add++;
   1732       if (INT_MAX < (i_add + i_cp))
   1733       {
   1734         i_cp = -1;   /* overflow */
   1735         break;
   1736       }
   1737       i_cp += (int) i_add;
   1738     }
   1739 #endif /* ! MHD_POSIX_SOCKETS && _WIN64 */
   1740   }
   1741   if (-1 == i_cp)
   1742   {
   1743     /* Some error condition */
   1744     MHD_mutex_destroy_chk_ (&response->mutex);
   1745     free (response);
   1746     return NULL;
   1747   }
   1748   response->fd = -1;
   1749   response->reference_count = 1;
   1750   response->total_size = total_size;
   1751   response->crc_cls = cls;
   1752   response->crfc = free_cb;
   1753   if (0 == i_cp)
   1754   {
   1755     mhd_assert (0 == total_size);
   1756     return response;
   1757   }
   1758   if (1 == i_cp)
   1759   {
   1760     mhd_assert (NULL != last_valid_buffer);
   1761     response->data = last_valid_buffer;
   1762     response->data_size = (size_t) total_size;
   1763     return response;
   1764   }
   1765   mhd_assert (1 < i_cp);
   1766   if (1)
   1767   { /* for local variables local scope only */
   1768     MHD_iovec_ *iov_copy;
   1769     int num_copy_elements = i_cp;
   1770 
   1771     iov_copy = MHD_calloc_ ((size_t) num_copy_elements, \
   1772                             sizeof(MHD_iovec_));
   1773     if (NULL == iov_copy)
   1774     {
   1775       MHD_mutex_destroy_chk_ (&response->mutex);
   1776       free (response);
   1777       return NULL;
   1778     }
   1779     i_cp = 0;
   1780     for (i = 0; i < iovcnt; ++i)
   1781     {
   1782       size_t element_size = iov[i].iov_len;
   1783       const uint8_t *buf = (const uint8_t *) iov[i].iov_base;
   1784 
   1785       if (0 == element_size)
   1786         continue;         /* skip zero-sized elements */
   1787 #if defined(MHD_WINSOCK_SOCKETS) && defined(_WIN64)
   1788       while (MHD_IOV_ELMN_MAX_SIZE < element_size)
   1789       {
   1790         iov_copy[i_cp].iov_base = (char *) _MHD_DROP_CONST (buf);
   1791         iov_copy[i_cp].iov_len = ULONG_MAX;
   1792         buf += ULONG_MAX;
   1793         element_size -= ULONG_MAX;
   1794         i_cp++;
   1795       }
   1796 #endif /* MHD_WINSOCK_SOCKETS && _WIN64 */
   1797       iov_copy[i_cp].iov_base = _MHD_DROP_CONST (buf);
   1798       iov_copy[i_cp].iov_len = (MHD_iov_size_) element_size;
   1799       i_cp++;
   1800     }
   1801     mhd_assert (num_copy_elements == i_cp);
   1802     mhd_assert (0 <= i_cp);
   1803     response->data_iov = iov_copy;
   1804     response->data_iovcnt = (unsigned int) i_cp;
   1805   }
   1806   return response;
   1807 }
   1808 
   1809 
   1810 /**
   1811  * Create a response object with empty (zero size) body.
   1812  *
   1813  * The response object can be extended with header information and then be used
   1814  * any number of times.
   1815  *
   1816  * This function is a faster equivalent of #MHD_create_response_from_buffer call
   1817  * with zero size combined with call of #MHD_set_response_options.
   1818  *
   1819  * @param flags the flags for the new response object
   1820  * @return NULL on error (i.e. invalid arguments, out of memory),
   1821  *         the pointer to the created response object otherwise
   1822  * @note Available since #MHD_VERSION 0x00097701
   1823  * @ingroup response
   1824  */
   1825 _MHD_EXTERN struct MHD_Response *
   1826 MHD_create_response_empty (enum MHD_ResponseFlags flags)
   1827 {
   1828   struct MHD_Response *r;
   1829   r = (struct MHD_Response *) MHD_calloc_ (1, sizeof (struct MHD_Response));
   1830   if (NULL != r)
   1831   {
   1832     if (MHD_mutex_init_ (&r->mutex))
   1833     {
   1834       r->fd = -1;
   1835       r->reference_count = 1;
   1836       /* If any flags combination will be not allowed, replace the next
   1837        * assignment with MHD_set_response_options() call. */
   1838       r->flags = flags;
   1839 
   1840       return r; /* Successful result */
   1841     }
   1842     free (r);
   1843   }
   1844   return NULL; /* Something failed */
   1845 }
   1846 
   1847 
   1848 #ifdef UPGRADE_SUPPORT
   1849 /**
   1850  * This connection-specific callback is provided by MHD to
   1851  * applications (unusual) during the #MHD_UpgradeHandler.
   1852  * It allows applications to perform 'special' actions on
   1853  * the underlying socket from the upgrade.
   1854  *
   1855  * @param urh the handle identifying the connection to perform
   1856  *            the upgrade @a action on.
   1857  * @param action which action should be performed
   1858  * @param ... arguments to the action (depends on the action)
   1859  * @return #MHD_NO on error, #MHD_YES on success
   1860  */
   1861 _MHD_EXTERN enum MHD_Result
   1862 MHD_upgrade_action (struct MHD_UpgradeResponseHandle *urh,
   1863                     enum MHD_UpgradeAction action,
   1864                     ...)
   1865 {
   1866   struct MHD_Connection *connection;
   1867   struct MHD_Daemon *daemon;
   1868 
   1869   if (NULL == urh)
   1870     return MHD_NO;
   1871   connection = urh->connection;
   1872 
   1873   /* Precaution checks on external data. */
   1874   if (NULL == connection)
   1875     return MHD_NO;
   1876   daemon = connection->daemon;
   1877   if (NULL == daemon)
   1878     return MHD_NO;
   1879 
   1880   switch (action)
   1881   {
   1882   case MHD_UPGRADE_ACTION_CLOSE:
   1883     if (urh->was_closed)
   1884       return MHD_NO; /* Already closed. */
   1885 
   1886     /* transition to special 'closed' state for start of cleanup */
   1887 #ifdef HTTPS_SUPPORT
   1888     if (0 != (daemon->options & MHD_USE_TLS) )
   1889     {
   1890       /* signal that app is done by shutdown() of 'app' socket */
   1891       /* Application will not use anyway this socket after this command. */
   1892       shutdown (urh->app.socket,
   1893                 SHUT_RDWR);
   1894     }
   1895 #endif /* HTTPS_SUPPORT */
   1896     mhd_assert (MHD_CONNECTION_UPGRADE == connection->state);
   1897     /* The next function will mark the connection as closed by application
   1898      * by setting 'urh->was_closed'.
   1899      * As soon as connection will be marked with BOTH
   1900      * 'urh->was_closed' AND 'urh->clean_ready', it will
   1901      * be moved to cleanup list by MHD_resume_connection(). */
   1902     MHD_upgraded_connection_mark_app_closed_ (connection);
   1903     return MHD_YES;
   1904   case MHD_UPGRADE_ACTION_CORK_ON:
   1905     /* Unportable API. TODO: replace with portable action. */
   1906     return MHD_connection_set_cork_state_ (connection,
   1907                                            true) ? MHD_YES : MHD_NO;
   1908   case MHD_UPGRADE_ACTION_CORK_OFF:
   1909     /* Unportable API. TODO: replace with portable action. */
   1910     return MHD_connection_set_cork_state_ (connection,
   1911                                            false) ? MHD_YES : MHD_NO;
   1912   default:
   1913     /* we don't understand this one */
   1914     return MHD_NO;
   1915   }
   1916 }
   1917 
   1918 
   1919 /**
   1920  * We are done sending the header of a given response to the client.
   1921  * Now it is time to perform the upgrade and hand over the connection
   1922  * to the application.
   1923  * @remark To be called only from thread that process connection's
   1924  * recv(), send() and response. Must be called right after sending
   1925  * response headers.
   1926  *
   1927  * @param response the response that was created for an upgrade
   1928  * @param connection the specific connection we are upgrading
   1929  * @return #MHD_YES on success, #MHD_NO on failure (will cause
   1930  *        connection to be closed)
   1931  */
   1932 enum MHD_Result
   1933 MHD_response_execute_upgrade_ (struct MHD_Response *response,
   1934                                struct MHD_Connection *connection)
   1935 {
   1936 #if defined(HTTPS_SUPPORT) || defined(_DEBUG) || defined(HAVE_MESSAGES)
   1937   struct MHD_Daemon *const daemon = connection->daemon;
   1938 #endif /* HTTPS_SUPPORT || _DEBUG || HAVE_MESSAGES */
   1939   struct MHD_UpgradeResponseHandle *urh;
   1940   size_t rbo;
   1941 
   1942 #ifdef MHD_USE_THREADS
   1943   mhd_assert ( (! MHD_D_IS_USING_THREADS_ (daemon)) || \
   1944                MHD_thread_handle_ID_is_current_thread_ (connection->tid) );
   1945 #endif /* MHD_USE_THREADS */
   1946 
   1947   /* "Upgrade" responses accepted only if MHD_ALLOW_UPGRADE is enabled */
   1948   mhd_assert (0 != (daemon->options & MHD_ALLOW_UPGRADE));
   1949   /* The header was checked when response queued */
   1950   mhd_assert (NULL != \
   1951               MHD_get_response_element_n_ (response, MHD_HEADER_KIND,
   1952                                            MHD_HTTP_HEADER_UPGRADE,
   1953                                            MHD_STATICSTR_LEN_ ( \
   1954                                              MHD_HTTP_HEADER_UPGRADE)));
   1955 
   1956   if (! connection->sk_nonblck)
   1957   {
   1958 #ifdef HAVE_MESSAGES
   1959     MHD_DLOG (daemon,
   1960               _ ("Cannot execute \"upgrade\" as the socket is in " \
   1961                  "the blocking mode.\n"));
   1962 #endif
   1963     return MHD_NO;
   1964   }
   1965   urh = MHD_calloc_ (1, sizeof (struct MHD_UpgradeResponseHandle));
   1966   if (NULL == urh)
   1967     return MHD_NO;
   1968   urh->connection = connection;
   1969   rbo = connection->read_buffer_offset;
   1970   connection->read_buffer_offset = 0;
   1971   MHD_connection_set_nodelay_state_ (connection, false);
   1972   MHD_connection_set_cork_state_ (connection, false);
   1973 #ifdef HTTPS_SUPPORT
   1974   if (0 != (daemon->options & MHD_USE_TLS) )
   1975   {
   1976     MHD_socket sv[2];
   1977 #if defined(MHD_socket_nosignal_) || ! defined(MHD_socket_pair_nblk_)
   1978     int res1;
   1979     int res2;
   1980 #endif /* MHD_socket_nosignal_ || !MHD_socket_pair_nblk_ */
   1981 
   1982 #ifdef MHD_socket_pair_nblk_
   1983     if (! MHD_socket_pair_nblk_ (sv))
   1984     {
   1985       free (urh);
   1986       return MHD_NO;
   1987     }
   1988 #else  /* !MHD_socket_pair_nblk_ */
   1989     if (! MHD_socket_pair_ (sv))
   1990     {
   1991       free (urh);
   1992       return MHD_NO;
   1993     }
   1994     res1 = MHD_socket_nonblocking_ (sv[0]);
   1995     res2 = MHD_socket_nonblocking_ (sv[1]);
   1996     if ( (! res1) || (! res2) )
   1997     {
   1998 #ifdef HAVE_MESSAGES
   1999       MHD_DLOG (daemon,
   2000                 _ ("Failed to make loopback sockets non-blocking.\n"));
   2001 #endif
   2002       if (! res2)
   2003       {
   2004         /* Socketpair cannot be used. */
   2005         MHD_socket_close_chk_ (sv[0]);
   2006         MHD_socket_close_chk_ (sv[1]);
   2007         free (urh);
   2008         return MHD_NO;
   2009       }
   2010     }
   2011 #endif /* !MHD_socket_pair_nblk_ */
   2012 #ifdef MHD_socket_nosignal_
   2013     res1 = MHD_socket_nosignal_ (sv[0]);
   2014     res2 = MHD_socket_nosignal_ (sv[1]);
   2015     if ( (! res1) || (! res2) )
   2016     {
   2017 #ifdef HAVE_MESSAGES
   2018       MHD_DLOG (daemon,
   2019                 _ ("Failed to set SO_NOSIGPIPE on loopback sockets.\n"));
   2020 #endif
   2021 #ifndef MSG_NOSIGNAL
   2022       if (! res2)
   2023       {
   2024         /* Socketpair cannot be used. */
   2025         MHD_socket_close_chk_ (sv[0]);
   2026         MHD_socket_close_chk_ (sv[1]);
   2027         free (urh);
   2028         return MHD_NO;
   2029       }
   2030 #endif /* ! MSG_NOSIGNAL */
   2031     }
   2032 #endif /* MHD_socket_nosignal_ */
   2033     if (MHD_D_IS_USING_SELECT_ (daemon) &&
   2034         (! MHD_D_DOES_SCKT_FIT_FDSET_ (sv[1], daemon)) )
   2035     {
   2036 #ifdef HAVE_MESSAGES
   2037       MHD_DLOG (daemon,
   2038                 _ ("Socketpair descriptor is not less than FD_SETSIZE: " \
   2039                    "%d >= %d\n"),
   2040                 (int) sv[1],
   2041                 (int) MHD_D_GET_FD_SETSIZE_ (daemon));
   2042 #endif
   2043       MHD_socket_close_chk_ (sv[0]);
   2044       MHD_socket_close_chk_ (sv[1]);
   2045       free (urh);
   2046       return MHD_NO;
   2047     }
   2048     urh->app.socket = sv[0];
   2049     urh->app.urh = urh;
   2050     urh->app.celi = MHD_EPOLL_STATE_UNREADY;
   2051     urh->mhd.socket = sv[1];
   2052     urh->mhd.urh = urh;
   2053     urh->mhd.celi = MHD_EPOLL_STATE_UNREADY;
   2054 #ifdef EPOLL_SUPPORT
   2055     /* Launch IO processing by the event loop */
   2056     if (MHD_D_IS_USING_EPOLL_ (daemon))
   2057     {
   2058       /* We're running with epoll(), need to add the sockets
   2059          to the event set of the daemon's `epoll_upgrade_fd` */
   2060       struct epoll_event event;
   2061 
   2062       mhd_assert (-1 != daemon->epoll_upgrade_fd);
   2063       /* First, add network socket */
   2064       event.events = EPOLLIN | EPOLLOUT | EPOLLPRI | EPOLLET;
   2065       event.data.ptr = &urh->app;
   2066       if (0 != epoll_ctl (daemon->epoll_upgrade_fd,
   2067                           EPOLL_CTL_ADD,
   2068                           connection->socket_fd,
   2069                           &event))
   2070       {
   2071 #ifdef HAVE_MESSAGES
   2072         MHD_DLOG (daemon,
   2073                   _ ("Call to epoll_ctl failed: %s\n"),
   2074                   MHD_socket_last_strerr_ ());
   2075 #endif
   2076         MHD_socket_close_chk_ (sv[0]);
   2077         MHD_socket_close_chk_ (sv[1]);
   2078         free (urh);
   2079         return MHD_NO;
   2080       }
   2081 
   2082       /* Second, add our end of the UNIX socketpair() */
   2083       event.events = EPOLLIN | EPOLLOUT | EPOLLPRI | EPOLLET;
   2084       event.data.ptr = &urh->mhd;
   2085       if (0 != epoll_ctl (daemon->epoll_upgrade_fd,
   2086                           EPOLL_CTL_ADD,
   2087                           urh->mhd.socket,
   2088                           &event))
   2089       {
   2090         event.events = EPOLLIN | EPOLLOUT | EPOLLPRI;
   2091         event.data.ptr = &urh->app;
   2092         if (0 != epoll_ctl (daemon->epoll_upgrade_fd,
   2093                             EPOLL_CTL_DEL,
   2094                             connection->socket_fd,
   2095                             &event))
   2096           MHD_PANIC (_ ("Error cleaning up while handling epoll error.\n"));
   2097 #ifdef HAVE_MESSAGES
   2098         MHD_DLOG (daemon,
   2099                   _ ("Call to epoll_ctl failed: %s\n"),
   2100                   MHD_socket_last_strerr_ ());
   2101 #endif
   2102         MHD_socket_close_chk_ (sv[0]);
   2103         MHD_socket_close_chk_ (sv[1]);
   2104         free (urh);
   2105         return MHD_NO;
   2106       }
   2107       EDLL_insert (daemon->eready_urh_head,
   2108                    daemon->eready_urh_tail,
   2109                    urh);
   2110       urh->in_eready_list = true;
   2111     }
   2112 #endif /* EPOLL_SUPPORT */
   2113     if (! MHD_D_IS_USING_THREAD_PER_CONN_ (daemon))
   2114     {
   2115       /* This takes care of further processing for most event loops:
   2116          simply add to DLL for bi-direcitonal processing */
   2117       DLL_insert (daemon->urh_head,
   2118                   daemon->urh_tail,
   2119                   urh);
   2120     }
   2121     /* In thread-per-connection mode, thread will switch to forwarding once
   2122      * connection.urh is not NULL and connection.state == MHD_CONNECTION_UPGRADE.
   2123      */
   2124   }
   2125   else
   2126   {
   2127     urh->app.socket = MHD_INVALID_SOCKET;
   2128     urh->mhd.socket = MHD_INVALID_SOCKET;
   2129     /* Non-TLS connection do not hold any additional resources. */
   2130     urh->clean_ready = true;
   2131   }
   2132 #else  /* ! HTTPS_SUPPORT */
   2133   urh->clean_ready = true;
   2134 #endif /* ! HTTPS_SUPPORT */
   2135   connection->urh = urh;
   2136   /* As far as MHD's event loops are concerned, this connection is
   2137      suspended; it will be resumed once application is done by the
   2138      #MHD_upgrade_action() function */
   2139   internal_suspend_connection_ (connection);
   2140 
   2141   /* hand over socket to application */
   2142   response->upgrade_handler (response->upgrade_handler_cls,
   2143                              connection,
   2144                              connection->rq.client_context,
   2145                              connection->read_buffer,
   2146                              rbo,
   2147 #ifdef HTTPS_SUPPORT
   2148                              (0 == (daemon->options & MHD_USE_TLS) ) ?
   2149                              connection->socket_fd : urh->app.socket,
   2150 #else  /* ! HTTPS_SUPPORT */
   2151                              connection->socket_fd,
   2152 #endif /* ! HTTPS_SUPPORT */
   2153                              urh);
   2154 
   2155 #ifdef HTTPS_SUPPORT
   2156   if (0 != (daemon->options & MHD_USE_TLS))
   2157   {
   2158     struct MemoryPool *const pool = connection->pool;
   2159     size_t avail;
   2160     char *buf;
   2161 
   2162     /* All data should be sent already */
   2163     mhd_assert (connection->write_buffer_send_offset == \
   2164                 connection->write_buffer_append_offset);
   2165     MHD_pool_deallocate (pool, connection->write_buffer,
   2166                          connection->write_buffer_size);
   2167     connection->write_buffer_append_offset = 0;
   2168     connection->write_buffer_send_offset = 0;
   2169     connection->write_buffer_size = 0;
   2170     connection->write_buffer = NULL;
   2171 
   2172     /* Extra read data should be processed already by the application */
   2173     MHD_pool_deallocate (pool, connection->read_buffer,
   2174                          connection->read_buffer_size);
   2175     connection->read_buffer_offset = 0;
   2176     connection->read_buffer_size = 0;
   2177     connection->read_buffer = NULL;
   2178 
   2179     avail = MHD_pool_get_free (pool);
   2180     if (avail < RESERVE_EBUF_SIZE)
   2181     {
   2182       /* connection's pool is totally at the limit,
   2183          use our 'emergency' buffer of #RESERVE_EBUF_SIZE bytes. */
   2184       avail = RESERVE_EBUF_SIZE;
   2185       buf = urh->e_buf;
   2186 #ifdef HAVE_MESSAGES
   2187       MHD_DLOG (daemon,
   2188                 _ ("Memory shortage in connection's memory pool. " \
   2189                    "The \"upgraded\" communication will be inefficient.\n"));
   2190 #endif
   2191     }
   2192     else
   2193     {
   2194       /* Normal case: grab all remaining memory from the
   2195          connection's pool for the IO buffers; the connection
   2196          certainly won't need it anymore as we've upgraded
   2197          to another protocol. */
   2198       buf = MHD_pool_allocate (pool,
   2199                                avail,
   2200                                false);
   2201     }
   2202     /* use half the buffer for inbound, half for outbound */
   2203     urh->in_buffer_size = avail / 2;
   2204     urh->out_buffer_size = avail - urh->in_buffer_size;
   2205     urh->in_buffer = buf;
   2206     urh->out_buffer = buf + urh->in_buffer_size;
   2207   }
   2208 #endif /* HTTPS_SUPPORT */
   2209   return MHD_YES;
   2210 }
   2211 
   2212 
   2213 /**
   2214  * Create a response object that can be used for 101 UPGRADE
   2215  * responses, for example to implement WebSockets.  After sending the
   2216  * response, control over the data stream is given to the callback (which
   2217  * can then, for example, start some bi-directional communication).
   2218  * If the response is queued for multiple connections, the callback
   2219  * will be called for each connection.  The callback
   2220  * will ONLY be called after the response header was successfully passed
   2221  * to the OS; if there are communication errors before, the usual MHD
   2222  * connection error handling code will be performed.
   2223  *
   2224  * Setting the correct HTTP code (i.e. MHD_HTTP_SWITCHING_PROTOCOLS)
   2225  * and setting correct HTTP headers for the upgrade must be done
   2226  * manually (this way, it is possible to implement most existing
   2227  * WebSocket versions using this API; in fact, this API might be useful
   2228  * for any protocol switch, not just WebSockets).  Note that
   2229  * draft-ietf-hybi-thewebsocketprotocol-00 cannot be implemented this
   2230  * way as the header "HTTP/1.1 101 WebSocket Protocol Handshake"
   2231  * cannot be generated; instead, MHD will always produce "HTTP/1.1 101
   2232  * Switching Protocols" (if the response code 101 is used).
   2233  *
   2234  * As usual, the response object can be extended with header
   2235  * information and then be used any number of times (as long as the
   2236  * header information is not connection-specific).
   2237  *
   2238  * @param upgrade_handler function to call with the 'upgraded' socket
   2239  * @param upgrade_handler_cls closure for @a upgrade_handler
   2240  * @return NULL on error (i.e. invalid arguments, out of memory)
   2241  */
   2242 _MHD_EXTERN struct MHD_Response *
   2243 MHD_create_response_for_upgrade (MHD_UpgradeHandler upgrade_handler,
   2244                                  void *upgrade_handler_cls)
   2245 {
   2246   struct MHD_Response *response;
   2247 
   2248   if (NULL == upgrade_handler)
   2249     return NULL; /* invalid request */
   2250   response = MHD_calloc_ (1, sizeof (struct MHD_Response));
   2251   if (NULL == response)
   2252     return NULL;
   2253 #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS)
   2254   if (! MHD_mutex_init_ (&response->mutex))
   2255   {
   2256     free (response);
   2257     return NULL;
   2258   }
   2259 #endif
   2260   response->upgrade_handler = upgrade_handler;
   2261   response->upgrade_handler_cls = upgrade_handler_cls;
   2262   response->total_size = 0;
   2263   response->reference_count = 1;
   2264   if (MHD_NO ==
   2265       MHD_add_response_header (response,
   2266                                MHD_HTTP_HEADER_CONNECTION,
   2267                                "Upgrade"))
   2268   {
   2269     MHD_destroy_response (response);
   2270     return NULL;
   2271   }
   2272   return response;
   2273 }
   2274 
   2275 
   2276 #endif /* UPGRADE_SUPPORT */
   2277 
   2278 
   2279 /**
   2280  * Destroy a response object and associated resources.  Note that
   2281  * libmicrohttpd may keep some of the resources around if the response
   2282  * is still in the queue for some clients, so the memory may not
   2283  * necessarily be freed immediately.
   2284  *
   2285  * @param response response to destroy
   2286  * @ingroup response
   2287  */
   2288 _MHD_EXTERN void
   2289 MHD_destroy_response (struct MHD_Response *response)
   2290 {
   2291   struct MHD_HTTP_Res_Header *pos;
   2292 
   2293   if (NULL == response)
   2294     return;
   2295 #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS)
   2296   MHD_mutex_lock_chk_ (&response->mutex);
   2297 #endif
   2298   if (0 != --(response->reference_count))
   2299   {
   2300 #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS)
   2301     MHD_mutex_unlock_chk_ (&response->mutex);
   2302 #endif
   2303     return;
   2304   }
   2305 #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS)
   2306   MHD_mutex_unlock_chk_ (&response->mutex);
   2307   MHD_mutex_destroy_chk_ (&response->mutex);
   2308 #endif
   2309   if (NULL != response->crfc)
   2310     response->crfc (response->crc_cls);
   2311 
   2312   if (NULL != response->data_iov)
   2313   {
   2314     free (response->data_iov);
   2315   }
   2316 
   2317   while (NULL != response->first_header)
   2318   {
   2319     pos = response->first_header;
   2320     response->first_header = pos->next;
   2321     free (pos->header);
   2322     free (pos->value);
   2323     free (pos);
   2324   }
   2325   free (response);
   2326 }
   2327 
   2328 
   2329 /**
   2330  * Increments the reference counter for the @a response.
   2331  *
   2332  * @param response object to modify
   2333  */
   2334 void
   2335 MHD_increment_response_rc (struct MHD_Response *response)
   2336 {
   2337 #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS)
   2338   MHD_mutex_lock_chk_ (&response->mutex);
   2339 #endif
   2340   (response->reference_count)++;
   2341 #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS)
   2342   MHD_mutex_unlock_chk_ (&response->mutex);
   2343 #endif
   2344 }
   2345 
   2346 
   2347 /* end of response.c */