To make it clear: MHD follow HTTP specifications and do not allow to use
two responses for single request.
--
Best Wishes,
Evgeny Grin
On 01.12.2016 17:07, Evgeny Grin wrote:
> On 01.12.2016 16:30, Daniel Tweed, Mr wrote:
>> On 01.12.2016 3:04, Daniel Tweed, Mr wrote:
>>>> I'm really new to libmicrohttpd and the examples/tutorial have been
>>>> really helpful, but I can't figure out how to implement one specific
>>>> thing I need.
>>>>
>>>> What I am trying to achieved is:
>>>>
>>>> 1.
>>>> Send http 102 to client who requested anydoc.html which requires
>>>> authentication
>>> HTTP standards doesn't define response code 102.
>>> See
https://tools.ietf.org/html/rfc7231#section-6
>>> and
https://tools.ietf.org/html/rfc2616#section-6.1.1
>>
>> It was defined in RFC 2518, which was updated/obsoleted by RFC 4918 for
>> WebDAV. Granted they removed http 102 from the specification (due to a
>> lack of implementation) and advise that its IANA registration should
>> continue to refer to RDF2518.
>> At a minimum, Firefox and IE respond correctly to this status code, and
>> it is implemented in libmicrohttpd as MHD_HTTP_PROCESSING
>
> I highly recommend you not to use obsoleted specifications - support in
> existing application can be dropped in any moment and new application
> most probably will not work with this code.
> So you will need to re-do your work one more time when clients
> unexpectedly start to refuse your server responses.
>
>>>> 2.
>>>> Some processing on the serverside, including out of band
>> authentication
>>>>
>>>> 3.
>>>> If authenticated, send response built from somedoc.html, otherwise
>>>> generic not auth message
>>
>>> HTTP use request-response logic. If you already responded (your code
>>> 102) to some request then you can't add another response later.
>>
>> The purpose of the http102 message is so the client will not timeout
>> when waiting for a response if the request will take a long time. Using
>> the MHD_HTTP_PROCESSING code requires some mechanism to first send a
>> response with this code and then send a final response. I just figure
>> out how or if this functionality has ever been implemented in the library.
>
> These is not grantee that client will wait more after 102.
> Moreover, chances of successful response even lower, if you take into
> account obsoleted nature of this status.
>
>>>> I'm having a failure of understanding somewhere, in that I cannot seem
>>>> to figure out how to send the 102 and save the connection details so
>>>> that I can forward the response in step 3. I had thought I could queue
>>>> a response then either enter a wait loop or suspend the connection, but
>>>> as far as I can tell I have to return from the
>>>> |MHD_AcceptPolicyCallback| for the response to be sent. Then I cannot
>>>> figure out how to get back to the connection as I cannot suspend it and
>>>> save the pointer. I have looked at the request completed call back but
>>>> this still results in the 102 not being sent.
>>>>
>>>> I really can't figure out a process to achieve these steps from the
>>>> examples or the manual. I'm sure I'm either missing something about
>>>> http processing or about libmicrohttpd any help or advice would be
>>>> appreciated. I'm happy to share anything that would make my question
>>>> clearer, including more details on the overall application or specific
>>>> code I am working with.
>>
>>> MHD_AcceptPolicyCallback could be used to choose whether to process
>>> connection or does not process connection at all.
>>
>>> You should ether call MHD_queue_response() from your callback
>>> MHD_AccessHandlerCallback specified in MHD_start_daemon() parameter or,
>>> if your application need some time to generate response - call
>>> MHD_suspend_connection(). When application is ready to generate response
>>> - call MHD_resume_connection(), then MHD will call again your
>>> MHD_AccessHandlerCallback where you can call MHD_queue_response() to
>>> provide response to client.
>>
>>> If you need some kind of authorization, you can use MHD built-in functions.
>>> See examples:
>>> src/examples/authorization_example.c
>>> src/examples/digest_auth_example.c
>>> and
>>> doc/examples/tlsauthentication.c
>>
>> Thanks, I took a look at these but I'm specifically looking at
>> out-of-and authentication. Since posting this, I found a discussion on
>> a similar topic on the IRC logs to use either keep-alive or
>> MHD_create_response_from_callback (). My concern is that I cannot know
>> how long the out-of-band authentication will take and I need to advise
>> the client not to time out. I need the http 102 message for other
>> reasons, but I could work around them, but it seems that this function
>> is implementable somehow, given that the code is defined, so I'm really
>> hoping not to have to rework my other applications around it.
>
> You can use MHD_create_response_from_callback() with MHD_SIZE_UNKNOWN
> and generate response by chunks. This will prevent clients from
> detecting of timeout.
>