Dear All
I am getting data in access content callback.
I can do my own parsing.

To get body data, independent chunks through iterate callback (NOT access
content callback), I have issues.

In some cases, post process create fails (returns null).
In some cases, post process is created, but when I call post process api,
iterate callback is not called.

Are you telling that
1) always post process create will succeed (irrespective of xml / json /
binary body)
2) if post process is created, on calling post process api, iterate
callback is called.

Once I get sometime (sorry, but really occupied), will put a small code and
share.

Regards
Austin



On Thu, May 17, 2018 at 8:24 PM, Kenneth Mastro <[email protected]>
wrote:

> Unless something broke in a very recent version, POST definitely works
> with JSON data.  I do it all the time.  I could be wrong, but I suspect MHD
> does not care about the data type at all.
>
> I very strongly suspect the problem is in your code or your test.  Since
> it works with form data, are you sure your request is getting sent as a
> proper 'POST' when you're trying with XML or JSON?
>
> Just a thought - are you just trying to use MHD's post-processor to
> process the data like you do with form data?  In that case - no, MHD does
> not PARSE the JSON or XML (like it can with form data).  You have to do
> that yourself or use a third party library (but either way, you have to
> capture the data from MHD and do something with it on your own).
>
>
> Ken
>
>
> On Thu, May 17, 2018 at 10:33 AM, Austin Einter <[email protected]>
> wrote:
>
>> Hello
>> When I tried, if content type is xml, post processor crate failed (it
>> returned null).
>> When content type is binary, it created post processor, however when I
>> call post process api, the iterate callback not called.
>>
>> That made me to search google.
>> Somewhere I read it does not support xml and json.
>>
>> Data I am getting in access content callback, however my iterate callback
>> is not called.
>> Please note that same code is working for text data (file upload or form
>> data).
>>
>> Thanks
>> Austin
>>
>>
>>
>>
>> On Thu, May 17, 2018 at 6:56 PM, silvioprog <[email protected]> wrote:
>>
>>> Hello Austin,
>>>
>>> As Christian explained, via "upload_data" you can receive any payload
>>> kind. I'm writting a library which maps MHD callbacks to "objects" and it
>>> needs to support the following features:
>>>
>>> 1. receive one or more files *on demand* (to receive large files about
>>> 5 GB+ without "frying" CPU/RAM) in same request (files via form-data);
>>> 2. receive form fields (HTML-form fields via x-www-form-urlencoded);
>>> 3. 1 and 2 (both files and fields via form-data);
>>> 4. payload contents (raw-data, json/xml and so on via
>>> application/<type>);
>>> 5. handlers to create customized 'body-parser' if none of the above
>>> options fits.
>>>
>>> it seems the option 4 above is the one you are looking for. For example,
>>> supposing you need to send a JSON "{"foo":"bar"}" to the server, in the
>>> client:
>>>
>>> curl -X POST -H "Content-Type: application/json" -d '{"foo":"bar"}'
>>> http://localhost:8080
>>>
>>> and in a minimal snipped server example, you can receive it as:
>>>
>>> ...
>>>
>>> static void req_cb(void *cls, struct bk_httpreq *req, struct bk_httpres
>>> *res) {
>>>     struct bk_str *payload = bk_httpreq_payload(req);
>>>     printf("Payload string: %s; Size: %zd", bk_str_content(payload),
>>> bk_str_length(payload));
>>>     ...
>>> }
>>>
>>> int main(void) {
>>>     struct bk_httpsrv *srv = bk_httpsrv_new(req_cb, NULL);
>>>     bk_httpsrv_listen(srv, 8080, false);
>>>     ...
>>> }
>>>
>>> ...
>>>
>>> then it prints "Payload string: {"foo":"bar"}; Size: 13" in the
>>> terminal. The "payload" variable above is an instance of the object
>>> "bk_str" which contains useful "methods" for string handling like
>>> "content", "length", "clear", "printf" and more.
>>>
>>> If you want to take a look how it was implemented, please use the branch
>>> "*new_api*" and specifically the line 78 from bk_httpuplds.c file:
>>>
>>> https://github.com/risoflora/libbrook/blob/new_api/src/bk_ht
>>> tpuplds.c#L78
>>>
>>> hope this help you.
>>>
>>> (the library is under development, so there is parts undocumented yet
>>> but feel free to send any questions via Github issues)
>>>
>>> On Thu, May 17, 2018 at 1:52 AM, Austin Einter <[email protected]>
>>> wrote:
>>>
>>>> Hello
>>>> I am using libmicrohttpd and facing issue with POST processing.
>>>>
>>>> The POST message received contains xml or json data. libmicrohttpd does
>>>> not support xml / json. So I can not use post process or iterate callbacks
>>>> for body data processing. In fact I tried and it does not work (iterate
>>>> callbacks not called even when I call post process).
>>>>
>>>> So I am left with two options.
>>>>
>>>> 1) Either write body parser, where I need to take care of
>>>> content-length case, chunked data case etc.
>>>>
>>>> 2) OR use http-parser kind of open source
>>>>
>>>> Is there any other option available?
>>>>
>>>> I am not very pro to write my own parser, instead I would like to use
>>>> http-parser. I just looked at http-parser. To use http-parser, we need to
>>>> provide the entire message to http-parser, either single time or one chunk
>>>> at a time.
>>>>
>>>>
>>>> Is there anyway in libmicrohttpd, I can collect the entire POST message
>>>> as it comes / received at socket level?
>>>>
>>>> If possible, kindly provide required steps / info.
>>>>
>>>> Best Regards
>>>> Austin
>>>>
>>>
>>> --
>>> Silvio Clécio
>>>
>>
>>
>

Reply via email to