It seems that there is some weird behavior when using http_get_request_body() with fopen('php://input'). Specifically, reading the input with the fopen('php://input') routine before calling http_get_request_body() on a PUT HTTP request.
Here are some examples:
A POST request:
*********************************************************
PUT http://example.com/requestbodytest.php HTTP/1.1
Host: example.com
Keep-Alive: 300
Connection: keep-alive
Content-Type: text/xml
Content-Length: 58
<?xml version="1.0" encoding="utf-8" ?>
<body>test</body>
*********************************************************
with the following script:
*********************************************************
<?php
$body = '';
$fh = @fopen('php://input', 'r');
if ($fh)
{
while (!feof($fh))
{
$s = fread($fh, 1024);
if (is_string($s))
{
$body .= $s;
}
}
fclose($fh);
}
print("-------------- PHP Input Stream ----------------\n$body\n\n");
$body2 = http_get_request_body();
print("---------- http_get_request_body() -------------\n$body2\n\n");
?>
*********************************************************
outputs this:
*********************************************************
-------------- PHP Input Stream ----------------
<?xml version="1.0" encoding="utf-8" ?>
<body>test</body>
---------- http_get_request_body() -------------
<?xml version="1.0" encoding="utf-8" ?>
<body>test</body>
*********************************************************
The same request to the same script using an HTTP PUT request, however, outputs this:
*********************************************************
-------------- PHP Input Stream ----------------
<?xml version="1.0" encoding="utf-8" ?>
<body>test</body>
---------- http_get_request_body() -------------
*********************************************************
It seems a valid workaround is to put a call to http_get_request_body() to cache the body content before an expected read to php://input (i.e. simply calling the function without manually storing the result caches the content for subsequent calls).
http_get_request_body
(PECL pecl_http >= 0.10.0)
http_get_request_body — Consultar cuerpo de petición como string
Descripción
string http_get_request_body
( void
)
Consulta el cuerpo de una petición binaria (p.ej. datos POST o PUT).
Si el método de petición fuera distinto de POST, no se podrá utilizar esta función tras http_get_request_body_stream()
Parámetros
Valores devueltos
En caso de éxito devuelve el cuerpo de la petición, o NULL en caso de error.
Ver también
- http_get_request_body_stream() - Consultar cuerpo de la petición como un flujo
- http_get_request_headers() - Obtener cabeceras de petición como array
- la clase HttpResponse si está utilizando PHP 5.1.0 and above
Tim Trinidad ¶
2 years ago
osborn dot steven at gmail dot com ¶
5 years ago
For those of you without the HTTP extension, try:
<?php
$body = @file_get_contents('php://input');
?>
neil at foo dot co dot za ¶
5 years ago
Like php://input and http_get_request_body_stream(), http_get_request_body() doesn't seem to work with enctype="multipart/form-data".
