ID:               17098
 Comment by:       [EMAIL PROTECTED]
 Reported By:      [EMAIL PROTECTED]
 Status:           Analyzed
 Bug Type:         Apache2 related
 Operating System: linux
 PHP Version:      4.0CVS-2002-10-17
 New Comment:

Maybe I missed something.  What patch?  Is this still a php bug?  I
have Apache 2.0.40 and php-4.4-2.


Previous Comments:
------------------------------------------------------------------------

[2002-10-18 06:34:46] [EMAIL PROTECTED]

I tried a patch submited by [EMAIL PROTECTED]
and it seems to solve the problem. I don't know to what extent, but the
logic of it seems ok to me...

------------------------------------------------------------------------

[2002-10-18 05:43:08] [EMAIL PROTECTED]

Ok. We should do something about this bug, I suppose.

Mail from Ryou Takagi
========= BEGIN ========
Yasuo Ohgaki wrote:

> Ilia A. wrote:

> >>Summary: Apache2 sending 304 - not modified header
> >>http://bugs.php.net/bug.php?id=17098
> >>
> >>This is serious problem for serious sites.
> >>(Serious sites shouldn't use Apache2, though)

> > 
> > 
> > This looks like an Apache 2 bug, rather then aPHP one. I am
guessing the fix 
> > they made did not work properly.

> 
> Great!
> Then we can just wait their fix :)


I am afraid this is not the case. This is the report of the status.

As from Apache 2.0.40, the API of the filter registration functions
has changed. The changelog says:

--- From Apache Changelog: in section "Changes with Apache 2.0.40" ---
  *) Add a filter_init parameter to the filter registration functions
     so that a filter can execute arbitrary code before the handlers
     are invoked.  This resolves a problem where mod_include requests
     would incorrectly return a 304.  [Justin Erenkrantz]
--- End quotation from Apache Changelog ---

And the current mod_include.c in Apache 2.0.43 source tree uses this
API like this:

--- From modules/filters/mod_include.c in Apache 2.0.43 source tree
---
static int includes_setup(ap_filter_t *f)
{
    include_dir_config *conf =
               (include_dir_config
*)ap_get_module_config(f->r->per_dir_config,
                                                         
&include_module);

    /* When our xbithack value isn't set to full or our platform isn't
     * providing group-level protection bits or our group-level bits do
not
     * have group-execite on, we will set the no_local_copy value to 1
so
     * that we will not send 304s.
     */
    if ((*conf->xbithack != xbithack_full)
        || !(f->r->finfo.valid & APR_FINFO_GPROT)
        || !(f->r->finfo.protection & APR_GEXECUTE)) {
        f->r->no_local_copy = 1;
    }

    return OK;
}

/* Note from TAKAGI: several lines omitted */

static void register_hooks(apr_pool_t *p)
{
    APR_REGISTER_OPTIONAL_FN(ap_ssi_get_tag_and_value);
    APR_REGISTER_OPTIONAL_FN(ap_ssi_parse_string);
    APR_REGISTER_OPTIONAL_FN(ap_register_include_handler);
    ap_hook_post_config(include_post_config, NULL, NULL,
APR_HOOK_REALLY_FIRST);
    ap_hook_fixups(include_fixup, NULL, NULL, APR_HOOK_LAST);
    ap_register_output_filter("INCLUDES", includes_filter,
includes_setup,
                              AP_FTYPE_RESOURCE);
}
--- End quotation from modules/filters/mod_include.c ---

And Justin Erenkrantz himself stated in the email as follows:
http://www.phpbuilder.com/mail/php-developer-list/2002062/0392.php
  "I will try to work on a more complete fix for PHP this weekend 
   as it is susceptable to the same invalid 304 problem mod_include 
   was. (Just create a simple filter_init function that always sets 
   r->no_local_copy to 1.)"

So, I do believe that some modification is necessary where the
sapi/apache2filter/sapi_apache2.c calls API functions
ap_register_{input|output}_filter(...). What I am not sure is whether
it
is necessary to modify both the "input" and "output" functions or not.



To reproduce the problem:

The script:
--- Script test.phtml ---
<?php
$fmt = filemtime ( $_SERVER [ 'SCRIPT_FILENAME' ] ) ;
$ludate = $fmt + 600 ;
header ( "content-type: text/html; charset=ISO-8859-1" ) ;
header ( "Last-Modified: " . gmdate ( 'D, d M Y H:i:s \G\M\T', $ludate
) ) ;
print ( "<html><head><title>Test</title></head><body>\n" ) ;
print ( "File timestamp: " . gmdate ( 'D, d M Y H:i:s \G\M\T', $fmt ) )
;
print ( "<br>" ) ;
print ( "Last updated: " . gmdate ( 'D, d M Y H:i:s \G\M\T', $ludate )
) ;
print ( "</body></html>\n" ) ;
?>
--- End script ---

Set the timestamp of the script file properly.

If you access the script using a browser, it displays:

--- Browser displays ---
File timestamp: Fri, 18 Oct 2002 09:00:00 GMT
Last updated: Fri, 18 Oct 2002 09:10:00 GMT
--- End browser displays ---

Access the server using "telnet":

--- Telnet servername http requests and results before patch ---
[rt@ns rt]$ telnet localhost http
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HEAD /test.phtml HTTP/1.1
Host: localhost.localdomain

HTTP/1.1 200 OK
Date: Fri, 18 Oct 2002 09:22:11 GMT
Server: Apache/2.0.43 (Unix) mod_ssl/2.0.43 OpenSSL/0.9.6g
PHP/4.3.0-dev
Accept-Ranges: bytes
X-Powered-By: PHP/4.3.0-dev
Last-Modified: Fri, 18 Oct 2002 09:10:00 GMT
Content-Type: text/html; charset=ISO-8859-1

HEAD /test.phtml HTTP/1.1
Host: localhost.localdomain
If-Modified-Since: Fri, 18 Oct 2002 08:59:00 GMT

HTTP/1.1 200 OK
Date: Fri, 18 Oct 2002 09:22:21 GMT
Server: Apache/2.0.43 (Unix) mod_ssl/2.0.43 OpenSSL/0.9.6g
PHP/4.3.0-dev
Accept-Ranges: bytes
X-Powered-By: PHP/4.3.0-dev
Last-Modified: Fri, 18 Oct 2002 09:10:00 GMT
Content-Type: text/html; charset=ISO-8859-1

HEAD /test.phtml HTTP/1.1
Host: localhost.localdomain
If-Modified-Since: Fri, 18 Oct 2002 09:01:00 GMT

HTTP/1.1 304 Not Modified
Date: Fri, 18 Oct 2002 09:22:41 GMT
Server: Apache/2.0.43 (Unix) mod_ssl/2.0.43 OpenSSL/0.9.6g
PHP/4.3.0-dev
ETag: "8598-1e2-ca628400"

--- End Telnet ---

As is evident in the last response from the server, the
If-Modified-Since: header is not properly processed.

After the patch is applied, the problem disappears:

--- Telnet servername http requests and results after patch ---
[rt@ns rt]$ telnet localhost http
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HEAD /test.phtml HTTP/1.1
Host: localhost.localdomain

HTTP/1.1 200 OK
Date: Fri, 18 Oct 2002 09:18:00 GMT
Server: Apache/2.0.43 (Unix) mod_ssl/2.0.43 OpenSSL/0.9.6g
PHP/4.3.0-dev
Accept-Ranges: bytes
X-Powered-By: PHP/4.3.0-dev
Last-Modified: Fri, 18 Oct 2002 09:10:00 GMT
Content-Type: text/html; charset=ISO-8859-1

HEAD /test.phtml HTTP/1.1
Host: localhost.localdomain
If-Modified-Since: Fri, 18 Oct 2002 09:09:00 GMT

HTTP/1.1 200 OK
Date: Fri, 18 Oct 2002 09:18:19 GMT
Server: Apache/2.0.43 (Unix) mod_ssl/2.0.43 OpenSSL/0.9.6g
PHP/4.3.0-dev
Accept-Ranges: bytes
X-Powered-By: PHP/4.3.0-dev
Last-Modified: Fri, 18 Oct 2002 09:10:00 GMT
Content-Type: text/html; charset=ISO-8859-1

--- End Telnet ---

The test result was obtained using CVS 20021018 (today's one). The
system used is Red Hat Linux 6.2.

Regards
Ryo

-- R Takagi <[EMAIL PROTECTED]> 

------------------------------------------------------------------------

[2002-10-17 19:27:08] [EMAIL PROTECTED]

It would be Apache2 bug

------------
On October 17, 2002 07:06 pm, Yasuo Ohgaki wrote:

> Andrei Zmievski wrote:

> > Hi,
> >
> > We have 10 critical bugs in the list currently. If you could please
see
> > about fixing at least one of them, we'd be that much closer to a
release
> > candidate.

>
> Summary: Apache2 sending 304 - not modified header
> http://bugs.php.net/bug.php?id=17098
>
> This is serious problem for serious sites.
> (Serious sites shouldn't use Apache2, though)


This looks like an Apache 2 bug, rather then aPHP one. I am guessing
the fix 
they made did not work properly.

Ilia




------------------------------------------------------------------------

[2002-10-17 17:54:43] [EMAIL PROTECTED]

Although, we need other patch, it seems the problem exists.

------------------------------------------------------------------------

[2002-10-14 11:00:55] [EMAIL PROTECTED]

This is still not fixed... PHP code needs modifying.
I have tried PHP 4.2.3 and 4.3.0-pre1 with Apache 2.0.43
running on RedHat 6.2, and it still returns erroneous 304s.

The following is what I 'borrowed' from the Apache's
mod_include.c, which seems working within PHP 4.2.3.


--- sapi/apache2filter/sapi_apache2.c~  Fri Aug 16 07:27:03 2002
+++ sapi/apache2filter/sapi_apache2.c   Mon Oct 14 23:27:26 2002
@@ -558,14 +558,24 @@
        return OK;
 }

+static int includes_setup(ap_filter_t *f)
+{
+    /* We will ALWAYS set the no_local_copy value to 1 so
+     * that we will not send 304s.
+     */
+    f->r->no_local_copy = 1;
+
+    return OK;
+}
+
 static void php_register_hook(apr_pool_t *p)
 {
        ap_hook_pre_config(php_pre_config, NULL, NULL,
APR_HOOK_MIDDLE);
        ap_hook_post_config(php_apache_server_startup, NULL, NULL,
APR_HOOK_MIDDLE);
        ap_hook_insert_filter(php_insert_filter, NULL, NULL,
APR_HOOK_MIDDLE);
        ap_hook_post_read_request(php_post_read_request, NULL, NULL,
APR_HOOK_MIDDLE);
-       ap_register_output_filter("PHP", php_output_filter, NULL,
AP_FTYPE_RESOURCE);
-       ap_register_input_filter("PHP", php_input_filter, NULL,
AP_FTYPE_RESOURCE);
+       ap_register_output_filter("PHP", php_output_filter,
includes_setup, AP_FTYPE_RESOURCE);
+       ap_register_input_filter("PHP", php_input_filter,
includes_setup, AP_FTYPE_RESOURCE);
 }

 AP_MODULE_DECLARE_DATA module php4_module = {

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/17098

-- 
Edit this bug report at http://bugs.php.net/?id=17098&edit=1

Reply via email to