Rodrigo Gonzalez
2 years ago
5 changed files with 223 additions and 3 deletions
@ -0,0 +1,201 @@ |
|||
<?php |
|||
|
|||
namespace App\Helpers; |
|||
|
|||
use Illuminate\Http\Client\PendingRequest; |
|||
use Illuminate\Http\Client\Response; |
|||
use GuzzleHttp\Client; |
|||
use Illuminate\Http\Request; |
|||
use Illuminate\Http\UploadedFile as HttpUploadedFile; |
|||
use Illuminate\Support\Facades\Http; |
|||
|
|||
class ProxyHelper { |
|||
|
|||
//Original request |
|||
private Request $originalRequest; |
|||
//Params from multipart requests |
|||
private $multipartParams; |
|||
//Custom Headers |
|||
private $headers; |
|||
//Custom Authorization |
|||
private $authorization; |
|||
//Custom Method |
|||
private $customMethod; |
|||
|
|||
private $addQuery; |
|||
|
|||
//If needed add cookies support with: |
|||
// - PendingRequest->withCookies |
|||
// - Request->hasCookie |
|||
// - or custom |
|||
|
|||
//Settings |
|||
private $useDefaultAuth; |
|||
//It's recommandable check manually (for multipart exceptions and other things) |
|||
// private $useDefaultHeaders; |
|||
|
|||
public function CreateProxy(Request $request, $useDefaultAuth = true /*, $useDefaultHeaders = false*/){ |
|||
$this->originalRequest = $request; |
|||
$this->multipartParams = $this->GetMultipartParams(); |
|||
$this->useDefaultAuth = $useDefaultAuth; |
|||
// $this->useDefaultHeaders = $useDefaultHeaders; |
|||
return $this; |
|||
} |
|||
|
|||
public function withHeaders($headers){ $this->headers = $headers; return $this; } |
|||
|
|||
public function withBasicAuth($user, $secret){ $this->authorization = ['type' => 'basic', 'user' => $user, 'secret' => $secret ]; return $this; } |
|||
|
|||
public function withDigestAuth($user, $secret){ $this->authorization = ['type' => 'digest', 'user' => $user, 'secret' => $secret ]; return $this; } |
|||
|
|||
public function withToken($token){ $this->authorization = ['type' => 'token', 'token' => $token ]; return $this; } |
|||
|
|||
public function withMethod($method = 'POST'){ $this->customMethod = $method; return $this; } |
|||
|
|||
public function preserveQuery($preserve){ $this->addQuery = $preserve; return $this; } |
|||
|
|||
public function getResponse($url){ |
|||
|
|||
$info = $this->getRequestInfo(); |
|||
|
|||
$http = $this->createHttp($info['type']); |
|||
$http = $this->setAuth($http, $info['token']); |
|||
$http = $this->setHeaders($http); |
|||
|
|||
if($this->addQuery && $info['query']) |
|||
$url = $url.'?'.http_build_query($info['query']); |
|||
|
|||
$response = $this->call($http, $info['method'], $url, $this->getParams($info)); |
|||
|
|||
return response($this->isJson($response) ? $response->json() : $response->body(), $response->status()); |
|||
} |
|||
|
|||
public function toUrl($url){ return $this->getResponse($url); } |
|||
|
|||
public function toHost($host, $proxyController){ |
|||
return $this->getResponse($host.str_replace($proxyController, '', $this->originalRequest->path())); |
|||
} |
|||
|
|||
private function getParams($info){ |
|||
$defaultParams = []; |
|||
if($info['method'] == 'GET') |
|||
return $info['params']; |
|||
if($info['type'] == 'multipart') |
|||
$defaultParams = $this->multipartParams; |
|||
else |
|||
$defaultParams = $info['params']; |
|||
if($info['query']) |
|||
foreach ($info['query'] as $key => $value) |
|||
unset($defaultParams[array_search(['name' => $key,'contents' => $value], $defaultParams)]); |
|||
return $defaultParams; |
|||
} |
|||
|
|||
private function setAuth(PendingRequest $request, $currentAuth = null){ |
|||
if(!$this->authorization) |
|||
return $request; |
|||
switch ($this->authorization['type']) { |
|||
case 'basic': |
|||
return $request->withBasicAuth($this->authorization['user'],$this->authorization['secret']); |
|||
case 'digest': |
|||
return $request->withDigestAuth($this->authorization['user'],$this->authorization['secret']); |
|||
case 'token': |
|||
return $request->withToken($this->authorization['token']); |
|||
default: |
|||
if($currentAuth && $this->useDefaultAuth) |
|||
return $request->withToken($currentAuth); |
|||
return $request; |
|||
} |
|||
} |
|||
|
|||
private function setHeaders(PendingRequest $request){ |
|||
if(!$this->headers) |
|||
return $request; |
|||
return $request->withHeaders($this->headers); |
|||
} |
|||
|
|||
private function createHttp($type){ |
|||
switch ($type) { |
|||
case 'multipart': |
|||
return Http::asMultipart(); |
|||
case 'form': |
|||
return Http::asForm(); |
|||
case 'json': |
|||
return Http::asJson(); |
|||
case null: |
|||
return new PendingRequest(); |
|||
default: |
|||
return Http::contentType($type); |
|||
} |
|||
} |
|||
|
|||
private function call(PendingRequest $request, $method, $url, $params){ |
|||
if($this->customMethod) |
|||
$method = $this->customMethod; |
|||
switch ($method) { |
|||
case 'GET': |
|||
return $request->get($url, $params); |
|||
case 'HEAD': |
|||
return $request->head($url, $params); |
|||
default: |
|||
case 'POST': |
|||
return $request->post($url, $params); |
|||
case 'PATCH': |
|||
return $request->patch($url, $params); |
|||
case 'PUT': |
|||
return $request->put($url, $params); |
|||
case 'DELETE': |
|||
return $request->delete($url, $params); |
|||
} |
|||
} |
|||
|
|||
private function getRequestInfo(){ |
|||
return [ |
|||
'type' => ($this->originalRequest->isJson() ? 'json' : |
|||
(strpos($this->originalRequest->header('Content-Type'),'multipart') !== false ? 'multipart' : |
|||
($this->originalRequest->header('Content-Type') == 'application/x-www-form-urlencoded' ? 'form' : $this->originalRequest->header('Content-Type')))), |
|||
'agent' => $this->originalRequest->userAgent(), |
|||
'method' => $this->originalRequest->method(), |
|||
'token' => $this->originalRequest->bearerToken(), |
|||
'full_url'=>$this->originalRequest->fullUrl(), |
|||
'url'=>$this->originalRequest->url(), |
|||
'format'=>$this->originalRequest->format(), |
|||
'query' =>$this->originalRequest->query(), |
|||
'params' => $this->originalRequest->all(), |
|||
]; |
|||
} |
|||
|
|||
private function GetMultipartParams(){ |
|||
$multipartParams = []; |
|||
if ($this->originalRequest->isMethod('post')) { |
|||
$formParams = $this->originalRequest->all(); |
|||
$fileUploads = []; |
|||
foreach ($formParams as $key => $param) |
|||
if ($param instanceof HttpUploadedFile) { |
|||
$fileUploads[$key] = $param; |
|||
unset($formParams[$key]); |
|||
} |
|||
if (count($fileUploads) > 0){ |
|||
$multipartParams = []; |
|||
foreach ($formParams as $key => $value) |
|||
$multipartParams[] = [ |
|||
'name' => $key, |
|||
'contents' => $value |
|||
]; |
|||
foreach ($fileUploads as $key => $value) |
|||
$multipartParams[] = [ |
|||
'name' => $key, |
|||
'contents' => fopen($value->getRealPath(), 'r'), |
|||
'filename' => $value->getClientOriginalName(), |
|||
'headers' => [ |
|||
'Content-Type' => $value->getMimeType() |
|||
] |
|||
]; |
|||
} |
|||
} |
|||
return $multipartParams; |
|||
} |
|||
|
|||
private function isJson(Response $response){ |
|||
return strpos($response->header('Content-Type'),'json') !== false; |
|||
} |
|||
} |
@ -0,0 +1,12 @@ |
|||
<?php |
|||
|
|||
namespace App\Helpers; |
|||
|
|||
use Illuminate\Support\Facades\Facade; |
|||
|
|||
class ProxyHelperFacade extends Facade { |
|||
|
|||
protected static function getFacadeAccessor(){ |
|||
return "ProxyHelper"; |
|||
} |
|||
} |
Loading…
Reference in new issue