Skip to content

Commit 78c76d6

Browse files
committed
Ensure errors from daemon are wrapped correctly
1 parent 6c0d308 commit 78c76d6

File tree

6 files changed

+191
-81
lines changed

6 files changed

+191
-81
lines changed

app/Http/Controllers/Api/Client/Servers/CommandController.php

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
use Illuminate\Http\Response;
66
use Pterodactyl\Models\Server;
77
use Psr\Http\Message\ResponseInterface;
8-
use GuzzleHttp\Exception\RequestException;
98
use GuzzleHttp\Exception\BadResponseException;
109
use Symfony\Component\HttpKernel\Exception\HttpException;
1110
use Pterodactyl\Repositories\Wings\DaemonCommandRepository;
@@ -45,19 +44,21 @@ public function index(SendCommandRequest $request, Server $server): Response
4544
{
4645
try {
4746
$this->repository->setServer($server)->send($request->input('command'));
48-
} catch (RequestException $exception) {
49-
if ($exception instanceof BadResponseException) {
47+
} catch (DaemonConnectionException $exception) {
48+
$previous = $exception->getPrevious();
49+
50+
if ($previous instanceof BadResponseException) {
5051
if (
51-
$exception->getResponse() instanceof ResponseInterface
52-
&& $exception->getResponse()->getStatusCode() === Response::HTTP_BAD_GATEWAY
52+
$previous->getResponse() instanceof ResponseInterface
53+
&& $previous->getResponse()->getStatusCode() === Response::HTTP_BAD_GATEWAY
5354
) {
5455
throw new HttpException(
5556
Response::HTTP_BAD_GATEWAY, 'Server must be online in order to send commands.', $exception
5657
);
5758
}
5859
}
5960

60-
throw new DaemonConnectionException($exception);
61+
throw $exception;
6162
}
6263

6364
return $this->returnNoContent();

app/Http/Controllers/Api/Client/Servers/FileController.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\RenameFileRequest;
2020
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\CreateFolderRequest;
2121
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\CompressFilesRequest;
22+
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\DecompressFilesRequest;
2223
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\GetFileContentsRequest;
2324
use Pterodactyl\Http\Requests\Api\Client\Servers\Files\WriteFileContentRequest;
2425

@@ -88,7 +89,9 @@ public function directory(ListFilesRequest $request, Server $server): array
8889
* @param \Pterodactyl\Http\Requests\Api\Client\Servers\Files\GetFileContentsRequest $request
8990
* @param \Pterodactyl\Models\Server $server
9091
* @return \Illuminate\Http\Response
92+
*
9193
* @throws \Pterodactyl\Exceptions\Http\Server\FileSizeTooLargeException
94+
* @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException
9295
*/
9396
public function contents(GetFileContentsRequest $request, Server $server): Response
9497
{
@@ -139,6 +142,8 @@ public function download(GetFileContentsRequest $request, Server $server)
139142
* @param \Pterodactyl\Http\Requests\Api\Client\Servers\Files\WriteFileContentRequest $request
140143
* @param \Pterodactyl\Models\Server $server
141144
* @return \Illuminate\Http\JsonResponse
145+
*
146+
* @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException
142147
*/
143148
public function write(WriteFileContentRequest $request, Server $server): JsonResponse
144149
{
@@ -156,6 +161,8 @@ public function write(WriteFileContentRequest $request, Server $server): JsonRes
156161
* @param \Pterodactyl\Http\Requests\Api\Client\Servers\Files\CreateFolderRequest $request
157162
* @param \Pterodactyl\Models\Server $server
158163
* @return \Illuminate\Http\JsonResponse
164+
*
165+
* @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException
159166
*/
160167
public function create(CreateFolderRequest $request, Server $server): JsonResponse
161168
{
@@ -172,6 +179,8 @@ public function create(CreateFolderRequest $request, Server $server): JsonRespon
172179
* @param \Pterodactyl\Http\Requests\Api\Client\Servers\Files\RenameFileRequest $request
173180
* @param \Pterodactyl\Models\Server $server
174181
* @return \Illuminate\Http\JsonResponse
182+
*
183+
* @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException
175184
*/
176185
public function rename(RenameFileRequest $request, Server $server): JsonResponse
177186
{
@@ -188,6 +197,8 @@ public function rename(RenameFileRequest $request, Server $server): JsonResponse
188197
* @param \Pterodactyl\Http\Requests\Api\Client\Servers\Files\CopyFileRequest $request
189198
* @param \Pterodactyl\Models\Server $server
190199
* @return \Illuminate\Http\JsonResponse
200+
*
201+
* @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException
191202
*/
192203
public function copy(CopyFileRequest $request, Server $server): JsonResponse
193204
{
@@ -202,9 +213,14 @@ public function copy(CopyFileRequest $request, Server $server): JsonResponse
202213
* @param \Pterodactyl\Http\Requests\Api\Client\Servers\Files\CompressFilesRequest $request
203214
* @param \Pterodactyl\Models\Server $server
204215
* @return array
216+
*
217+
* @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException
205218
*/
206219
public function compress(CompressFilesRequest $request, Server $server): array
207220
{
221+
// Allow up to five minutes for this request to process before timing out.
222+
set_time_limit(300);
223+
208224
$file = $this->fileRepository->setServer($server)
209225
->compressFiles(
210226
$request->input('root'), $request->input('files')
@@ -221,6 +237,8 @@ public function compress(CompressFilesRequest $request, Server $server): array
221237
* @param \Pterodactyl\Http\Requests\Api\Client\Servers\Files\DeleteFileRequest $request
222238
* @param \Pterodactyl\Models\Server $server
223239
* @return \Illuminate\Http\JsonResponse
240+
*
241+
* @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException
224242
*/
225243
public function delete(DeleteFileRequest $request, Server $server): JsonResponse
226244
{

app/Http/Controllers/Api/Client/Servers/PowerController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ public function __construct(DaemonPowerRepository $repository)
3333
* @param \Pterodactyl\Http\Requests\Api\Client\Servers\SendPowerRequest $request
3434
* @param \Pterodactyl\Models\Server $server
3535
* @return \Illuminate\Http\Response
36+
*
37+
* @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException
3638
*/
3739
public function index(SendPowerRequest $request, Server $server): Response
3840
{

app/Repositories/Wings/DaemonCommandRepository.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
use Webmozart\Assert\Assert;
66
use Pterodactyl\Models\Server;
77
use Psr\Http\Message\ResponseInterface;
8+
use GuzzleHttp\Exception\TransferException;
9+
use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException;
810

911
class DaemonCommandRepository extends DaemonRepository
1012
{
@@ -13,16 +15,22 @@ class DaemonCommandRepository extends DaemonRepository
1315
*
1416
* @param string|string[] $command
1517
* @return \Psr\Http\Message\ResponseInterface
18+
*
19+
* @throws \Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException
1620
*/
1721
public function send($command): ResponseInterface
1822
{
1923
Assert::isInstanceOf($this->server, Server::class);
2024

21-
return $this->getHttpClient()->post(
22-
sprintf('/api/servers/%s/commands', $this->server->uuid),
23-
[
24-
'json' => ['commands' => is_array($command) ? $command : [$command]],
25-
]
26-
);
25+
try {
26+
return $this->getHttpClient()->post(
27+
sprintf('/api/servers/%s/commands', $this->server->uuid),
28+
[
29+
'json' => ['commands' => is_array($command) ? $command : [$command]],
30+
]
31+
);
32+
} catch (TransferException $exception) {
33+
throw new DaemonConnectionException($exception);
34+
}
2735
}
2836
}

0 commit comments

Comments
 (0)