-
-
Save magnetikonline/650e30e485c0f91f2f40 to your computer and use it in GitHub Desktop.
<?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: |
Hey! thanks for this script.
I'm a complete newbie and maybe I can not even explain myself. However what I need is to save data coming from an http request to my server on a file. Thus it seems that the above script is perfect for my needs.
What I do not understand is where to put the script and how let it works: should I put the script on my server and use is URL in the http request to let him works and create the file?
thanks in advance
For the next time I come across this- Single function version.
function logRequest($targetFile){ $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,' ','-'); $headerList[$name] = $value; } } $data = sprintf("%s %s %s\n", $_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI'], $_SERVER['SERVER_PROTOCOL']); foreach ($headerList as $name => $value) { $data .= $name.': '.$value."\n"; } $data .= "\n"; file_put_contents($targetFile, $data.file_get_contents('php://input')."\n"); }
logRequest("/tmp/post-".time().".log");
@jotham thanks for summarizing it
Simple, but useful snippet. :)
Yeah I also find that FILE_APPEND would be great so you can tail -f the log file and it does not get overwritten all the time. Apart from that, useful PHP snippet ;). THX
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
+1 for
file_put_contents($file, $content, FILE_APPEND | LOCK_EX);
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
This doesn't need to be a class, could be a easy to use library function.