If I make a POST request where the content-type is not set in the request header, the variable $_POST remains empty.
Question: How can I force PHP to fill $_POST?
I encountered the problem making an Javascript AJAX request using XDomainRequest where you can not define any headers. Just to make it easier for you to understand the problem you can simulate the same effect without Javascript in PHP this way:
$data = 'test=1';
$fp = fsockopen('www.yourpage.org', 80, $errno, $errstr, 5);
fputs($fp, "POST /test_out.php HTTP/1.1\r\n");
fputs($fp, "Host: www.yourpage.org\r\n");
//fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ". strlen($data) ."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $data);
while(!feof($fp)) { echo fgets($fp, 128); }
fclose($fp);
test_out.php would be
var_dump($_POST);
Without the correct content-type the variables in $_POST magically disappear.
This is more an educational question. I am asking this because most people here can not imaging that the content-type has this effect. I was asked to 'come back with facts'. So here you go.
You can override/inject the necessary header using Apache mod_headers
if you have to. Or otherwise resort to manually reconstructing the $_POST array. (See also userland multipart/form-data handler)
If it's always urlencoded, simply read from php://input
(Which contains the raw POST request body) and use parse_str
:
parse_str(file_get_contents("php://input"), $_POST);
That should recreate the POST array, pretty much like PHP would do.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With