Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:78477 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 90461 invoked from network); 30 Oct 2014 18:23:23 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 30 Oct 2014 18:23:23 -0000 Authentication-Results: pb1.pair.com smtp.mail=theanomaly.is@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=theanomaly.is@gmail.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 74.125.82.49 as permitted sender) X-PHP-List-Original-Sender: theanomaly.is@gmail.com X-Host-Fingerprint: 74.125.82.49 mail-wg0-f49.google.com Received: from [74.125.82.49] ([74.125.82.49:35968] helo=mail-wg0-f49.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id A6/FA-33916-71282545 for ; Thu, 30 Oct 2014 13:23:19 -0500 Received: by mail-wg0-f49.google.com with SMTP id x13so4885880wgg.36 for ; Thu, 30 Oct 2014 11:23:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=9TCACjC4XCH38nOo9VnYvTYdu5zgRg2nqqM4Ll83x+Q=; b=m8qlAQ5ogve2X99V0ap4EwQgROdaVIxHxVY0a7be16AthENl7pfsEjOuO27iYkS/07 +EUmsyGEMbriXhLQLiiAZvOWvt9J9ERReIs3ezne9p6NZg8ZayNjrXgf2CBsXXKmIk5X 1+E2FnSDeV4Gd/8XlEMb4b5sYAZOsw6bAN/0ITXUaBDmUW0aUhIDMlWNDiTSrFEHEg8m 5CWUupRab8ypeRY5Dza0np+9KAMcmI39/Xpk4G7cUqiQeZ1zR1ONCCGsPfzY+MepYrvo 7ETuhTvZ13D18iUtDtsUgqTgRJEXUIIfxjDf94xJK9W1Rc3LfnAkXEy/4EV9lCpXj7US CK4w== MIME-Version: 1.0 X-Received: by 10.180.212.110 with SMTP id nj14mr3496772wic.45.1414693395786; Thu, 30 Oct 2014 11:23:15 -0700 (PDT) Received: by 10.216.123.4 with HTTP; Thu, 30 Oct 2014 11:23:15 -0700 (PDT) Date: Thu, 30 Oct 2014 14:23:15 -0400 Message-ID: To: PHP Internals Content-Type: multipart/alternative; boundary=001a11c34160526f1d0506a7f9bf Subject: New Standardized HTTP Interface From: theanomaly.is@gmail.com (Sherif Ramadan) --001a11c34160526f1d0506a7f9bf Content-Type: text/plain; charset=UTF-8 Hello Internals, I've been meaning to write up a full-blown RFC for introducing a new standardized HTTP interface for PHP core for some time now. I figure now with PHP 7 on the road map this might be a good time to start this discussion since it involves breaking some backwards compatibility that may have been out of the question in PHP 5. I've started a draft RFC, but please be patient as this is a working in progress, here https://wiki.php.net/rfc/http-interface on the wiki. The point here is to allow users to implement their own HttpRequest and HttpResponse classes that can deal directly with the raw request/response messages in any way the user deems fit. This alleviates cases like "what about when I want to have $_PUT or $_DELETE" and removes the ambiguity of the $_POST, $_GET superglobals to a more conforming way of handling the messages. Since it's an interface, it only dictates the facilitation of PHP's built-in functionality and the user's desired implementation, but no the implementation itself. To remove all confusion, consider the way an HTTP message actually looks. GET /foo?bar=1 HTTP/1.1 Host: foobar.com baz=2 Instead of treating this with current $_GET, $_POST, let's consider for a moment how we might treat it in an HttpRequest object: If the HttpRequest class implements an HttpParameters object that parses and treats the entire HTTP request line as a string of parameters we could accomplish the following... var_dump(HttpRequest::$parameters->bar); // int(1) var_dump((string) HttpRequest::$parameters); // string(6)"?bar=1" Now consider how the body can be treated... echo HttpRequest::$body; // baz=2 echo HttpRequest::$body->baz; // 2 Since the HttpRequest object can lazily parse the body it can also lazily apply custom filters directly to the request variables and parameters... For example, say you wish to treat baz only as an integer? This can be easily accomplished by setting the filters directly in the HttpRequest object and upon access the filter is directly applied to chosen variables. This also alleviates the need to worry about overwriting superglobal variables or having to copy from them. So from an efficiency stand-point this approach works much better. It also allows you to separate clearly between HTTP request parameters and HTTP request body as well as the HTTP request method. Since the request object should be capable of handling callbacks for each method to apply different sets of filters or rules on treating the request body given different request methods this could prove a lot more useful than existing techniques applied directly in PHP with php://input, for example. We don't need to copy the internal stream and we don't need to modify or copy superglobals around to different parts of our code. I'm in the process of writing up a cleaner implementation to introduce in the RFC, but in the mean time I'd like to open up to discussion and see what others think or how they feel we might approach this problem more cleanly. Thanks, Sherif --001a11c34160526f1d0506a7f9bf--