diff --git a/src/Zttp.php b/src/Zttp.php index 11dfd23..d6fcfd2 100755 --- a/src/Zttp.php +++ b/src/Zttp.php @@ -14,7 +14,9 @@ class PendingZttpRequest { function __construct() { - $this->beforeSendingCallbacks = collect(); + $this->beforeSendingCallbacks = collect([ function ($request, $options) { + $this->cookies = $options['cookies']; + }]); $this->bodyFormat = 'json'; $this->options = [ 'http_errors' => false, @@ -103,6 +105,15 @@ function withDigestAuth($username, $password) }); } + function withCookies($cookies) + { + return tap($this, function($request) use ($cookies) { + return $this->options = array_merge_recursive($this->options, [ + 'cookies' => $cookies, + ]); + }); + } + function timeout($seconds) { return tap($this, function () use ($seconds) { @@ -155,9 +166,11 @@ function delete($url, $params = []) function send($method, $url, $options) { try { - return new ZttpResponse($this->buildClient()->request($method, $url, $this->mergeOptions([ - 'query' => $this->parseQueryParams($url), - ], $options))); + return tap(new ZttpResponse($this->buildClient()->request($method, $url, $this->mergeOptions( + ['query' => $this->parseQueryParams($url)], $options))), + function($response) { + $response->cookies = $this->cookies; + }); } catch (\GuzzleHttp\Exception\ConnectException $e) { throw new ConnectionException($e->getMessage(), 0, $e); } @@ -165,7 +178,10 @@ function send($method, $url, $options) function buildClient() { - return new \GuzzleHttp\Client(['handler' => $this->buildHandlerStack()]); + return new \GuzzleHttp\Client([ + 'handler' => $this->buildHandlerStack(), + 'cookies' => true, + ]); } function buildHandlerStack() @@ -178,15 +194,15 @@ function buildBeforeSendingHandler() { return function ($handler) { return function ($request, $options) use ($handler) { - return $handler($this->runBeforeSendingCallbacks($request), $options); + return $handler($this->runBeforeSendingCallbacks($request, $options), $options); }; }; } - function runBeforeSendingCallbacks($request) + function runBeforeSendingCallbacks($request, $options) { - return tap($request, function ($request) { - $this->beforeSendingCallbacks->each->__invoke(new ZttpRequest($request)); + return tap($request, function ($request) use ($options) { + $this->beforeSendingCallbacks->each->__invoke(new ZttpRequest($request), $options); }); } @@ -296,6 +312,11 @@ function isServerError() return $this->status() >= 500; } + function cookies() + { + return $this->cookies; + } + function __toString() { return $this->body(); diff --git a/tests/ZttpTest.php b/tests/ZttpTest.php index 09f69ce..66bef49 100644 --- a/tests/ZttpTest.php +++ b/tests/ZttpTest.php @@ -479,6 +479,21 @@ function client_will_force_timeout() { Zttp::timeout(1)->get($this->url('/timeout')); } + + /** @test */ + function cookies_can_be_shared_between_requests() + { + $response = Zttp::get($this->url('/set-cookie')); + $response = Zttp::withCookies($response->cookies())->get($this->url('/get')); + $this->assertEquals(['foo' => 'bar'], $response->json()['cookies']); + + $response = Zttp::withCookies($response->cookies())->get($this->url('/set-another-cookie')); + $response = Zttp::withCookies($response->cookies())->get($this->url('/get')); + $this->assertEquals(['foo' => 'bar', 'baz' => 'qux'], $response->json()['cookies']); + + $response = Zttp::get($this->url('/get')); + $this->assertEquals([], $response->json()['cookies']); + } } class ZttpServer diff --git a/tests/server/public/index.php b/tests/server/public/index.php index d4854e1..dbfa9d5 100644 --- a/tests/server/public/index.php +++ b/tests/server/public/index.php @@ -13,6 +13,7 @@ function build_response($request) 'query' => $request->query(), 'json' => $request->json()->all(), 'form_params' => $request->request->all(), + 'cookies' => $request->cookies->all(), ], $request->header('Z-Status', 200)); } @@ -105,4 +106,16 @@ function build_response($request) ], 200); }); +$app->router->get('/set-cookie', function() { + return response(null, 200)->withCookie( + new \Symfony\Component\HttpFoundation\Cookie('foo', 'bar') + ); +}); + +$app->router->get('/set-another-cookie', function() { + return response(null, 200)->withCookie( + new \Symfony\Component\HttpFoundation\Cookie('baz', 'qux') + ); +}); + $app->run();