Hi,
I modified the above snippet to:
if (upload_data_size && *upload_data_size != 0)
{
pCr->reqData << std::string(upload_data, *upload_data_size);
*upload_data_size = 0;
return MHD_YES;
}
which avoids 1 extra callback by MHD as opposed to earlier, till now tests
looks positive.
Thanks,
Kunal
On Tue, Nov 13, 2018 at 12:55 AM Kunal Ekawde <[email protected]> wrote:
> Hi Christian,
>
> I have following code snippet:
> pCr is of type ConnectionRsp -- a structure to hold the request data for
> mapping on 2nd invocation of access handler callback.
> 'parsingReqData' is set to false initially and not updated anywhere else
> apart from following mentioned.
>
> if (!pCr->parsingReqData)
> {
> if (upload_data_size && *upload_data_size != 0)
> {
> pCr->parsingReqData = true;
> *ptr = pCr;
> return MHD_YES;
> }
> else
> std::cout<< "Incoming req, doesnt have data, continue..";
> }
> else
> {
> if (*upload_data_size != 0)
> {
> // Receive the post data and write them into the bufffer
> pCr->reqData << std::string(upload_data, *upload_data_size);
> *upload_data_size = 0;
> return MHD_YES;
> }
> else
> {
> // *upload_data_size == 0 so all data have been received
> std::cout<<"Incoming req,received data:"<<pCr->reqData.str());
> pCr->parsingReqData = false;
> }
> }
>
> Do you see any issue in this ?
>
> Thanks,
> Kunal
>
> On Tue, Nov 13, 2018 at 12:05 AM Christian Grothoff <[email protected]>
> wrote:
>
>> Hi Kunal,
>>
>> The most common bug in this context is that you MUST set
>> "*upload_data_size = 0" (or to however many bytes are left) within your
>> httpServerAccessHandlerCb. Failure to do so will mean that MHD won't
>> read more of the upload. That's at least my best guess, as you only
>> provided a code fragment.
>>
>> happy hacking!
>>
>> Christian
>>
>> On 11/12/18 2:24 PM, Kunal Ekawde wrote:
>> > Hi Christian,
>> >
>> > I'm using following options, single threaded external epoll:
>> > auto mhdDaemon = MHD_start_daemon (MHD_USE_EPOLL |
>> > MHD_ALLOW_SUSPEND_RESUME | MHD_USE_ERROR_LOG |
>> > *MHD_USE_TURB*O | MHD_USE_DEBUG,
>> > 0,
>> > NULL, NULL, &Server::httpServerAccessHandlerCb, this,
>> > MHD_OPTION_SOCK_ADDR, &addr,
>> > MHD_OPTION_CONNECTION_TIMEOUT, MHD_DEF_CONN_TIMEOUT,
>> > MHD_OPTION_CONNECTION_LIMIT, maxConcrrntConn,
>> > MHD_OPTION_EXTERNAL_LOGGER, &Server::httpServerErrorHandler,
>> > this,
>> > MHD_OPTION_NOTIFY_COMPLETED,
>> > &Server::httpServerRequestCompleted, this,
>> > MHD_OPTION_END);
>> >
>> > Observing that MHD is not processing the upload data for *few(other
>> > request are successfully completed) *of the requests when there is data
>> > associated with it. e.g PUT/GET/DELETE with data < approx 2KB.
>> > logs for ref:
>> > httpServerRequestCompleted:940: Request complete on txn:3522
>> termCode:0\"}
>> >
>> > httpServerAccessHandlerCb:653: Incoming req, inserting txnId:3523 in
>> > map\"} -- new request
>> > httpServerAccessHandlerCb:671: Incoming req, upload data size:1607\"}
>> > httpServerRequestCompleted:940: Request complete on txn:3523
>> > termCode:5\"} -- doesn't process the uploaded data eventually error
>> > when client(libcurl) times out.
>> >
>> > httpServerAccessHandlerCb:653: Incoming req, inserting txnId:3524 in
>> map\"}\
>> >
>> > Do you see any issue ?
>> >
>> > Regards,
>> > Kunal
>> >
>> >
>> > On Sun, Sep 9, 2018 at 4:02 PM Christian Grothoff <[email protected]
>> > <mailto:[email protected]>> wrote:
>> >
>> > On 09/06/2018 08:19 AM, Kunal Ekawde wrote:
>> > >
>> > > Can you please provide some information on 'MHD_USE_TURBO' as I
>> > couldn't
>> > > find any info in manual.
>> >
>> > From the manual:
>> >
>> > @item MHD_USE_TURBO
>> > @cindex performance
>> > Enable optimizations to aggressively improve performance.
>> >
>> > Currently, the optimizations this option enables are based on
>> > opportunistic reads and writes. Bascially, MHD will simply try to
>> > read or write or accept on a socket before checking that the socket
>> is
>> > ready for IO using the event loop mechanism. As the sockets are
>> > non-blocking, this may fail (at a loss of performance), but
>> generally
>> > MHD does this in situations where the operation is likely to
>> succeed,
>> > in which case performance is improved. Setting the flag should
>> > generally
>> > be safe (even though the code is slightly more experimental). You
>> may
>> > want to benchmark your application to see if this makes any
>> difference
>> > for you.
>> >
>> >
>> >
>> >
>> > --
>> > ~Kunal
>>
>>
>
> --
> ~Kunal
>
--
~Kunal