Skip to content

Instantly share code, notes, and snippets.

@magnetikonline
Last active November 1, 2024 07:35
Show Gist options
  • Save magnetikonline/650e30e485c0f91f2f40 to your computer and use it in GitHub Desktop.
Save magnetikonline/650e30e485c0f91f2f40 to your computer and use it in GitHub Desktop.
PHP script to dump full HTTP request to file (method, HTTP headers and body).
<?php
// https://gist.github.com/magnetikonline/650e30e485c0f91f2f40
class DumpHTTPRequestToFile {
public function execute($targetFile) {
$data = sprintf(
"%s %s %s\n\nHTTP headers:\n",
$_SERVER['REQUEST_METHOD'],
$_SERVER['REQUEST_URI'],
$_SERVER['SERVER_PROTOCOL']
);
foreach ($this->getHeaderList() as $name => $value) {
$data .= $name . ': ' . $value . "\n";
}
$data .= "\nRequest body:\n";
file_put_contents(
$targetFile,
$data . file_get_contents('php://input') . "\n"
);
echo("Done!\n\n");
}
private function getHeaderList() {
$headerList = [];
foreach ($_SERVER as $name => $value) {
if (preg_match('/^HTTP_/',$name)) {
// convert HTTP_HEADER_NAME to Header-Name
$name = strtr(substr($name,5),'_',' ');
$name = ucwords(strtolower($name));
$name = strtr($name,' ','-');
// add to list
$headerList[$name] = $value;
}
}
return $headerList;
}
}
(new DumpHTTPRequestToFile)->execute('./dumprequest.txt');
GET /dumprequest.php HTTP/1.1
HTTP headers:
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate, br
Referer: http://localhost/
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36
Upgrade-Insecure-Requests: 1
Connection: keep-alive
Host: localhost
Request body:
@message
Copy link

message commented Dec 15, 2021

My edit to dump request to server log via php -S localhost:62000.

<?php

$time = time();
error_log("--------------------[START/" . $time . "]--------------------");
error_log("");
error_log(sprintf("%s %s %s", $_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI'], $_SERVER['SERVER_PROTOCOL']));
error_log("");
error_log("");
foreach ($_SERVER as $headerName => $headerValue) {
	if (preg_match('/^HTTP_/', $headerName)) {
		// convert HTTP_HEADER_NAME to Header-Name
		$headerName = strtr(substr($headerName, 5), '_', ' ');
		$headerName = ucwords(strtolower($headerName));
		$headerName = strtr($headerName, ' ', '-');

		error_log("$headerName: $headerValue");
	}
}
error_log("");
$body = file_get_contents('php://input');
$bodyLength = strlen($body);
error_log("");
error_log($bodyLength ? $body : "(empty body)");
error_log("");
error_log("---------------------[END/" . $time . "]---------------------");

Output

[Wed Dec 15 13:45:00 2021] 127.0.0.1:40922 Accepted
[Wed Dec 15 13:45:00 2021] --------------------[START/1639568700]--------------------
[Wed Dec 15 13:45:00 2021] 
[Wed Dec 15 13:45:00 2021] POST / HTTP/1.0
[Wed Dec 15 13:45:00 2021] 
[Wed Dec 15 13:45:00 2021] 
[Wed Dec 15 13:45:00 2021] X-Real-Ip: 127.0.0.1
[Wed Dec 15 13:45:00 2021] X-Forwarded-For: 127.0.0.1
[Wed Dec 15 13:45:00 2021] Host: 127.0.0.1
[Wed Dec 15 13:45:00 2021] Connection: close
[Wed Dec 15 13:45:00 2021] Content-Length: 11
[Wed Dec 15 13:45:00 2021] User-Agent: HTTPie/1.0.3
[Wed Dec 15 13:45:00 2021] Accept-Encoding: gzip, deflate
[Wed Dec 15 13:45:00 2021] Accept: */*
[Wed Dec 15 13:45:00 2021] Content-Type: application/x-www-form-urlencoded; charset=utf-8
[Wed Dec 15 13:45:00 2021] 
[Wed Dec 15 13:45:00 2021] 
[Wed Dec 15 13:45:00 2021] hello=world
[Wed Dec 15 13:45:00 2021] 
[Wed Dec 15 13:45:00 2021] ---------------------[END/1639568700]---------------------
[Wed Dec 15 13:45:00 2021] 127.0.0.1:40922 [200]: POST /
[Wed Dec 15 13:45:00 2021] 127.0.0.1:40922 Closing

@delfer
Copy link

delfer commented Mar 30, 2022

+1 for
file_put_contents($file, $content, FILE_APPEND | LOCK_EX);

@jaywilliams
Copy link

I simplified the script by removing all of the unnecessary object oriented overhead, and made the log file append.

https://gist.github.com/jaywilliams/bee2512f0f12d6791315d6939119e135

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment