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'));
 }
Example #2
0
 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'));
 }
Example #3
0
 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());
     }
 }
Example #7
0
 /**
  * @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);
 }