Skip to content

Commit

Permalink
Add Catch All handler (#25)
Browse files Browse the repository at this point in the history
  • Loading branch information
mzalewski authored Oct 19, 2024
1 parent fad434e commit 74315c3
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 0 deletions.
67 changes: 67 additions & 0 deletions app/Http/Controllers/CatchAllController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Client\RequestException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
use Illuminate\Http\Response;
use Illuminate\Support\Carbon;

class CatchAllController extends Controller
{
public function handle(Request $request)
{
$requestData = $request->all();
$ua = $request->header('User-Agent');
$path = $request->path();
$queryParams = $request->query();

// If path is root, return a 200 OK empty response
if ($path === '/') {
return response()->noContent(200);
}

try {
$response = Http::withHeaders([
'User-Agent' => $ua,
'Accept' => '*/*'
])->asForm()->send($request->getMethod(), 'https://api.wordpress.org/' . $path, [
'query' => $queryParams,
'form_params' => $requestData
]);

} catch (RequestException $e) {
$statusCode = $e->response ? $e->response->status() : 500;
return response()->noContent($statusCode);
}

// Get content type and status code
$contentType = $response->header('Content-Type');
$statusCode = $response->status();
$content = $response->body();

// Log request and response in DB
$this->saveData($request, $response, $content);

// Forward response through
return response($content, $statusCode)->header('Content-Type', $contentType);
}

private function saveData(Request $request, $response, string $content): void
{
DB::table('request_data')->insert([
'id' => Str::uuid()->toString(),
'request_path' => $request->path(),
'request_query_params' => json_encode($request->query()),
'request_body' => json_encode($request->all()),
'request_headers' => json_encode($request->headers->all()),
'response_code' => $response->status(),
'response_body' => $content,
'response_headers' => json_encode($response->headers()),
'created_at' => Carbon::now(),
]);
}
}
3 changes: 3 additions & 0 deletions routes/web.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
<?php

use App\Http\Controllers\CatchAllController;
use Illuminate\Support\Facades\Route;

Route::get('/', function () {
return view('welcome');
});

Route::any('{path}', [CatchAllController::class, 'handle'])->where('path', '.*');

0 comments on commit 74315c3

Please sign in to comment.