Ruediger Pluem schrieb:
On 05/20/2008 08:52 PM, Jeff Trawick wrote:
On Tue, May 20, 2008 at 8:56 AM, Rainer Jung <[EMAIL PROTECTED]> wrote:
It seems that httpd 2.0 and 2.2 require a non empty reason phrase in the
status line. RFC 2616 allows an empty reason phrase:

 6.1 Status-Line

 Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

 6.1.1 Status Code and Reason Phrase

 Reason-Phrase  = *<TEXT, excluding CR, LF>

Because of the star (*) I read this as "empty reason phrase is allowed".

right, there can be 0 repetitions

my bad ;)

Do you agree, that empty reason phrases should be allowed?

yes

If so, the below code fragments should be reviewed. I could provide the
(trivial) patch.

replace "<=" with "<"

Furthermore there is a second, related problem (for 2.x *and* 1.3): error pages use the status line as a title. If the line has an empty reason phrase *and* uses a custom http status code, error pages will show the title for
status code 500.

looks like this code:

Index: modules/http/http_protocol.c
===================================================================
--- modules/http/http_protocol.c        (revision 658385)
+++ modules/http/http_protocol.c        (working copy)
@@ -1235,12 +1235,12 @@
          * with the 3 digit status code
          */
         if (r->status_line != NULL
-            && strlen(r->status_line) > 4       /* long enough */
+            && strlen(r->status_line) >= 4       /* long enough */
             && apr_isdigit(r->status_line[0])
             && apr_isdigit(r->status_line[1])
             && apr_isdigit(r->status_line[2])
             && apr_isspace(r->status_line[3])

Do we really need to require the space in the case that the reason phrase is empty?

It seems the SPEC syntax for the status line requires the space. Since one can't be sure, what expressions the clients use to find the end of the status code, it would be safe to allow status lines with empty reason phrase and no space at the end, but to add the space at the end in this case.

-            && apr_isalnum(r->status_line[4])) {
+ && (r->status_line[4] == '\0' || apr_isalnum(r->status_line[4]))) {

I wonder what the reason was, to check only the first character of the reason phrase? I would have expected either a complete check, if it completely consists of "<TEXT, excluding CR, LF>", or no check at all.

             title = r->status_line;
         }

Regards,

Rainer

Reply via email to