libmicrohttpd
[Top][All Lists]
Advanced

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

Re: [libmicrohttpd] Keep-alive and POST method


From: silvioprog
Subject: Re: [libmicrohttpd] Keep-alive and POST method
Date: Fri, 6 Nov 2015 13:12:17 -0300

You are absolutely right! :-)

I did the same test using the MHD POST demo and it worked like a charm. But I need to read about "100 continue", because I don't know it yet.

Thank you very much and happy hacking! :-D

On Thu, Nov 5, 2015 at 8:51 PM, Christian Grothoff <address@hidden> wrote:
Hi!

Your server is to simplistic.

You're not handling the "100 continue" acceptably in the C code.
Essentially, by queuing a reply on the first callback, you tell MHD to
abort handling the POST (after all, your implementation also below never
processes the uploaded data, and it had no chance to do so).  And
because the POST is being *refused* (from MHD's perspective, even though
you return 200 OK), MHD gives you a "Connection: close" for free on top
(as otherwise we might be confused with the client's upload data that
we're now just dropping).

Try handling the POST data "for real" (RTFM, and/or look at actual
examples!), and then you'll get your keep-alive from MHD as well.

Happy hacking!

Christian


On 11/05/2015 11:43 PM, silvioprog wrote:
> Hello,
>
> Is the keep-alive feature compatible only with GET method? See this log
> below, it compares the headers from MHD and NodeJS:
>
> === NodeJS ===
>
> ...  GET ...
>
> $ curl -I http://127.0.0.1:8080
> HTTP/1.1 200 OK
> Content-Type: text/html
> Date: Thu, 05 Nov 2015 22:34:34 GMT
> *Connection: keep-alive*
>
> ... POST ...
>
> $ curl -X POST -I http://127.0.0.1:8080
> HTTP/1.1 200 OK
> Content-Type: text/html
> Date: Thu, 05 Nov 2015 22:36:45 GMT
> *Connection: keep-alive*
> Transfer-Encoding: chunked
>
> === NodeJS ===
>
> === MHD ===
>
> ... GET ...
>
> $ curl -I http://127.0.0.1:8080
> HTTP/1.1 200 OK
> Content-Length: 76
> Content-Type: text/html
> *Connection: keep-alive*
> Date: Thu, 05 Nov 2015 22:39:37 GMT
>
> ... POST ...
>
> $ curl -X POST -I http://127.0.0.1:8080
> HTTP/1.1 200 OK
> *Connection: close*
> Content-Length: 76
> Content-Type: text/html
> Date: Thu, 05 Nov 2015 22:41:20 GMT
>
> === MHD ===
>
> Source codes:
>
> helloworld_nodejs.js:
> -------
> const PORT = 8080;
> var http = require('http');
> var body = '<html><head><title>Hello world</title></head><body>Hello
> world</body></html>';
> http.createServer(function (req, res) {
>   res.writeHead(200, {'Content-Type': 'text/html'});
>   res.end(body);
> }).listen(PORT);
> console.log('Server is running on port ' + PORT);
> -------
>
> helloworld_mhd.c:
> -------
> #include <microhttpd.h>
> #include <string.h>
> #include <stdio.h>
>
> #define PORT 8080
> #define PAGE "<html><head><title>Hello world</title></head><body>Hello
> world</body></html>"
>
> static struct MHD_Response *response;
>
> static int ahc_echo(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 **ptr) {
>     return MHD_queue_response(connection, MHD_HTTP_OK, response);
> }
>
> int main(int argc, char *const *argv) {
>     struct MHD_Daemon *d;
>     response = MHD_create_response_from_buffer(strlen(PAGE), (void *) PAGE,
> MHD_RESPMEM_PERSISTENT);
>     (void) MHD_add_response_header(response, MHD_HTTP_HEADER_CONNECTION,
> "keep-alive");
>     (void) MHD_add_response_header(response, MHD_HTTP_HEADER_CONTENT_TYPE,
> "text/html");
>     d = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY,
>                          PORT, NULL, NULL, &ahc_echo, NULL,
>                          MHD_OPTION_END);
>     if (d == NULL)
>         return 1;
>     printf("Server is running on port %d", PORT);
>     getchar();
>     MHD_stop_daemon(d);
>     MHD_destroy_response(response);
>     return 0;
> }
> -------
>
> Thank you!

--
Silvio Clécio

reply via email to

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