public function testSetsResponseBodyForDownload() { $body = Stream::factory(); $request = new Request('GET', 'http://httbin.org'); $ee = null; $request->getEmitter()->on('headers', function (HeadersEvent $e) use(&$ee) { $ee = $e; }); $t = new Transaction(new Client(), $request); $m = new RequestMediator($t, new MessageFactory()); $m->setResponseBody($body); $this->assertEquals(18, $m->receiveResponseHeader(null, "HTTP/1.1 202 FOO\r\n")); $this->assertEquals(10, $m->receiveResponseHeader(null, "Foo: Bar\r\n")); $this->assertEquals(11, $m->receiveResponseHeader(null, "Baz : Bam\r\n")); $this->assertEquals(19, $m->receiveResponseHeader(null, "Content-Length: 3\r\n")); $this->assertEquals(2, $m->receiveResponseHeader(null, "\r\n")); $this->assertNotNull($ee); $this->assertEquals(202, $t->getResponse()->getStatusCode()); $this->assertEquals('FOO', $t->getResponse()->getReasonPhrase()); $this->assertEquals('Bar', $t->getResponse()->getHeader('Foo')); $this->assertEquals('Bam', $t->getResponse()->getHeader('Baz')); $m->writeResponseBody(null, 'foo'); $this->assertEquals('foo', (string) $body); $this->assertEquals('3', $t->getResponse()->getHeader('Content-Length')); }
public function testDispatchesErrorEventAndRecovers() { Server::flush(); Server::enqueue("HTTP/1.1 201 OK\r\nContent-Length: 0\r\n\r\n"); $r = new Request('GET', Server::$url); $t = new Transaction(new Client(), $r); $a = $this->getAdapter(); $r->getEmitter()->once('complete', function (CompleteEvent $e) { throw new RequestException('Foo', $e->getRequest()); }); $r->getEmitter()->on('error', function (ErrorEvent $e) { $e->intercept(new Response(200, ['Foo' => 'bar'])); }); $response = $a->send($t); $this->assertEquals(200, $response->getStatusCode()); $this->assertEquals('bar', $response->getHeader('Foo')); }
public function testCloneIsDeep() { $r = new Request('GET', '/test', ['foo' => 'baz'], Stream::factory('foo')); $r2 = clone $r; $this->assertNotSame($r->getEmitter(), $r2->getEmitter()); $this->assertEquals('foo', $r2->getBody()); $r->getConfig()->set('test', 123); $this->assertFalse($r2->getConfig()->hasKey('test')); $r->setPath('/abc'); $this->assertEquals('/test', $r2->getPath()); }
public function testThrowsUnInterceptedErrors() { $ex = new \Exception('Foo'); $client = new Client(); $request = new Request('GET', '/'); $t = new Transaction($client, $request); $errCalled = 0; $request->getEmitter()->on('before', function (BeforeEvent $e) use($ex) { throw $ex; }); $request->getEmitter()->on('error', function (ErrorEvent $e) use(&$errCalled) { $errCalled++; }); try { RequestEvents::emitBefore($t); $this->fail('Did not throw'); } catch (RequestException $e) { $this->assertEquals(1, $errCalled); } }
public function testCanInterceptBeforeSending() { $client = new Client(); $request = new Request('GET', 'http://httpbin.org/get'); $response = new Response(200); $request->getEmitter()->on('before', function (BeforeEvent $e) use($response) { $e->intercept($response); }); $transaction = new Transaction($client, $request); $f = 'does_not_work'; $a = new CurlAdapter(new MessageFactory(), ['handle_factory' => $f]); $a->send($transaction); $this->assertSame($response, $transaction->getResponse()); }
public function testThrowsAndReleasesWhenErrorDuringCompleteEvent() { Server::flush(); Server::enqueue("HTTP/1.1 500 Internal Server Error\r\nContent-Length: 0\r\n\r\n"); $request = new Request('GET', Server::$url); $request->getEmitter()->on('complete', function (CompleteEvent $e) { throw new RequestException('foo', $e->getRequest()); }); $t = new Transaction(new Client(), $request); $a = new MultiAdapter(new MessageFactory()); try { $a->send($t); $this->fail('Did not throw'); } catch (RequestException $e) { $this->assertSame($request, $e->getRequest()); } }
/** * @param Request $request * @param bool $attachment * * @return \React\Promise\Promise that yields the response data, or a CompleteEvent if attachment = true */ protected function queueRequest(Request $request, $attachment = false) { $deferred = new Deferred(); $this->requests[] = $request; $request->getEmitter()->on('complete', function (CompleteEvent $e) use($attachment, $deferred) { if (!$attachment) { $outer = $e->getResponse()->json(); $deferred->resolve($outer['response']['data']); } else { $deferred->resolve($e); } }); $request->getEmitter()->on('error', function (ErrorEvent $e) use($deferred) { $response = $e->getResponse() ? $e->getResponse()->getBody()->getContents() : 'No response body'; $deferred->reject($e->getException()->getMessage() . "\nBody: " . $response); }); return $deferred->promise(); }
public function testEmitsHeadersEvent() { $m = new MockAdapter(new Response(404)); $request = new Request('GET', 'http://httbin.org'); $called = false; $request->getEmitter()->once('headers', function () use(&$called) { $called = true; }); $m->send(new Transaction(new Client(), $request)); $this->assertTrue($called); }