[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [libmicrohttpd] MHD_PostDataIterator issue
From: |
Ovidiu Sas |
Subject: |
Re: [libmicrohttpd] MHD_PostDataIterator issue |
Date: |
Wed, 6 Feb 2013 16:21:11 -0500 |
OK. I think I got it now. The way that I use the library (no
pthread, single process) it's a little bit particular.
I got everything that I need for now. If I have more questions, I will ask.
Thank you for your work and quick reply :)
-ovidiu
On Wed, Feb 6, 2013 at 3:55 PM, Christian Grothoff <address@hidden> wrote:
> Well, it is working, just not the way your implementation may think it
> should ;-). Given that we cannot rely in even _having_ upload_data_size
> (the browser may not have set content-length), the only sane choice for
> giving such a value back from the post processor to the application is
> within its destructor/destroy method --- before then, there are simply
> always circumstances under which more data (an actual value!) might
> still be given to the post processor.
>
> So what you need to do is NOT call the 'MHD_destroy_post_processor'
> function _after_ generating the response, but *before*. You do this by
> waiting until your response handler is called for a second time (for the
> same request) with "*upload_data_size == 0". Then *you* can be certain
> that the upload is done (remember, the upload may be large and not be
> given to MHD in a single network packet!), and thus you can call the PP
> destroy method at that time. After the PP has been destroyed (and only
> then!), you can be sure that the callback you gave to the PP won't be
> called with additional key-value pairs, and proceed to generate your
> response.
>
> I realize that calling the callback one last time in the PP destroy
> method is, eh, 'unexpected', but it is the intended behavior and after
> careful consideration on my part the only _correct_ solution that works
> in all cases that I could find.
>
> Happy hacking!
>
> -Christian
>
> On 02/06/2013 09:15 PM, Ovidiu Sas wrote:
>> Hi,
>>
>> After paying more attention to my logs, I realized that it's still not
>> working.
>> I got tricked by the fact that the post iterator is run during it's
>> destruction.
>>
>> In my application I see hat the MHD_post_process is called with
>> upload_data_size=4 (which is 'arg=') but the post iterator callback
>> function is never called from within the library.
>> Then after the reply is sent and the MHD_destroy_post_processor is
>> called, the post iterator callback is invoked (and here I got tricked
>> previously thinking that it's working).
>>
>>
>> Regards,
>> Ovidiu Sas
>>
>>
>> On Wed, Feb 6, 2013 at 11:08 AM, Ovidiu Sas <address@hidden> wrote:
>>> Hmm ..., I checked the archive before posting but it seems that I
>>> missed that report.
>>> Anyway, I tested the new release and everything seems to be working fine.
>>>
>>> Thanks,
>>> Ovidiu
>>>
>>> On Tue, Feb 5, 2013 at 7:53 PM, Christian Grothoff <address@hidden> wrote:
>>>> Dear Ovidiu,
>>>>
>>>> The issue was discussed on this list a few days ago and fixed Feb 1st.
>>>>
>>>> I've now released GNU libextractor 0.9.25 with the fix.
>>>>
>>>>
>>>> Happy hacking!
>>>>
>>>> Christian
>>>>
>>>> On 02/05/2013 10:31 PM, Ovidiu Sas wrote:
>>>>> Hello all,
>>>>>
>>>>> I'm trying to use the library to handle simple POST requests.
>>>>> During the implementation, I discovered an issue: if the post request
>>>>> has one single key with no value, the MHD_PostDataIterator is not
>>>>> invoked.
>>>>> Here's an example of such post:
>>>>> POST /mi/core/uptime HTTP/1.1.
>>>>> Host: 192.168.2.60.
>>>>> User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101
>>>>> Firefox/18.0.
>>>>> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8.
>>>>> Accept-Language: en-US,en;q=0.5.
>>>>> Accept-Encoding: gzip, deflate.
>>>>> DNT: 1.
>>>>> Referer: http://192.168.2.60/mi/core/uptime.
>>>>> Connection: keep-alive.
>>>>> Content-Type: application/x-www-form-urlencoded.
>>>>> Content-Length: 4.
>>>>> .
>>>>> arg=
>>>>>
>>>>> The following post request is properly processed (MHD_PostDataIterator
>>>>> is invoked):
>>>>> POST /mi/core/uptime HTTP/1.1.
>>>>> Host: 192.168.2.60.
>>>>> User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101
>>>>> Firefox/18.0.
>>>>> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8.
>>>>> Accept-Language: en-US,en;q=0.5.
>>>>> Accept-Encoding: gzip, deflate.
>>>>> DNT: 1.
>>>>> Referer: http://192.168.2.60/mi/core/uptime.
>>>>> Connection: keep-alive.
>>>>> Content-Type: application/x-www-form-urlencoded.
>>>>> Content-Length: 8.
>>>>> .
>>>>> arg=blah
>>>>>
>>>>>
>>>>> I am using the library in single threaded mode (MHD_NO_FLAG) with select.
>>>>> The version that I tested is 0.9.24.
>>>>> The library is integrated into the opensips project and it is handling
>>>>> GET requests.
>>>>> http://opensips.svn.sourceforge.net/viewvc/opensips/trunk/modules/httpd/
>>>>> I am looking to add POST request handling.
>>>>>
>>>>> I haven't check the libmicrohttpd source code yet ... just wanted to
>>>>> know first if this is a known issue.
>>>>>
>>>>>
>>>>> Regards,
>>>>> Ovidiu Sas