4
4
5
5
use GuzzleHttp \MessageFormatter ;
6
6
use Illuminate \Http \Client \Events \RequestSending ;
7
- use Illuminate \Support \Arr ;
8
7
use Illuminate \Support \Facades \Log ;
8
+ use Psr \Http \Message \RequestInterface ;
9
9
10
10
class LogRequestSending
11
11
{
@@ -17,19 +17,52 @@ class LogRequestSending
17
17
*/
18
18
public function handle (RequestSending $ event )
19
19
{
20
+ $ obfuscate = config ('http-client-global-logger.obfuscate.enabled ' );
21
+ $ psrRequest = $ event ->request ->toPsrRequest ();
22
+
23
+ if ($ obfuscate ) {
24
+ $ psrRequest = $ this ->obfuscateHeaders ($ psrRequest );
25
+ }
26
+
20
27
$ formatter = new MessageFormatter (config ('http-client-global-logger.format.request ' ));
21
- $ message = $ formatter ->format (
22
- $ event -> request -> toPsrRequest ()
23
- );
24
-
25
- if ( config ( ' http-client-global-logger.obfuscate.enabled ' )) {
26
- $ message = preg_replace (
27
- config ('http-client-global-logger.obfuscate.patterns ' ),
28
- config ( ' http-client-global-logger.obfuscate.replacement ' ),
29
- $ message
30
- );
28
+ $ message = $ formatter ->format ($ psrRequest );
29
+
30
+ if ( $ obfuscate ) {
31
+ foreach ( config ( ' http-client-global-logger.obfuscate.body_keys ' ) as $ key ) {
32
+ $ message = preg_replace (
33
+ ' /(?<=" ' . $ key . ' ":").*(?=")/mU ' ,
34
+ config ('http-client-global-logger.obfuscate.replacement ' ),
35
+ $ message
36
+ );
37
+ }
31
38
}
32
39
33
40
Log::channel (config ('http-client-global-logger.channel ' ))->info ($ message );
34
41
}
42
+
43
+ /**
44
+ * Obfuscate headers, e.g. Authorization header.
45
+ *
46
+ * @param RequestInterface $request
47
+ * @return RequestInterface
48
+ */
49
+ protected function obfuscateHeaders (RequestInterface $ request ): RequestInterface
50
+ {
51
+ $ replacement = config ('http-client-global-logger.obfuscate.replacement ' );
52
+
53
+ // TODO: Currently, there is no clean way of modifying the PendingRequest body, e.g. via Macros
54
+ // see https://stackoverflow.com/q/60603066/5982842
55
+ // Tried to modify data directly on HTTP Client Request object, but PsrRequest is already set
56
+ // $data = $request->data();
57
+ // data_set($data, 'params.pass', $replacement);
58
+ // $request = $request->withData($data);
59
+
60
+ foreach (config ('http-client-global-logger.obfuscate.headers ' ) as $ name ) {
61
+ if ($ request ->hasHeader ($ name )) {
62
+ $ request = $ request ->withHeader ($ name , $ replacement );
63
+ }
64
+ }
65
+
66
+ return $ request ;
67
+ }
35
68
}
0 commit comments