On Thu, Jul 18, 2019 at 4:28 PM Dan Ackroyd <dan...@basereality.com> wrote:

> On Thu, 18 Jul 2019 at 11:08, Rasmus Schultz <ras...@mindplay.dk> wrote:
> >
> > What about ...
>
> Although there might be real problems for this, please can you
> describe a concrete problem that will occur, in a library people use,
> rather than a vague possible problem?
>

Well, both underscores and hyphens are permitted in header names - so a
library that replaces underscores with hyphens potentially mangles real
header names. (Mangling and unmangling are both lossy operations.)


> For most framework users, all of the request variables are only
> accessed through either a PSR7 request object or their framework
> specific equivalent, and the problem of mangling/demangling can be
> solved there.
>

Yes, that's my concern - if they don't know whether the names are already
mangled or not, they might apply the unmangling, unintentionally mangling
actual valid header names.

Besides also wasting some CPU time - no point in processing header-names if
they're already properly formatted.

Mainly, all I'm suggesting is that there be some way to tell if the names
were either never mangled, or have already been unmangled, so we can avoid
single or multiple (redundant and/or lossy) mangling/unmangling operations
in the polyfill and PSR-7 libraries.

Since this has to do with $_SERVER, it seems natural to keep it in
$_SERVER["REAL_HEADER_NAMES"], which would be set to true on PHP 8.

So in the polyfill:

    if (isset($_SERVER["REAL_HEADER_NAMES"])) {
        // mangle names...
        unset($_SERVER["REAL_HEADER_NAMES"]);
    }

And in the PSR-7 libraries:

    if (isset($_SERVER["REAL_HEADER_NAMES"])) {
        // use names as is
    } else {
        // unmangle names
    }

This is just an example - I'm indifferent as to the name and location of
this value.

Someone suggested using a constant, but you can't unset a constant - for
the polyfill and PHP 8 both to be seen by a PSR-7 library as having real
header names, the polyfill needs to be able to clear that flag. (With a
constant, you'd need an additional check against php_version() - just
trying to keep this as simple as possible.)

Reply via email to