Skip to content

Commit 0b8eeee

Browse files
authored
Merge pull request mevdschee#333 from saraf/master
Correct 400 response to malformed json in POST
2 parents d94ad6c + a3be915 commit 0b8eeee

File tree

3 files changed

+33
-1
lines changed

3 files changed

+33
-1
lines changed

api.php

+14
Original file line numberDiff line numberDiff line change
@@ -1270,6 +1270,15 @@ protected function exitWith404($type) {
12701270
}
12711271
}
12721272

1273+
protected function exitWith400($type) {
1274+
if (isset($_SERVER['REQUEST_METHOD'])) {
1275+
header('Content-Type:',true,400);
1276+
die("The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications. ($type)");
1277+
} else {
1278+
throw new \Exception("Bad request ($type)");
1279+
}
1280+
}
1281+
12731282
protected function exitWith422($object) {
12741283
if (isset($_SERVER['REQUEST_METHOD'])) {
12751284
header('Content-Type:',true,422);
@@ -1684,6 +1693,11 @@ protected function retrieveInputs($data) {
16841693
$input = false;
16851694
} else if ($data[0]=='{' || $data[0]=='[') {
16861695
$input = json_decode($data);
1696+
$causeCode = json_last_error();
1697+
if ($causeCode !== JSON_ERROR_NONE) {
1698+
$errorString = "Error decoding input JSON. json_last_error code: " . $causeCode;
1699+
$this->exitWith400($errorString);
1700+
}
16871701
} else {
16881702
parse_str($data, $input);
16891703
foreach ($input as $key => $value) {

tests/Api.php

+18
Original file line numberDiff line numberDiff line change
@@ -138,4 +138,22 @@ public function expect($output, $error=false)
138138
}
139139
return $this;
140140
}
141+
142+
public function expectPattern($expectedOutputPattern, $expectedErrorPattern) {
143+
$exception = false;
144+
ob_start();
145+
try {
146+
$this->api->executeCommand();
147+
} catch (\Exception $e) {
148+
$exception = $e->getMessage();
149+
}
150+
$outputData = ob_get_contents();
151+
ob_end_clean();
152+
if ($exception) {
153+
$this->test->assertRegExp($expectedErrorPattern, $exception);
154+
} else {
155+
$this->test->assertRegExp($expectedOutputPattern, $outputData);
156+
}
157+
return $this;
158+
}
141159
}

tests/Tests.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ public function testErrorOnInvalidJson()
290290
{
291291
$test = new Api($this);
292292
$test->post('/posts', '{"}');
293-
$test->expect(false, 'Not found (input)');
293+
$test->expectPattern(false, '/^Bad request.*$/');
294294
}
295295

296296
public function testErrorOnDuplicatePrimaryKey()

0 commit comments

Comments
 (0)