HTTP.SYS and 100-Continue header

Here is an interesting case which I worked on sometime back.

This is something related to HTTP.SYS and I believe it is probably a bug.

Customer installed SP2 for Windows Server 2003 and since then his application failed.

In HTTPErr logfile we see Timer_EntityBody for the failed request and there are lots of Timer_MinBytesPerSecond.

Refer MSDN article Types of Errors Logged by the HTTP Server API to understand what do they mean.

Timer_EntityBody The connection expired before the request entity body arrived. When it is clear that a request has an entity body, the HTTP Server API turns on the Timer_EntityBody timer. The limit of this timer is initially set to the ConnectionTimeout value (normally 2 minutes). Each time another data indication is received on this request, the HTTP Server API resets the timer to give the connection an additional 2 minutes (or whatever is specified in ConnectionTimeout).
Timer_MinBytesPerSecond The connection expired because the client was not receiving a response at a reasonable speed, which means that the response send rate was slower than the default of 150 bytes/sec.

We took the network trace and looking carefully we found packets in which there is no reply from the server and there is no further data posted by the client.

Here client is sending “Expect: 100-Continue” header and its sending “C” in upper case. Within HTTP.SYS compare for the string is case sensitive which I believe it should not be. Since “C” is in upper case, HTTP.SYS does not recognize the header and so never replies with a 100-Continue response and so the client never sends the POST data.

As of now there are two ways how this can be fixed:

  • Don’t send a 100-Continue header
  • Change the case to all lower case.

Last time I heard the product group was working on this and if they confirm this to be a bug, we should soon have a Knowledge Base article and probably a hotfix around it.