libmicrohttpd

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

test_response_entries.c (26470B)


      1 /*
      2      This file is part of libmicrohttpd
      3      Copyright (C) 2021 Karlson2k (Evgeny Grin)
      4 
      5      This test_response_entries.c file is in the public domain
      6 */
      7 
      8 /**
      9  * @file test_response_entries.c
     10  * @brief  Test adding and removing response headers
     11  * @author Karlson2k (Evgeny Grin)
     12  */
     13 #include "mhd_options.h"
     14 #include "platform.h"
     15 #include <string.h>
     16 #include <microhttpd.h>
     17 
     18 
     19 static int
     20 expect_str (const char *actual, const char *expected)
     21 {
     22   if (expected == actual)
     23     return ! 0;
     24   if (NULL == actual)
     25   {
     26     fprintf (stderr, "FAILED: result: NULL\n" \
     27              "        expected: \"%s\"\n",
     28              expected);
     29     return 0;
     30   }
     31   if (NULL == expected)
     32   {
     33     fprintf (stderr, "FAILED: result: \"%s\"\n" \
     34              "        expected: NULL\n",
     35              actual);
     36     return 0;
     37   }
     38   if (0 != strcmp (actual, expected))
     39   {
     40     fprintf (stderr, "FAILED: result: \"%s\"\n" \
     41              "        expected: \"%s\"\n",
     42              actual, expected);
     43     return 0;
     44   }
     45   return ! 0;
     46 }
     47 
     48 
     49 int
     50 main (int argc,
     51       char *const *argv)
     52 {
     53   struct MHD_Response *r;
     54   (void) argc;
     55   (void) argv; /* Unused. Silence compiler warning. */
     56 
     57   r = MHD_create_response_empty (MHD_RF_NONE);
     58   if (NULL == r)
     59   {
     60     fprintf (stderr, "Cannot create a response.\n");
     61     return 1;
     62   }
     63 
     64   /* ** Test basic header functions ** */
     65 
     66   /* Add first header */
     67   if (MHD_YES != MHD_add_response_header (r, "Header-Type-A", "value-a1"))
     68   {
     69     fprintf (stderr, "Cannot add header A1.\n");
     70     MHD_destroy_response (r);
     71     return 2;
     72   }
     73   if (! expect_str (MHD_get_response_header (r, "Header-Type-A"), "value-a1"))
     74   {
     75     MHD_destroy_response (r);
     76     return 2;
     77   }
     78   /* Add second header with the same name */
     79   if (MHD_YES != MHD_add_response_header (r, "Header-Type-A", "value-a2"))
     80   {
     81     fprintf (stderr, "Cannot add header A2.\n");
     82     MHD_destroy_response (r);
     83     return 2;
     84   }
     85   /* Value of the first header must be returned */
     86   if (! expect_str (MHD_get_response_header (r, "Header-Type-A"), "value-a1"))
     87   {
     88     MHD_destroy_response (r);
     89     return 2;
     90   }
     91   /* Remove the first header */
     92   if (MHD_YES != MHD_del_response_header (r, "Header-Type-A", "value-a1"))
     93   {
     94     fprintf (stderr, "Cannot remove header A1.\n");
     95     MHD_destroy_response (r);
     96     return 2;
     97   }
     98   /* Value of the ex-second header must be returned */
     99   if (! expect_str (MHD_get_response_header (r, "Header-Type-A"), "value-a2"))
    100   {
    101     MHD_destroy_response (r);
    102     return 2;
    103   }
    104   if (MHD_YES != MHD_add_response_header (r, "Header-Type-A", "value-a3"))
    105   {
    106     fprintf (stderr, "Cannot add header A2.\n");
    107     MHD_destroy_response (r);
    108     return 2;
    109   }
    110   /* Value of the ex-second header must be returned */
    111   if (! expect_str (MHD_get_response_header (r, "Header-Type-A"), "value-a2"))
    112   {
    113     MHD_destroy_response (r);
    114     return 2;
    115   }
    116   /* Remove the last header */
    117   if (MHD_YES != MHD_del_response_header (r, "Header-Type-A", "value-a3"))
    118   {
    119     fprintf (stderr, "Cannot add header A2.\n");
    120     MHD_destroy_response (r);
    121     return 2;
    122   }
    123   if (! expect_str (MHD_get_response_header (r, "Header-Type-A"), "value-a2"))
    124   {
    125     MHD_destroy_response (r);
    126     return 2;
    127   }
    128   if (! expect_str (MHD_get_response_header (r, "Header-Type-B"), NULL))
    129   {
    130     MHD_destroy_response (r);
    131     return 2;
    132   }
    133   if (MHD_NO != MHD_del_response_header (r, "Header-Type-C", "value-a3"))
    134   {
    135     fprintf (stderr, "Removed non-existing header.\n");
    136     MHD_destroy_response (r);
    137     return 2;
    138   }
    139   if (MHD_NO != MHD_del_response_header (r, "Header-Type-A", "value-c"))
    140   {
    141     fprintf (stderr, "Removed non-existing header value.\n");
    142     MHD_destroy_response (r);
    143     return 2;
    144   }
    145 
    146   /* ** Test "Connection:" header ** */
    147 
    148   if (MHD_YES != MHD_add_response_header (r, "Connection", "a,b,c,d,e"))
    149   {
    150     fprintf (stderr, "Cannot add \"Connection\" header with simple values.\n");
    151     MHD_destroy_response (r);
    152     return 3;
    153   }
    154   if (! expect_str (MHD_get_response_header (r, "Connection"), "a, b, c, d, e"))
    155   {
    156     MHD_destroy_response (r);
    157     return 3;
    158   }
    159   if (MHD_YES != MHD_del_response_header (r, "Connection", "e,b,c,d,a"))
    160   {
    161     fprintf (stderr,
    162              "Cannot remove \"Connection\" header with simple values.\n");
    163     MHD_destroy_response (r);
    164     return 3;
    165   }
    166   if (! expect_str (MHD_get_response_header (r, "Connection"), NULL))
    167   {
    168     MHD_destroy_response (r);
    169     return 3;
    170   }
    171 
    172   if (MHD_YES != MHD_add_response_header (r, "Connection",
    173                                           "i,k,l,m,n,o,p,close"))
    174   {
    175     fprintf (stderr,
    176              "Cannot add \"Connection\" header with simple values and \"close\".\n");
    177     MHD_destroy_response (r);
    178     return 3;
    179   }
    180   if (! expect_str (MHD_get_response_header (r, "Connection"),
    181                     "close, i, k, l, m, n, o, p"))
    182   {
    183     MHD_destroy_response (r);
    184     return 3;
    185   }
    186   if (MHD_YES != MHD_del_response_header (r, "Connection",
    187                                           "i,k,l,m,n,o,p,close"))
    188   {
    189     fprintf (stderr,
    190              "Cannot remove \"Connection\" header with simple values and \"close\".\n");
    191     MHD_destroy_response (r);
    192     return 3;
    193   }
    194   if (! expect_str (MHD_get_response_header (r, "Connection"), NULL))
    195   {
    196     MHD_destroy_response (r);
    197     return 3;
    198   }
    199 
    200   if (MHD_YES != MHD_add_response_header (r, "Connection",
    201                                           "1,2,3,4,5,6,7,close"))
    202   {
    203     fprintf (stderr,
    204              "Cannot add \"Connection\" header with simple values and \"close\".\n");
    205     MHD_destroy_response (r);
    206     return 3;
    207   }
    208   if (! expect_str (MHD_get_response_header (r, "Connection"),
    209                     "close, 1, 2, 3, 4, 5, 6, 7"))
    210   {
    211     MHD_destroy_response (r);
    212     return 3;
    213   }
    214   if (MHD_YES != MHD_add_response_header (r, "Connection", "8,9,close"))
    215   {
    216     fprintf (stderr,
    217              "Cannot add second \"Connection\" header with simple values and \"close\".\n");
    218     MHD_destroy_response (r);
    219     return 3;
    220   }
    221   if (! expect_str (MHD_get_response_header (r, "Connection"),
    222                     "close, 1, 2, 3, 4, 5, 6, 7, 8, 9"))
    223   {
    224     MHD_destroy_response (r);
    225     return 3;
    226   }
    227   if (MHD_YES != MHD_del_response_header (r, "Connection", "1,3,5,7,9"))
    228   {
    229     fprintf (stderr,
    230              "Cannot remove part of \"Connection\" header with simple values.\n");
    231     MHD_destroy_response (r);
    232     return 3;
    233   }
    234   if (! expect_str (MHD_get_response_header (r, "Connection"),
    235                     "close, 2, 4, 6, 8"))
    236   {
    237     MHD_destroy_response (r);
    238     return 3;
    239   }
    240   if (MHD_YES != MHD_add_response_header (r, "Connection", "10,12"))
    241   {
    242     fprintf (stderr,
    243              "Cannot add third \"Connection\" header with simple values.\n");
    244     MHD_destroy_response (r);
    245     return 3;
    246   }
    247   if (! expect_str (MHD_get_response_header (r, "Connection"),
    248                     "close, 2, 4, 6, 8, 10, 12"))
    249   {
    250     MHD_destroy_response (r);
    251     return 3;
    252   }
    253   if (MHD_YES != MHD_del_response_header (r, "Connection",
    254                                           "12  ,10  ,8  ,close"))
    255   {
    256     fprintf (stderr,
    257              "Cannot remove part of \"Connection\" header with simple values and \"close\".\n");
    258     MHD_destroy_response (r);
    259     return 3;
    260   }
    261   if (! expect_str (MHD_get_response_header (r, "Connection"), "2, 4, 6"))
    262   {
    263     MHD_destroy_response (r);
    264     return 3;
    265   }
    266   if (MHD_YES != MHD_add_response_header (r, "Connection", "close"))
    267   {
    268     fprintf (stderr, "Cannot add \"Connection\" header with \"close\" only.\n");
    269     MHD_destroy_response (r);
    270     return 3;
    271   }
    272   if (! expect_str (MHD_get_response_header (r, "Connection"),
    273                     "close, 2, 4, 6"))
    274   {
    275     MHD_destroy_response (r);
    276     return 3;
    277   }
    278   if (MHD_YES != MHD_del_response_header (r, "Connection", "4  ,5,6,7  8,"))
    279   {
    280     fprintf (stderr,
    281              "Cannot remove part of \"Connection\" header with simple values and non-existing tokens.\n");
    282     MHD_destroy_response (r);
    283     return 3;
    284   }
    285   if (! expect_str (MHD_get_response_header (r, "Connection"), "close, 2"))
    286   {
    287     MHD_destroy_response (r);
    288     return 3;
    289   }
    290   if (MHD_YES != MHD_add_response_header (r, "Connection", "close"))
    291   {
    292     fprintf (stderr, "Cannot add \"Connection\" header with \"close\" only.\n");
    293     MHD_destroy_response (r);
    294     return 3;
    295   }
    296   if (! expect_str (MHD_get_response_header (r, "Connection"), "close, 2"))
    297   {
    298     MHD_destroy_response (r);
    299     return 3;
    300   }
    301   if (MHD_YES != MHD_del_response_header (r, "Connection",
    302                                           "close, 10, 12, 22, nothing"))
    303   {
    304     fprintf (stderr,
    305              "Cannot remove part of \"Connection\" header with \"close\" and non-existing tokens.\n");
    306     MHD_destroy_response (r);
    307     return 3;
    308   }
    309   if (! expect_str (MHD_get_response_header (r, "Connection"), "2"))
    310   {
    311     MHD_destroy_response (r);
    312     return 3;
    313   }
    314   if (MHD_YES != MHD_del_response_header (r, "Connection", "2"))
    315   {
    316     fprintf (stderr,
    317              "Cannot remove part of \"Connection\" header with simple values and non-existing tokens.\n");
    318     MHD_destroy_response (r);
    319     return 3;
    320   }
    321   if (! expect_str (MHD_get_response_header (r, "Connection"), NULL))
    322   {
    323     MHD_destroy_response (r);
    324     return 3;
    325   }
    326   if (MHD_YES != MHD_add_response_header (r, "Connection", "close"))
    327   {
    328     fprintf (stderr, "Cannot add \"Connection\" header with \"close\".\n");
    329     MHD_destroy_response (r);
    330     return 3;
    331   }
    332   if (! expect_str (MHD_get_response_header (r, "Connection"), "close"))
    333   {
    334     MHD_destroy_response (r);
    335     return 3;
    336   }
    337   if (MHD_YES != MHD_add_response_header (r, "Connection", "close"))
    338   {
    339     fprintf (stderr, "Cannot add \"Connection\" header with \"close\".\n");
    340     MHD_destroy_response (r);
    341     return 3;
    342   }
    343   if (! expect_str (MHD_get_response_header (r, "Connection"), "close"))
    344   {
    345     MHD_destroy_response (r);
    346     return 3;
    347   }
    348   if (MHD_YES != MHD_del_response_header (r, "Connection", "close"))
    349   {
    350     fprintf (stderr, "Cannot remove \"Connection\" header with \"close\".\n");
    351     MHD_destroy_response (r);
    352     return 3;
    353   }
    354   if (! expect_str (MHD_get_response_header (r, "Connection"), NULL))
    355   {
    356     MHD_destroy_response (r);
    357     return 3;
    358   }
    359 
    360   if (MHD_YES != MHD_add_response_header (r, "Connection", "close,other-token"))
    361   {
    362     fprintf (stderr, "Cannot add \"Connection\" header with \"close\".\n");
    363     MHD_destroy_response (r);
    364     return 3;
    365   }
    366   if (! expect_str (MHD_get_response_header (r, "Connection"),
    367                     "close, other-token"))
    368   {
    369     MHD_destroy_response (r);
    370     return 3;
    371   }
    372   if (MHD_YES != MHD_add_response_header (r, "Connection", "close, new-token"))
    373   {
    374     fprintf (stderr, "Cannot add \"Connection\" header with \"close\".\n");
    375     MHD_destroy_response (r);
    376     return 3;
    377   }
    378   if (! expect_str (MHD_get_response_header (r, "Connection"),
    379                     "close, other-token, new-token"))
    380   {
    381     MHD_destroy_response (r);
    382     return 3;
    383   }
    384   if (MHD_YES != MHD_del_response_header (r, "Connection", "close, new-token"))
    385   {
    386     fprintf (stderr, "Cannot remove tokens from \"Connection\".\n");
    387     MHD_destroy_response (r);
    388     return 3;
    389   }
    390   if (! expect_str (MHD_get_response_header (r, "Connection"), "other-token"))
    391   {
    392     MHD_destroy_response (r);
    393     return 3;
    394   }
    395   if (MHD_YES != MHD_del_response_header (r, "Connection", "other-token"))
    396   {
    397     fprintf (stderr, "Cannot remove tokens from \"Connection\".\n");
    398     MHD_destroy_response (r);
    399     return 3;
    400   }
    401   if (! expect_str (MHD_get_response_header (r, "Connection"), NULL))
    402   {
    403     MHD_destroy_response (r);
    404     return 3;
    405   }
    406 
    407   if (MHD_YES != MHD_add_response_header (r, "Connection",
    408                                           "close, one-long-token"))
    409   {
    410     fprintf (stderr, "Cannot add \"Connection\" header with \"close\".\n");
    411     MHD_destroy_response (r);
    412     return 3;
    413   }
    414   if (! expect_str (MHD_get_response_header (r, "Connection"),
    415                     "close, one-long-token"))
    416   {
    417     MHD_destroy_response (r);
    418     return 3;
    419   }
    420   if (MHD_YES != MHD_add_response_header (r, "Connection", "close"))
    421   {
    422     fprintf (stderr, "Cannot add \"Connection\" header with \"close\".\n");
    423     MHD_destroy_response (r);
    424     return 3;
    425   }
    426   if (! expect_str (MHD_get_response_header (r, "Connection"),
    427                     "close, one-long-token"))
    428   {
    429     MHD_destroy_response (r);
    430     return 3;
    431   }
    432   if (MHD_YES != MHD_del_response_header (r, "Connection",
    433                                           "one-long-token,close"))
    434   {
    435     fprintf (stderr, "Cannot remove tokens from \"Connection\".\n");
    436     MHD_destroy_response (r);
    437     return 3;
    438   }
    439   if (! expect_str (MHD_get_response_header (r, "Connection"), NULL))
    440   {
    441     MHD_destroy_response (r);
    442     return 3;
    443   }
    444 
    445   if (MHD_YES != MHD_add_response_header (r, "Connection", "close"))
    446   {
    447     fprintf (stderr, "Cannot add \"Connection\" header with \"close\".\n");
    448     MHD_destroy_response (r);
    449     return 3;
    450   }
    451   if (! expect_str (MHD_get_response_header (r, "Connection"), "close"))
    452   {
    453     MHD_destroy_response (r);
    454     return 3;
    455   }
    456   if (MHD_YES != MHD_add_response_header (r, "Connection",
    457                                           "close, additional-token"))
    458   {
    459     fprintf (stderr, "Cannot add \"Connection\" header with \"close\".\n");
    460     MHD_destroy_response (r);
    461     return 3;
    462   }
    463   if (! expect_str (MHD_get_response_header (r, "Connection"),
    464                     "close, additional-token"))
    465   {
    466     MHD_destroy_response (r);
    467     return 3;
    468   }
    469   if (MHD_YES != MHD_del_response_header (r, "Connection",
    470                                           "additional-token,close"))
    471   {
    472     fprintf (stderr, "Cannot remove tokens from \"Connection\".\n");
    473     MHD_destroy_response (r);
    474     return 3;
    475   }
    476   if (! expect_str (MHD_get_response_header (r, "Connection"), NULL))
    477   {
    478     MHD_destroy_response (r);
    479     return 3;
    480   }
    481 
    482 
    483   if (MHD_YES != MHD_add_response_header (r, "Connection", "token-1,token-2"))
    484   {
    485     fprintf (stderr, "Cannot add \"Connection\" header with \"close\".\n");
    486     MHD_destroy_response (r);
    487     return 3;
    488   }
    489   if (! expect_str (MHD_get_response_header (r, "Connection"),
    490                     "token-1, token-2"))
    491   {
    492     MHD_destroy_response (r);
    493     return 3;
    494   }
    495   if (MHD_YES != MHD_add_response_header (r, "Connection", "token-3"))
    496   {
    497     fprintf (stderr, "Cannot add \"Connection\" header.\n");
    498     MHD_destroy_response (r);
    499     return 3;
    500   }
    501   if (! expect_str (MHD_get_response_header (r, "Connection"),
    502                     "token-1, token-2, token-3"))
    503   {
    504     MHD_destroy_response (r);
    505     return 3;
    506   }
    507   if (MHD_YES != MHD_add_response_header (r, "Connection", "close"))
    508   {
    509     fprintf (stderr, "Cannot add \"Connection\" header with \"close\".\n");
    510     MHD_destroy_response (r);
    511     return 3;
    512   }
    513   if (! expect_str (MHD_get_response_header (r, "Connection"),
    514                     "close, token-1, token-2, token-3"))
    515   {
    516     MHD_destroy_response (r);
    517     return 3;
    518   }
    519   if (MHD_YES != MHD_add_response_header (r, "Connection", "close"))
    520   {
    521     fprintf (stderr, "Cannot add \"Connection\" header with \"close\".\n");
    522     MHD_destroy_response (r);
    523     return 3;
    524   }
    525   if (! expect_str (MHD_get_response_header (r, "Connection"),
    526                     "close, token-1, token-2, token-3"))
    527   {
    528     MHD_destroy_response (r);
    529     return 3;
    530   }
    531   if (MHD_YES != MHD_add_response_header (r, "Connection", "close, token-4"))
    532   {
    533     fprintf (stderr, "Cannot add \"Connection\" header with \"close\".\n");
    534     MHD_destroy_response (r);
    535     return 3;
    536   }
    537   if (! expect_str (MHD_get_response_header (r, "Connection"),
    538                     "close, token-1, token-2, token-3, token-4"))
    539   {
    540     MHD_destroy_response (r);
    541     return 3;
    542   }
    543   if (MHD_YES != MHD_del_response_header (r, "Connection", "close"))
    544   {
    545     fprintf (stderr, "Cannot remove tokens from \"Connection\".\n");
    546     MHD_destroy_response (r);
    547     return 3;
    548   }
    549   if (! expect_str (MHD_get_response_header (r, "Connection"),
    550                     "token-1, token-2, token-3, token-4"))
    551   {
    552     MHD_destroy_response (r);
    553     return 3;
    554   }
    555   if (MHD_YES != MHD_add_response_header (r, "Connection", "close, token-5"))
    556   {
    557     fprintf (stderr, "Cannot add \"Connection\" header with \"close\".\n");
    558     MHD_destroy_response (r);
    559     return 3;
    560   }
    561   if (! expect_str (MHD_get_response_header (r, "Connection"),
    562                     "close, token-1, token-2, token-3, token-4, token-5"))
    563   {
    564     MHD_destroy_response (r);
    565     return 3;
    566   }
    567   if (MHD_NO != MHD_del_response_header (r, "Connection",
    568                                          "non-existing, token-9"))
    569   {
    570     fprintf (stderr,
    571              "Non-existing tokens successfully removed from \"Connection\" header.\n");
    572     MHD_destroy_response (r);
    573     return 3;
    574   }
    575   if (! expect_str (MHD_get_response_header (r, "Connection"),
    576                     "close, token-1, token-2, token-3, token-4, token-5"))
    577   {
    578     MHD_destroy_response (r);
    579     return 3;
    580   }
    581   if (MHD_NO != MHD_add_response_header (r, "Connection",
    582                                          ",,,,,,,,,,,,    ,\t\t\t, , , "))
    583   {
    584     fprintf (stderr,
    585              "Empty token was added successfully to \"Connection\" header.\n");
    586     MHD_destroy_response (r);
    587     return 3;
    588   }
    589   if (MHD_YES != MHD_del_response_header (r, "Connection",
    590                                           "close, token-1, token-2, token-3, token-4, token-5"))
    591   {
    592     fprintf (stderr, "Cannot remove tokens from \"Connection\".\n");
    593     MHD_destroy_response (r);
    594     return 3;
    595   }
    596   if (! expect_str (MHD_get_response_header (r, "Connection"), NULL))
    597   {
    598     MHD_destroy_response (r);
    599     return 3;
    600   }
    601   if (MHD_NO != MHD_add_response_header (r, "Connection",
    602                                          ",,,,,,,,,,,,    ,\t\t\t, , , "))
    603   {
    604     fprintf (stderr,
    605              "Empty token was added successfully to \"Connection\" header.\n");
    606     MHD_destroy_response (r);
    607     return 3;
    608   }
    609   if (! expect_str (MHD_get_response_header (r, "Connection"), NULL))
    610   {
    611     MHD_destroy_response (r);
    612     return 3;
    613   }
    614 
    615   if (MHD_NO != MHD_add_response_header (r, "Connection", "keep-Alive"))
    616   {
    617     fprintf (stderr,
    618              "Successfully added \"Connection\" header with \"keep-Alive\".\n");
    619     MHD_destroy_response (r);
    620     return 4;
    621   }
    622   if (! expect_str (MHD_get_response_header (r, "Connection"), NULL))
    623   {
    624     MHD_destroy_response (r);
    625     return 4;
    626   }
    627   if (MHD_YES != MHD_add_response_header (r, "Connection", "keep-Alive, Close"))
    628   {
    629     fprintf (stderr,
    630              "Cannot add \"Connection\" header with \"keep-Alive, Close\".\n");
    631     MHD_destroy_response (r);
    632     return 4;
    633   }
    634   if (! expect_str (MHD_get_response_header (r, "Connection"), "close"))
    635   {
    636     MHD_destroy_response (r);
    637     return 4;
    638   }
    639   if (MHD_NO != MHD_add_response_header (r, "Connection", "keep-Alive"))
    640   {
    641     fprintf (stderr,
    642              "Successfully added \"Connection\" header with \"keep-Alive\".\n");
    643     MHD_destroy_response (r);
    644     return 4;
    645   }
    646   if (MHD_YES != MHD_add_response_header (r, "Connection", "keep-Alive, Close"))
    647   {
    648     fprintf (stderr,
    649              "Cannot add \"Connection\" header with \"keep-Alive, Close\".\n");
    650     MHD_destroy_response (r);
    651     return 4;
    652   }
    653   if (! expect_str (MHD_get_response_header (r, "Connection"), "close"))
    654   {
    655     MHD_destroy_response (r);
    656     return 4;
    657   }
    658   if (MHD_YES != MHD_add_response_header (r, "Connection",
    659                                           "close, additional-token"))
    660   {
    661     fprintf (stderr, "Cannot add \"Connection\" header with "
    662              "\"close, additional-token\".\n");
    663     MHD_destroy_response (r);
    664     return 4;
    665   }
    666   if (! expect_str (MHD_get_response_header (r, "Connection"),
    667                     "close, additional-token"))
    668   {
    669     MHD_destroy_response (r);
    670     return 4;
    671   }
    672   if (MHD_NO != MHD_add_response_header (r, "Connection", "keep-Alive"))
    673   {
    674     fprintf (stderr,
    675              "Successfully added \"Connection\" header with \"keep-Alive\".\n");
    676     MHD_destroy_response (r);
    677     return 4;
    678   }
    679   if (! expect_str (MHD_get_response_header (r, "Connection"),
    680                     "close, additional-token"))
    681   {
    682     MHD_destroy_response (r);
    683     return 4;
    684   }
    685   if (MHD_YES != MHD_del_response_header (r, "Connection",
    686                                           "additional-token,close"))
    687   {
    688     fprintf (stderr, "Cannot remove tokens from \"Connection\".\n");
    689     MHD_destroy_response (r);
    690     return 4;
    691   }
    692   if (! expect_str (MHD_get_response_header (r, "Connection"), NULL))
    693   {
    694     MHD_destroy_response (r);
    695     return 4;
    696   }
    697 
    698   if (MHD_YES != MHD_add_response_header (r, "Connection",
    699                                           "Keep-aLive, token-1"))
    700   {
    701     fprintf (stderr,
    702              "Cannot add \"Connection\" header with \"Keep-aLive, token-1\".\n");
    703     MHD_destroy_response (r);
    704     return 4;
    705   }
    706   if (! expect_str (MHD_get_response_header (r, "Connection"), "token-1"))
    707   {
    708     MHD_destroy_response (r);
    709     return 4;
    710   }
    711   if (MHD_YES != MHD_add_response_header (r, "Connection",
    712                                           "Keep-aLive, token-2"))
    713   {
    714     fprintf (stderr,
    715              "Cannot add \"Connection\" header with \"Keep-aLive, token-2\".\n");
    716     MHD_destroy_response (r);
    717     return 4;
    718   }
    719   if (! expect_str (MHD_get_response_header (r, "Connection"),
    720                     "token-1, token-2"))
    721   {
    722     MHD_destroy_response (r);
    723     return 4;
    724   }
    725   if (MHD_YES != MHD_add_response_header (r, "Connection",
    726                                           "Keep-aLive, token-3, close"))
    727   {
    728     fprintf (stderr,
    729              "Cannot add \"Connection\" header with \"Keep-aLive, token-3, close\".\n");
    730     MHD_destroy_response (r);
    731     return 4;
    732   }
    733   if (! expect_str (MHD_get_response_header (r, "Connection"),
    734                     "close, token-1, token-2, token-3"))
    735   {
    736     MHD_destroy_response (r);
    737     return 4;
    738   }
    739   if (MHD_YES != MHD_del_response_header (r, "Connection",
    740                                           "close"))
    741   {
    742     fprintf (stderr, "Cannot remove \"close\" tokens from \"Connection\".\n");
    743     MHD_destroy_response (r);
    744     return 4;
    745   }
    746   if (! expect_str (MHD_get_response_header (r, "Connection"),
    747                     "token-1, token-2, token-3"))
    748   {
    749     MHD_destroy_response (r);
    750     return 4;
    751   }
    752   if (MHD_YES != MHD_add_response_header (r, "Connection", "Keep-aLive, close"))
    753   {
    754     fprintf (stderr,
    755              "Cannot add \"Connection\" header with \"Keep-aLive, token-3, close\".\n");
    756     MHD_destroy_response (r);
    757     return 4;
    758   }
    759   if (! expect_str (MHD_get_response_header (r, "Connection"),
    760                     "close, token-1, token-2, token-3"))
    761   {
    762     MHD_destroy_response (r);
    763     return 4;
    764   }
    765   if (MHD_YES != MHD_del_response_header (r, "Connection",
    766                                           "close, token-1, Keep-Alive, token-2, token-3"))
    767   {
    768     fprintf (stderr, "Cannot remove \"close\" tokens from \"Connection\".\n");
    769     MHD_destroy_response (r);
    770     return 4;
    771   }
    772   if (! expect_str (MHD_get_response_header (r, "Connection"), NULL))
    773   {
    774     MHD_destroy_response (r);
    775     return 4;
    776   }
    777 
    778   if (MHD_YES != MHD_add_response_header (r, "Date",
    779                                           "Wed, 01 Apr 2015 00:00:00 GMT"))
    780   {
    781     fprintf (stderr,
    782              "Cannot add \"Date\" header with \"Wed, 01 Apr 2015 00:00:00 GMT\".\n");
    783     MHD_destroy_response (r);
    784     return 5;
    785   }
    786   if (! expect_str (MHD_get_response_header (r, "Date"),
    787                     "Wed, 01 Apr 2015 00:00:00 GMT"))
    788   {
    789     MHD_destroy_response (r);
    790     return 5;
    791   }
    792   if (MHD_YES != MHD_add_response_header (r, "Date",
    793                                           "Thu, 01 Apr 2021 00:00:00 GMT"))
    794   {
    795     fprintf (stderr,
    796              "Cannot add \"Date\" header with \"Thu, 01 Apr 2021 00:00:00 GMT\".\n");
    797     MHD_destroy_response (r);
    798     return 5;
    799   }
    800   if (! expect_str (MHD_get_response_header (r, "Date"),
    801                     "Thu, 01 Apr 2021 00:00:00 GMT"))
    802   {
    803     MHD_destroy_response (r);
    804     return 5;
    805   }
    806   if (MHD_YES != MHD_del_response_header (r, "Date",
    807                                           "Thu, 01 Apr 2021 00:00:00 GMT"))
    808   {
    809     fprintf (stderr, "Cannot remove \"Date\" header.\n");
    810     MHD_destroy_response (r);
    811     return 5;
    812   }
    813   if (! expect_str (MHD_get_response_header (r, "Date"), NULL))
    814   {
    815     MHD_destroy_response (r);
    816     return 5;
    817   }
    818 
    819   if (MHD_YES != MHD_add_response_header (r, MHD_HTTP_HEADER_TRANSFER_ENCODING,
    820                                           "chunked"))
    821   {
    822     fprintf (stderr,
    823              "Cannot add \"" MHD_HTTP_HEADER_TRANSFER_ENCODING \
    824              "\" header with \"chunked\".\n");
    825     MHD_destroy_response (r);
    826     return 6;
    827   }
    828   if (! expect_str (MHD_get_response_header (r,
    829                                              MHD_HTTP_HEADER_TRANSFER_ENCODING),
    830                     "chunked"))
    831   {
    832     MHD_destroy_response (r);
    833     return 6;
    834   }
    835   if (MHD_YES != MHD_add_response_header (r, MHD_HTTP_HEADER_TRANSFER_ENCODING,
    836                                           "chunked"))
    837   {
    838     fprintf (stderr,
    839              "Cannot add \"" MHD_HTTP_HEADER_TRANSFER_ENCODING \
    840              "\" second header with \"chunked\".\n");
    841     MHD_destroy_response (r);
    842     return 6;
    843   }
    844   if (! expect_str (MHD_get_response_header (r,
    845                                              MHD_HTTP_HEADER_TRANSFER_ENCODING),
    846                     "chunked"))
    847   {
    848     MHD_destroy_response (r);
    849     return 6;
    850   }
    851   if (MHD_NO != MHD_add_response_header (r, MHD_HTTP_HEADER_TRANSFER_ENCODING,
    852                                          "identity"))
    853   {
    854     fprintf (stderr,
    855              "Successfully added \"" MHD_HTTP_HEADER_TRANSFER_ENCODING \
    856              "\" header with \"identity\".\n");
    857     MHD_destroy_response (r);
    858     return 6;
    859   }
    860   if (! expect_str (MHD_get_response_header (r,
    861                                              MHD_HTTP_HEADER_TRANSFER_ENCODING),
    862                     "chunked"))
    863   {
    864     MHD_destroy_response (r);
    865     return 6;
    866   }
    867   if (MHD_YES != MHD_del_response_header (r, MHD_HTTP_HEADER_TRANSFER_ENCODING,
    868                                           "chunked"))
    869   {
    870     fprintf (stderr, "Cannot remove \"" MHD_HTTP_HEADER_TRANSFER_ENCODING \
    871              "\" header.\n");
    872     MHD_destroy_response (r);
    873     return 6;
    874   }
    875   if (! expect_str (MHD_get_response_header (r,
    876                                              MHD_HTTP_HEADER_TRANSFER_ENCODING),
    877                     NULL))
    878   {
    879     MHD_destroy_response (r);
    880     return 6;
    881   }
    882 
    883   MHD_destroy_response (r);
    884   printf ("All tests has been successfully passed.\n");
    885   return 0;
    886 }