libmicrohttpd
[Top][All Lists]
Advanced

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

Re: [libmicrohttpd] How to process a post request without MHD_post_proce


From: Christian Grothoff
Subject: Re: [libmicrohttpd] How to process a post request without MHD_post_processor?
Date: Wed, 25 Apr 2012 16:22:20 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.3) Gecko/20120329 Icedove/10.0.3

Dear Martin,

The first call to the "test_send_response_helper" is made *before* the
upload data is available (after we just got the headers) so that you can
choose not to send 100 CONTINUE for http/1.1.  You need to change your
function to return an 'int' and return 'MHD_YES' to get the next call
which will contain upload data.  Furthermore, 'upload_data' is NOT a
0-terminated string so you *must* limit your processing manually to the
first '*upload_data_size' bytes in that buffer.  Finally, you then need
to reduce '*upload_data_size'  (i.e. to zero) to indicate how many bytes
of 'upload_data' you did process (so you don't get them again). 
Finally, if you are eventually called  a *second* time with '0 ==
*upload_data_size', you can be sure that the upload is complete.

If you respect these rules (which, btw, the PostProcessor examples also
do), you can totally manually process a POST request in any way you see fit.


Happy hacking!

Christian

On 04/24/2012 10:42 PM, Martin Dluhos wrote:
> Hi,
>
> I am trying to send a post request to MHD_Daemon and then access the
> post data from the request in MHD_AccessHandlerCallback function which
> MHD_Daemon calls when it receives the request. For some reason,
> however, I am unable to access the post data from the callback
> function. Do I always need to use MHD_PostProcessor to process the
> post data or can I do without it? Here is my code:
>
> void
> test_send_response_helper (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)
> {
>   int ret_val;
>
>   // print url and upload_data
>   printf ("URL: %s\nDATA: %s\n", url, upload_data);
> }
>
> void
> test_send_response ()
> {
>   long int ssl_port = 443;
>   struct MHD_Daemon *ssl_daemon;
>
>   ssl_daemon = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION,
>                              ssl_port,
>                              NULL,
>                              NULL,
>                              &test_send_response_helper,
>                              NULL,
>                              MHD_OPTION_NOTIFY_COMPLETED,
>                              request_completed,
>                              NULL,
>                              MHD_OPTION_END
>                              );
>
>   CURL *curl;
>   CURLcode res;
>
>   /* Initialize curl. */
>   curl_global_init(CURL_GLOBAL_ALL);
>   curl = curl_easy_init();
>
>   /* Set curl options. */
>   if (curl)
>   {
>     char* data_to_send = "field_name=value";
>
>     /* We want to send a test request to the daemon. */
>     curl_easy_setopt(curl, CURLOPT_URL,
> "http://localhost/target/www.wikipedia.org+443";);
>     curl_easy_setopt(curl, CURLOPT_PORT, ssl_port);
>     curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data_to_send);
>     curl_easy_setopt(curl, CURLOPT_POST, 1L);
>
>     /* Make the curl request. */
>     res = curl_easy_perform(curl);
>   }
> ...
> }
>
> When I call test_send_response(), I get the following output from the
> printf statement:
>
> $ ./test
> URL: /target/www.wikipedia.org 443
> DATA: (null)
>
> I would like to retrieve whatever is passed as data_to_send with curl,
> but instead I am getting (null). How can I access the data? Am I wrong
> to expect the post data curl sends to be stored in the upload_data
> variable in test_send_response_helper? What am I doing wrong?
>
> Thanks,
> Martin
>



Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

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