Skip to content

Commit b8b887f

Browse files
authored
Add connectTimeout() and timeout() options (#5)
1 parent 04c337e commit b8b887f

File tree

8 files changed

+51
-2
lines changed

8 files changed

+51
-2
lines changed

src/Console/Commands/CurlCommand.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
class CurlCommand extends Command
99
{
10-
protected $signature = 'shift:curl {--X|request=GET} {--H|header=*} {--d|data=*} {--F|form=*} {--digest} {--basic} {--connect-timeout=} {--retry=} {--s|silent} {--u|user=} {url}';
10+
protected $signature = 'shift:curl {--X|request=GET} {--H|header=*} {--d|data=*} {--F|form=*} {--digest} {--basic} {--connect-timeout=} {--max-timeout=} {--retry=} {--s|silent} {--u|user=} {url}';
1111

1212
protected $description = 'Convert a UNIX curl request to an HTTP Client request';
1313

@@ -31,7 +31,8 @@ private function gatherOptions()
3131
'fields' => $this->option('form'),
3232
'digest' => $this->option('digest'),
3333
'basic' => $this->option('basic'),
34-
'timeout' => $this->option('connect-timeout'),
34+
'connectTimeout' => $this->option('connect-timeout'),
35+
'maxTimeout' => $this->option('max-timeout'),
3536
'retry' => $this->option('retry'),
3637
'silent' => $this->option('silent'),
3738
'user' => $this->option('user'),

src/Models/Request.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ class Request
2222

2323
private ?string $password = null;
2424

25+
private ?int $maxTimeout = null;
26+
27+
private ?int $connectTimeout = null;
28+
2529
private function __construct($url, $method)
2630
{
2731
$this->url = $url;
@@ -70,6 +74,14 @@ public static function create(array $data): self
7074
[$request->username, $request->password] = explode(':', $data['user'], 2);
7175
}
7276

77+
if ($data['maxTimeout']) {
78+
$request->maxTimeout = $data['maxTimeout'];
79+
}
80+
81+
if ($data['connectTimeout']) {
82+
$request->connectTimeout = $data['connectTimeout'];
83+
}
84+
7385
return $request;
7486
}
7587

@@ -83,6 +95,16 @@ public function hasUsernameOrPassword(): bool
8395
return isset($this->username) || isset($this->password);
8496
}
8597

98+
public function hasMaxTimeout(): bool
99+
{
100+
return isset($this->maxTimeout);
101+
}
102+
103+
public function hasConnectTimeout(): bool
104+
{
105+
return isset($this->connectTimeout);
106+
}
107+
86108
public function headers(): array
87109
{
88110
return $this->headers;
@@ -118,6 +140,16 @@ public function password(): string
118140
return $this->password ?? '';
119141
}
120142

143+
public function maxTimeout(): int
144+
{
145+
return $this->maxTimeout;
146+
}
147+
148+
public function connectTimeout(): int
149+
{
150+
return $this->connectTimeout;
151+
}
152+
121153
private static function convertDataType(string $value)
122154
{
123155
return preg_match('/^[1-9]\d*$/', $value) ? intval($value) : $value;

src/Support/HttpCall.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,14 @@ private static function generateOptions(Request $request): string
8585
$options[] = 'withHeaders(' . self::prettyPrintArray($headers) . ')';
8686
}
8787

88+
if ($request->hasMaxTimeout()) {
89+
$options[] = 'timeout(' . $request->maxTimeout() . ')';
90+
}
91+
92+
if ($request->hasConnectTimeout()) {
93+
$options[] = 'connectTimeout(' . $request->connectTimeout() . ')';
94+
}
95+
8896
if (empty($options)) {
8997
return '';
9098
}

tests/Feature/Console/Commands/CurlCommandTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ public function curlCommandFixtures()
3737
'Mailgun example request' => ['mailgun-example'],
3838
'Digital Ocean example request' => ['digital-ocean-example'],
3939
'Stripe example request' => ['stripe-example'],
40+
'Initial connection timeout' => ['connect-timeout'],
41+
'Entire transaction timeout' => ['max-timeout'],
4042
];
4143
}
4244
}

tests/fixtures/connect-timeout.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
curl --connect-timeout 5 https://example.com

tests/fixtures/connect-timeout.out

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Http::connectTimeout(5)
2+
->get('https://example.com');

tests/fixtures/max-timeout.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
curl --max-timeout 5 https://example.com

tests/fixtures/max-timeout.out

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Http::timeout(5)
2+
->get('https://example.com');

0 commit comments

Comments
 (0)