Skip to content

Commit 909a56d

Browse files
authored
Merge pull request thephpleague#676 from pradtke/bug/handle-malformed-error
Avoid 'Fatal error: Wrong parameters for Exception' in error response
2 parents 63cd3ec + 5ad573b commit 909a56d

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

src/Provider/GenericProvider.php

+7-1
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,13 @@ protected function checkResponse(ResponseInterface $response, $data)
212212
{
213213
if (!empty($data[$this->responseError])) {
214214
$error = $data[$this->responseError];
215-
$code = $this->responseCode ? $data[$this->responseCode] : 0;
215+
if (!is_string($error)) {
216+
$error = var_export($error, true);
217+
}
218+
$code = $this->responseCode && !empty($data[$this->responseCode])? $data[$this->responseCode] : 0;
219+
if (!is_int($code)) {
220+
$code = intval($code);
221+
}
216222
throw new IdentityProviderException($error, $code, $data);
217223
}
218224
}

test/src/Provider/GenericProviderTest.php

+18-5
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,12 @@ public function testCheckResponse()
129129
}
130130

131131
/**
132+
* @param array $error The error response to parse
133+
* @param array $extraOptions Any extra options to configure the generic provider with.
134+
* @dataProvider checkResponseThrowsExceptionProvider
132135
* @expectedException League\Oauth2\Client\Provider\Exception\IdentityProviderException
133136
*/
134-
public function testCheckResponseThrowsException()
137+
public function testCheckResponseThrowsException(array $error, array $extraOptions = [])
135138
{
136139
$response = Phony::mock(ResponseInterface::class);
137140

@@ -141,15 +144,25 @@ public function testCheckResponseThrowsException()
141144
'urlResourceOwnerDetails' => 'http://example.com/user',
142145
];
143146

144-
$provider = new GenericProvider($options);
147+
$provider = new GenericProvider($options + $extraOptions);
145148

146149
$reflection = new \ReflectionClass(get_class($provider));
147150

148151
$checkResponse = $reflection->getMethod('checkResponse');
149152
$checkResponse->setAccessible(true);
150153

151-
$checkResponse->invokeArgs($provider, [$response->get(), [
152-
'error' => 'foobar',
153-
]]);
154+
$checkResponse->invokeArgs($provider, [$response->get(), $error]);
155+
}
156+
157+
public function checkResponseThrowsExceptionProvider() {
158+
return [
159+
[['error' => 'foobar',]],
160+
[['error' => 'foobar',] , ['responseCode' => 'code']],
161+
// Some servers return non-compliant responses. Provider shouldn't 'Fatal error: Wrong parameters'
162+
[['error' => 'foobar', 'code' => 'abc55'], ['responseCode' => 'code']],
163+
[['error' => 'foobar', 'code' => ['badformat']], ['responseCode' => 'code']],
164+
[['error' => ['message' => 'msg', 'code' => 56]]],
165+
[['error' => ['errors' => ['code' => 67, 'message' => 'msg']]]],
166+
];
154167
}
155168
}

0 commit comments

Comments
 (0)