libmicrohttpd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [libmicrohttpd] not getting a keep-alive session from MHD


From: Christian Grothoff
Subject: Re: [libmicrohttpd] not getting a keep-alive session from MHD
Date: Mon, 28 Jun 2021 20:33:54 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.12.0

Hi tz,

You're answering too early. Try (for minimalistic test, not for good style):


static enum MHD_Result
answer_to_connection (void *cls, struct MHD_Connection *connection,
                      const char *url, const char *method,
                      const char *version, const char *upload_data,
                      size_t *upload_data_size, void **con_cls)
{
  if (NULL == *con_cls)
  {
    *con_cls = "foo";
    return MHD_YES;
  }
  // continue as before


That should do the trick. And yes, the API is counter-intuitive here,
especially for simple GET calls.  The reason is that the first request
is for responding to 'Expect: 100 continue' and error replies _only_.
Which I guess for GET is quite odd. But once you handle POSTs and start
to keep state in *con_cls, it'll be more natural.

Happy hacking!

Christian

On 6/28/21 5:49 PM, tz@objectiveapps.net wrote:
> Hello,
> 
> I've compiled one of the first MHD examples and I'm struggeling how to
> get a keep-alive session. From my understanding, MHD should always
> respond with Connection: keep-alive, as long as not getting a
> Connection: close in the request. Here is my code:
> 
> --------------------------
> #include <sys/types.h>
> #ifndef _WIN32
> #include <sys/select.h>
> #include <sys/socket.h>
> #else
> #include <winsock2.h>
> #endif
> #include <string.h>
> #include <microhttpd.h>
> #include <stdio.h>
> 
> #define PORT 8888
> 
> static enum MHD_Result
> answer_to_connection (void *cls, struct MHD_Connection *connection,
>                       const char *url, const char *method,
>                       const char *version, const char *upload_data,
>                       size_t *upload_data_size, void **con_cls)
> {
>     const char *page = "<html><body>Hello, browser!</body></html>";
>     struct MHD_Response *response;
>     enum MHD_Result ret;
>     (void) cls;               /* Unused. Silent compiler warning. */
>     (void) url;               /* Unused. Silent compiler warning. */
>     (void) method;            /* Unused. Silent compiler warning. */
>     (void) version;           /* Unused. Silent compiler warning. */
>     (void) upload_data;       /* Unused. Silent compiler warning. */
>     (void) upload_data_size;  /* Unused. Silent compiler warning. */
>     (void) con_cls;           /* Unused. Silent compiler warning. */
> 
>     response =
>             MHD_create_response_from_buffer (strlen (page), (void *) page,
> MHD_RESPMEM_PERSISTENT);
>     MHD_add_response_header(response, MHD_HTTP_HEADER_CONNECTION,
> "keep-alive");
>     ret = MHD_queue_response (connection, MHD_HTTP_OK, response);
>     MHD_destroy_response (response);
>     return ret;
> }
> 
> int main (void)
> {
>     struct MHD_Daemon *daemon;
>     daemon = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION,
>                                PORT, NULL, NULL,
>                                &answer_to_connection, NULL,
>                                MHD_OPTION_END);
>     if (NULL == daemon)
>         return 1;
>     (void) getchar ();
>     MHD_stop_daemon (daemon);
>     return 0;
> }
> --------------------------
> 
> 
> I'm calling the server from curl with the following command:
> 
>> curl -v 192.168.178.70:8888 -H "Connection: keep-alive"
> 
> Curl output is as follows:
> 
> 
>> GET / HTTP/1.1
>> Host: 192.168.178.70:8888
>> User-Agent: curl/7.66.0
>> Accept: */*
>> Connection: keep-alive
>>
> 
> < HTTP/1.1 200 OK
> < Connection: close
> < Content-Length: 41
> < Date: Mon, 28 Jun 2021 15:44:19 GMT
> <
> * Closing connection 0
> 
> 
> 
> As you can see, Curl asks for a keep-alive connection, MHD answers with
> Connection: close. Im getting the same result when using a browser
> (chrome) and inspecting the packets.
> 
> Obviously, I'm doing something wrong. But what?
> 
> Thanks in advance,
> Thomas
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]