|
14 | 14 | use Amp\Socket; |
15 | 15 | use Psr\Log\LoggerInterface; |
16 | 16 | use Psr\Log\NullLogger; |
| 17 | +use Webgriffe\Esb\Exception\HttpResponseException; |
17 | 18 | use Webgriffe\Esb\HttpRequestProducerInterface; |
18 | 19 | use Webgriffe\Esb\ProducerInstance; |
| 20 | +use Webgriffe\Esb\ProducerResult; |
| 21 | + |
19 | 22 | use function Amp\call; |
20 | 23 |
|
21 | 24 | /** |
@@ -59,7 +62,7 @@ public function start(): Promise |
59 | 62 | Socket\listen("[::]:{$this->port}"), |
60 | 63 | ]; |
61 | 64 |
|
62 | | - $this->httpServer = new \Amp\Http\Server\Server( |
| 65 | + $this->httpServer = new Server( |
63 | 66 | $sockets, |
64 | 67 | new CallableRequestHandler($this->callableFromInstanceMethod('requestHandler')), |
65 | 68 | new NullLogger() |
@@ -105,9 +108,37 @@ private function requestHandler(Request $request) |
105 | 108 | 'request' => sprintf('%s %s', strtoupper($request->getMethod()), $request->getUri()) |
106 | 109 | ] |
107 | 110 | ); |
108 | | - $jobsCount = yield $producerInstance->produceAndQueueJobs($request); |
109 | | - $responseMessage = sprintf('Successfully scheduled %s job(s) to be queued.', $jobsCount); |
110 | | - return new Response(Status::OK, [], sprintf('"%s"', $responseMessage)); |
| 111 | + $producerResult = yield $producerInstance->produceAndQueueJobs($request); |
| 112 | + return $this->buildResponse($producerResult); |
| 113 | + } |
| 114 | + |
| 115 | + /** |
| 116 | + * @param ProducerResult $producerResult |
| 117 | + * @return Response |
| 118 | + */ |
| 119 | + private function buildResponse(ProducerResult $producerResult): Response |
| 120 | + { |
| 121 | + $producerException = $producerResult->getException(); |
| 122 | + if ($producerException === null) { |
| 123 | + $responseCode = Status::OK; |
| 124 | + $responseMessage = sprintf('Successfully scheduled %d job(s) to be queued.', $producerResult->getJobsCount()); |
| 125 | + } else { |
| 126 | + $responseCode = Status::INTERNAL_SERVER_ERROR; |
| 127 | + $errorMessage = 'Internal server error'; |
| 128 | + |
| 129 | + if ($producerException instanceof HttpResponseException) { |
| 130 | + $responseCode = $producerException->getHttpResponseCode(); |
| 131 | + $errorMessage = $producerException->getClientMessage(); |
| 132 | + } |
| 133 | + |
| 134 | + if ($producerResult->getJobsCount() === 0) { |
| 135 | + $responseMessage = sprintf('%s, could not schedule any jobs.', $errorMessage); |
| 136 | + } else { |
| 137 | + $responseMessage = sprintf('%s, only scheduled the first %d job(s) to be queued.', $errorMessage, $producerResult->getJobsCount()); |
| 138 | + } |
| 139 | + } |
| 140 | + |
| 141 | + return new Response($responseCode, [], sprintf('"%s"', $responseMessage)); |
111 | 142 | } |
112 | 143 |
|
113 | 144 | /** |
|
0 commit comments