On Wed, Nov 5, 2014 at 7:31 PM, Andrea Faulds <a...@ajf.me> wrote:

>
> > On 5 Nov 2014, at 22:29, Sherif Ramadan <theanomaly...@gmail.com> wrote:
> >
> > From all the people I've spoken with that have a problem with handling
> PUT
> > requests in PHP, it seems that they'd rather have PHP populate
> > $_FILES/$_POST automatically in this case. Which would be relatively easy
> > to do by modifying the default post reader function in the SAPI
> > http://lxr.php.net/xref/PHP_5_6/main/php_content_types.c#51 however,
> that
> > is itself a small BC break.
> >
> > Does anyone have any recommendations on what they think the best approach
> > is? I'd appreciate any feedback/suggestions/constructive-criticism.
> Thanks!
>
> I don’t think auto-populating for PUT/DELETE etc. is a good idea, they’re
> quite different semantically. If I send a DELETE request to code expecting
> a POST, and PHP pretends it’s a POST request, that’s bad.
>

So you're actually describing two semi-different problems here. One is that
PHP doesn't actually inform you of the HTTP request VERB strictly through
the naming of the super global variables $_POST and $_GET. However, $_POST
being populated, right now, in PHP, strictly means the request verb was
POST and that the content-type header received was multipart form data.
Which means that sending something like a JSON payload (Content-type
application/x-json or whatever) in the body of a POST request still doesn't
populate the $_POST super global variable even though the HTTP request VERB
was indeed POST.

The other problem is that the semantics of REST itself are quite different
from how PHP currently deals with the request data. In that PHP only cares
about form data. However, this is quite antiquated with todays' modern use
of HTTP growing in API-specific functionality. For example, companies like
Twitter and Tumblr, demonstrate a vast majority of their traffic currently
coming in at the API-level where things are usually handled in a RESTful
manner. So for the PHP power houses today, PHP doesn't quite lend itself
well to dealing with these problems first-hand. Instead we have to hack our
way around them in userland, which can be more error-prone and less obvious.


>
> However, I think the solution is simple: Add a function to do
> multipart/form-data parsing. Not a suite of functions, not a class, just
> one simple function. That way, for the few people that need it, they can do
> $_POST = multipart_form_data_parse(file_get_contents(‘php://input')); and
> their problem’s solved.


> If we can’t expose the parser, we could also just add a function to force
> population (force_parse_post_data() or something?). Again, this allows the
> few that need this to do so explicitly, but doesn’t make $_POST allow it
> for everyone else.
>



While that solution solves one specific problem (dealing with multipart
form data of request types other than POST), it doesn't quite tackle some
of the broader issues of dealing with incoming HTTP request in PHP that I
would like to tackle. I also think you're diminishing scope of this problem
and the number of people affected by it. You not only have to think of the
number of programmers dealing with the code, but the number of end-users
indirectly affected by the problem as well. PHP is primarily a web-oriented
language, and I think as such it should deal with these kinds of issues
more readily. If you take a good look at the number of web-based APIs out
there and how certain PHP client libraries try to deal with these kinds of
problems the solutions are sometimes very poorly implemented or just
outright wrong.

We solved password hashing dilemmas with password_hash for a similar reason
in PHP. In that people were just doing it wrong and didn't know any better.
So I think making a more robust, and simpler interface to deal with these
kinds of issues will encourage people to get it right in the future.


> --
> Andrea Faulds
> http://ajf.me/
>
>
>
>
>

Reply via email to