[Top][All Lists]
[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
>
signature.asc
Description: OpenPGP digital signature