I implemented and tested now version a), works fine! header_remove() now
only removes headers set/modified by PHP.

I tested the case to remove *all* headers by cleaning the server's header
hash table, but this breaks server hard: 

Best example: Removing the "Transfer-encoding: chunked" header, the server
inserts at the beginning of the request before PHP is executed, is not
restored on protocol_start_response, but the server still sends chunked data
-> the browser will not understand it.

Solutions c), as I told before would also be good, but then you would not
see PHP's headers in get_response_headers(). And code is not much shorter or
simplier.

-----
Uwe Schindler
[EMAIL PROTECTED] - http://www.php.net
NSAPI SAPI developer
Bremen, Germany

> -----Original Message-----
> From: Uwe Schindler [mailto:[EMAIL PROTECTED]
> Sent: Saturday, November 29, 2008 1:09 PM
> To: 'Arnaud Le Blanc'
> Cc: 'Lukas Kahwe Smith'; internals@lists.php.net; 'Christian Schmidt';
> 'Alex Leigh'; 'George Wang'
> Subject: RE: [PHP-DEV] [PATCH] Allow unsetting headers previously set
> usingheader()
> 
> Hallo Arnaud,
> 
> > I believe that Apache does sets its headers just before sending them, so
> > when
> > PHP deletes all headers in Apache's hashtable this does not removes
> > "Server",
> > "Date", etc. If this is not the case for NSAPI, solution a) seems good,
> > but
> > also allows to remove "Date" by setting it before ;)
> 
> That is correct, you are able to remove the headers. For removing the Date
> header it would be enough to just use the header_remove() without setting
> it
> before. But if somebody does this, he knows what he is doing. I want to
> prevent PHP from doing things that the user cannot control or understand.
> Sun Webserver for example is able to compress output automatically and
> other
> things. So I am not sure what happens, if you remove headers. As source
> code
> of this webserver is not yet available (Sun wants to release it soon), I
> do
> not know *when* nsapi puts entries in his internal header hash table.
> Maybe
> its in protocol_start_response(), if so everything would be ok, and I can
> manually cleanup the complete webserver's hash table (solution b). But
> nsapi_response_headers from PHP called shows, that e.g. Date and Server
> are
> set *before* the request starts.
> 
> In my opinion, a call to header_remove() from PHP should only remove
> headers
> set by PHP (e.g. revert to the state, before the PHP script started).
> 
> > One reason for having header_handler() and send_headers() is for example
> > that
> > flush() does not sends headers explicitly, but lets the server send them
> > based
> > on what header_handler() has set.
> 
> That's not correct for at least apache:
> 
> php_apache_sapi_flush(void *server_context)
> {
>       ...
>       sapi_send_headers(TSRMLS_C);
> 
>       r->status = SG(sapi_headers).http_response_code;
>       SG(headers_sent) = 1;
> 
>       if (ap_rflush(r) < 0 || r->connection->aborted) {
>               php_handle_aborted_connection();
>       }
> }
> 
> The flush function just calls sapi_send_headers so it explicitely send the
> headers, so my approach of do not implementing a header_handler would also
> correctly send the headers in this case. For NSAPI it is not even possible
> to send headers explicitely, you can only set them in an internal
> hashtable
> of the web server.
> 
> For a typical NSAPI module the workflow is the following:
> Any "Service" handler from webserver's config sets headers in the internal
> hash table. Before it starts to write output, it may also set the response
> code. All this is not sent to the client immediately. The headers and
> everything is sent on protocol_start_response(). After that you cannot set
> any headers anymore and you have to write to the output stream.
> 
> The PHP module calls the webserver's protocol_start_response() in
> sapi_send_headers(), so even when you flush, this must be called (in the
> current version of output buffering there is still a bug about this, which
> is fixed in the new version, I think). I repaired this by also
> implementing
> flush for nsapi in my new version, which calls like apache
> sapi_send_headers(TSRMLS_C). This fixes a very old bug for NSAPI.
> 
> So in my opinion for the server it is no difference when to set the
> headers
> (immediately after the call to header()) or shortly before starting the
> reponse. And this is how CGI works - and this would be enough for NSAPI,
> too.
> 
> The only thing that would not work is explicitely removing headers like
> "Date:", but for this use case header_handler() could only be implemented
> for the op SAPI_HEADER_DELETE. But with CGI this would not be possible.
> 
> Uwe
> 
> 
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php



-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to