libmicrohttpd
[Top][All Lists]
Advanced

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

Re: [libmicrohttpd] POST data processing


From: Christian Grothoff
Subject: Re: [libmicrohttpd] POST data processing
Date: Fri, 18 May 2018 13:16:12 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0

Dear Austin,

Please look at the code samples I pointed you towards. If you have XML
or JSON POST data, you must not use the MHD_PostProcessor API at all.

Happy hacking!

Christian

On 05/18/2018 09:25 AM, Austin Einter wrote:
> 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
> <address@hidden <mailto:address@hidden>> 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
>     <address@hidden <mailto:address@hidden>> 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
>         <address@hidden <mailto:address@hidden>> 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_httpuplds.c#L78
>             
> <https://github.com/risoflora/libbrook/blob/new_api/src/bk_httpuplds.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
>             <address@hidden <mailto:address@hidden>>
>             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
> 
> 
> 
> 

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

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