-
Notifications
You must be signed in to change notification settings - Fork 191
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: add StdOutLogger and LoggingTrait #578
base: main
Are you sure you want to change the base?
Changes from all commits
2416bec
dbce7ca
6370690
7ce3e58
ce1e7db
ad4699b
b952d48
c80bdf6
953efb7
eba9861
975c564
7e76353
ac4d686
b770674
566c414
8bb61a1
fa851c2
600a947
3cc71a4
8699369
fb0ac53
56d3881
202890d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -23,12 +23,15 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||
use Google\Auth\Credentials\ServiceAccountCredentials; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
use Google\Auth\HttpHandler\HttpClientCache; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
use Google\Auth\HttpHandler\HttpHandlerFactory; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
use Google\Auth\Logging\StdOutLogger; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
use Google\Auth\Middleware\AuthTokenMiddleware; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
use Google\Auth\Middleware\ProxyAuthTokenMiddleware; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
use Google\Auth\Subscriber\AuthTokenSubscriber; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
use GuzzleHttp\Client; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
use InvalidArgumentException; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
use PHPUnit\TextUI\XmlConfiguration\Logging\Logging; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
use Psr\Cache\CacheItemPoolInterface; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
use Psr\Log\LoggerInterface; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* ApplicationDefaultCredentials obtains the default credentials for | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -69,6 +72,8 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
class ApplicationDefaultCredentials | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
private const SDK_DEBUG_FLAG = 'GOOGLE_SDK_DEBUG_LOGGING'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @deprecated | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -145,7 +150,8 @@ public static function getMiddleware( | |||||||||||||||||||||||||||||||||||||||||||||||||||||
* user-defined scopes exist, expressed either as an Array or as a | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* space-delimited string. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param string $universeDomain Specifies a universe domain to use for the | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* calling client library | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* calling client library. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param null|false|LoggerInterface $logger A PSR3 compliant LoggerInterface. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @return FetchAuthTokenInterface | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @throws DomainException if no implementation can be obtained. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -157,7 +163,8 @@ public static function getCredentials( | |||||||||||||||||||||||||||||||||||||||||||||||||||||
CacheItemPoolInterface $cache = null, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
$quotaProject = null, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
$defaultScope = null, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
string $universeDomain = null | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
string $universeDomain = null, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
null|false|LoggerInterface $logger = null, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
$creds = null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
$jsonKey = CredentialsLoader::fromEnv() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -170,7 +177,7 @@ public static function getCredentials( | |||||||||||||||||||||||||||||||||||||||||||||||||||||
HttpClientCache::setHttpClient($client); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
$httpHandler = HttpHandlerFactory::build($client); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
$httpHandler = HttpHandlerFactory::build($client, $logger); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (is_null($quotaProject)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -321,6 +328,40 @@ public static function getIdTokenCredentials( | |||||||||||||||||||||||||||||||||||||||||||||||||||||
return $creds; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Returns a StdOutLogger instance | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @return null|LoggerInterface | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
public static function getDefaultLogger(): null|LoggerInterface | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
$loggingFlag = getenv(self::SDK_DEBUG_FLAG); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Env var is not set | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!is_string($loggingFlag)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (is_array($loggingFlag)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
trigger_error('The ' . self::SDK_DEBUG_FLAG . ' is set, but it is set to another value than false, true, 0 or 1. Logging is disabled'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
return null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+341
to
+348
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm confused by this block - there is no way for the logging flag to be an array, as that only happens if you call Why not combine this with the validation below? (see suggestion below) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I remember having a specific issue that I needed to handle but I can't quite remember what was it exactly. Although it might have been related to PHPSTAN mentioning that it can return an Still let me take a look in order to make it cleaner :) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
$loggingFlag = strtolower($loggingFlag); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Env Var is not true | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ($loggingFlag !== 'true' && $loggingFlag !== '1') { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Env var is set to a non valid value | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ($loggingFlag !== 'false' && $loggingFlag !== '0') { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
trigger_error('The ' . self::SDK_DEBUG_FLAG . ' is set, but it is set to another value than false, true, 0 or 1. Logging is disabled'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
return null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
return new StdOutLogger(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+352
to
+362
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Having lots of NOTE: You may want to handle the case of empty string (e.g. someone sets
Suggested change
I personally think this reads a lot cleaner |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @return string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -16,23 +16,35 @@ | |||||
*/ | ||||||
namespace Google\Auth\HttpHandler; | ||||||
|
||||||
use Google\Auth\Logging\LogEvent; | ||||||
use Google\Auth\Logging\LoggingTrait; | ||||||
use GuzzleHttp\ClientInterface; | ||||||
use Psr\Http\Message\RequestInterface; | ||||||
use Psr\Http\Message\ResponseInterface; | ||||||
use Psr\Log\LoggerInterface; | ||||||
|
||||||
class Guzzle6HttpHandler | ||||||
{ | ||||||
use LoggingTrait; | ||||||
|
||||||
/** | ||||||
* @var ClientInterface | ||||||
*/ | ||||||
private $client; | ||||||
|
||||||
/** | ||||||
* @var null|LoggerInterface | ||||||
*/ | ||||||
private $logger; | ||||||
|
||||||
/** | ||||||
* @param ClientInterface $client | ||||||
* @param null|LoggerInterface $logger | ||||||
*/ | ||||||
public function __construct(ClientInterface $client) | ||||||
public function __construct(ClientInterface $client, LoggerInterface $logger = null) | ||||||
{ | ||||||
$this->client = $client; | ||||||
$this->logger = $logger; | ||||||
} | ||||||
|
||||||
/** | ||||||
|
@@ -44,7 +56,38 @@ public function __construct(ClientInterface $client) | |||||
*/ | ||||||
public function __invoke(RequestInterface $request, array $options = []) | ||||||
{ | ||||||
return $this->client->send($request, $options); | ||||||
$requestEvent = null; | ||||||
|
||||||
if ($this->logger) { | ||||||
$requestEvent = new LogEvent(); | ||||||
|
||||||
$requestEvent->method = $request->getMethod(); | ||||||
$requestEvent->url = $request->getUri()->__toString(); | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. absolute nit
Suggested change
|
||||||
$requestEvent->headers = $request->getHeaders(); | ||||||
$requestEvent->payload = $request->getBody()->getContents(); | ||||||
$requestEvent->retryAttempt = $options['retryAttempt'] ?? null; | ||||||
$requestEvent->serviceName = $options['serviceName'] ?? null; | ||||||
$requestEvent->clientId = spl_object_id($this->client); | ||||||
$requestEvent->requestId = spl_object_id($request); | ||||||
|
||||||
$this->logRequest($requestEvent); | ||||||
} | ||||||
|
||||||
$response = $this->client->send($request, $options); | ||||||
|
||||||
if ($this->logger) { | ||||||
$responseEvent = new LogEvent($requestEvent->timestamp); | ||||||
|
||||||
$responseEvent->headers = $response->getHeaders(); | ||||||
$responseEvent->payload = $response->getBody()->getContents(); | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this could potentially be huge, depending on the response - is that still what we want to do? Maybe we should have some kind of checks to only send the first # of bytes? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, there was a discussion about truncating the data for this and there is no definite conclusion, but one idea is to truncate the length and be configurable via the |
||||||
$responseEvent->status = $response->getStatusCode(); | ||||||
$responseEvent->clientId = $requestEvent->clientId; | ||||||
$responseEvent->requestId = $requestEvent->requestId; | ||||||
|
||||||
$this->logResponse($responseEvent); | ||||||
} | ||||||
|
||||||
return $response; | ||||||
} | ||||||
|
||||||
/** | ||||||
|
@@ -57,6 +100,41 @@ public function __invoke(RequestInterface $request, array $options = []) | |||||
*/ | ||||||
public function async(RequestInterface $request, array $options = []) | ||||||
{ | ||||||
return $this->client->sendAsync($request, $options); | ||||||
$requestEvent = null; | ||||||
|
||||||
if ($this->logger) { | ||||||
$requestEvent = new LogEvent(); | ||||||
|
||||||
$requestEvent->method = $request->getMethod(); | ||||||
$requestEvent->url = $request->getUri()->__toString(); | ||||||
$requestEvent->headers = $request->getHeaders(); | ||||||
$requestEvent->payload = $request->getBody()->getContents(); | ||||||
$requestEvent->retryAttempt = $options['retryAttempt'] ?? null; | ||||||
$requestEvent->serviceName = $options['serviceName'] ?? null; | ||||||
$requestEvent->clientId = spl_object_id($this->client); | ||||||
$requestEvent->requestId = spl_object_id($request); | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. since this code is duplicated above, why not have private methods like There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In my mind, formatting the I also thought perhaps a function to make a |
||||||
|
||||||
$this->logRequest($requestEvent); | ||||||
} | ||||||
|
||||||
$promise = $this->client->sendAsync($request, $options); | ||||||
|
||||||
if ($this->logger) { | ||||||
$promise->then(function (ResponseInterface $response) use ($requestEvent) { | ||||||
$responseEvent = new LogEvent($requestEvent->timestamp); | ||||||
|
||||||
$responseEvent->headers = $response->getHeaders(); | ||||||
$responseEvent->payload = $response->getBody()->getContents(); | ||||||
$responseEvent->status = $response->getStatusCode(); | ||||||
$responseEvent->clientId = $requestEvent->clientId; | ||||||
$responseEvent->requestId = $requestEvent->requestId; | ||||||
|
||||||
$this->logResponse($responseEvent); | ||||||
|
||||||
return $response; | ||||||
}); | ||||||
} | ||||||
|
||||||
return $promise; | ||||||
} | ||||||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -16,22 +16,28 @@ | |||||||||||||||||
*/ | ||||||||||||||||||
namespace Google\Auth\HttpHandler; | ||||||||||||||||||
|
||||||||||||||||||
use Google\Auth\ApplicationDefaultCredentials; | ||||||||||||||||||
use GuzzleHttp\BodySummarizer; | ||||||||||||||||||
use GuzzleHttp\Client; | ||||||||||||||||||
use GuzzleHttp\ClientInterface; | ||||||||||||||||||
use GuzzleHttp\HandlerStack; | ||||||||||||||||||
use GuzzleHttp\Middleware; | ||||||||||||||||||
use Psr\Log\LoggerInterface; | ||||||||||||||||||
|
||||||||||||||||||
class HttpHandlerFactory | ||||||||||||||||||
{ | ||||||||||||||||||
/** | ||||||||||||||||||
* Builds out a default http handler for the installed version of guzzle. | ||||||||||||||||||
* | ||||||||||||||||||
* @param ClientInterface $client | ||||||||||||||||||
* @param null|false|LoggerInterface $logger | ||||||||||||||||||
* @return Guzzle6HttpHandler|Guzzle7HttpHandler | ||||||||||||||||||
* @throws \Exception | ||||||||||||||||||
*/ | ||||||||||||||||||
public static function build(ClientInterface $client = null) | ||||||||||||||||||
public static function build( | ||||||||||||||||||
ClientInterface $client = null, | ||||||||||||||||||
null|false|LoggerInterface $logger = null, | ||||||||||||||||||
) | ||||||||||||||||||
{ | ||||||||||||||||||
if (is_null($client)) { | ||||||||||||||||||
$stack = null; | ||||||||||||||||||
|
@@ -45,6 +51,12 @@ public static function build(ClientInterface $client = null) | |||||||||||||||||
$client = new Client(['handler' => $stack]); | ||||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
if ($logger === false) { | ||||||||||||||||||
$logger = null; | ||||||||||||||||||
} else { | ||||||||||||||||||
$logger = $logger ?? ApplicationDefaultCredentials::getDefaultLogger(); | ||||||||||||||||||
} | ||||||||||||||||||
Comment on lines
+54
to
+58
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is 100% not important, if you don't like it please disregard. I only suggest it because it sets the variable in one statement, so it might be considered a little easier to follow (but that's entirely subjective)
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I personally don't love the |
||||||||||||||||||
|
||||||||||||||||||
$version = null; | ||||||||||||||||||
if (defined('GuzzleHttp\ClientInterface::MAJOR_VERSION')) { | ||||||||||||||||||
$version = ClientInterface::MAJOR_VERSION; | ||||||||||||||||||
|
@@ -54,9 +66,9 @@ public static function build(ClientInterface $client = null) | |||||||||||||||||
|
||||||||||||||||||
switch ($version) { | ||||||||||||||||||
case 6: | ||||||||||||||||||
return new Guzzle6HttpHandler($client); | ||||||||||||||||||
return new Guzzle6HttpHandler($client, $logger); | ||||||||||||||||||
case 7: | ||||||||||||||||||
return new Guzzle7HttpHandler($client); | ||||||||||||||||||
return new Guzzle7HttpHandler($client, $logger); | ||||||||||||||||||
default: | ||||||||||||||||||
throw new \Exception('Version not supported'); | ||||||||||||||||||
} | ||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This isn't used - we should remove it
That's (partly) the reason the CS tests are failing
https://github.com/googleapis/google-auth-library-php/actions/runs/11411641502/job/31756272056