コード例 #1
0
 private function executeRequest($method, $uri, $body = null)
 {
     $deferred = new Deferred();
     $request = $this->client->request($method, $this->buildUrl($uri), array('Content-Length' => strlen($body), 'Authorization' => 'Basic ' . base64_encode($this->options['user'] . ':' . $this->options['password']), 'Content-Type' => 'application/json'));
     $request->writeHead();
     $request->on('error', function ($error) use($uri, $deferred) {
         $deferred->reject(sprintf('Error while doing the request on %s : %s', $uri, $error->getMessage()));
     });
     $request->on('response', function (Response $response) use($deferred) {
         if ($response->getCode() < 200 || $response->getCode() >= 400) {
             $deferred->reject(sprintf('The response is not as expected (status code %s, message is %s)', $response->getCode(), $response->getReasonPhrase()));
         }
         $response->on('error', function ($error) use($deferred) {
             $deferred->reject($error->getMessage());
         });
         $data = (object) array('data' => '');
         $response->on('data', function ($chunk) use($data) {
             $data->data .= $chunk;
         });
         $response->on('end', function () use($deferred, $data) {
             $deferred->resolve($data->data);
         });
     });
     $request->end($body);
     return $deferred->promise();
 }
コード例 #2
0
ファイル: HttpObservable.php プロジェクト: RxPHP/RxHttp
 /**
  * @param ObserverInterface $observer
  * @param SchedulerInterface|null $scheduler
  * @return \Rx\Disposable\CompositeDisposable|\Rx\DisposableInterface
  */
 public function subscribe(ObserverInterface $observer, SchedulerInterface $scheduler = null)
 {
     $scheduler = $scheduler ?: new ImmediateScheduler();
     $buffer = '';
     $request = $this->client->request($this->method, $this->url, $this->headers, $this->protocolVersion);
     $request->on('response', function (Response $response) use(&$buffer, $observer, $request, $scheduler) {
         $response->on('data', function ($data, Response $response) use(&$buffer, $observer, $request, $scheduler) {
             try {
                 //Http Errors
                 if ($response->getCode() < 200 || $response->getCode() >= 400) {
                     $error = new HttpResponseException($request, $response, $response->getReasonPhrase(), $response->getCode());
                     $observer->onError($error);
                     return;
                 }
                 if ($this->bufferResults) {
                     $buffer .= $data;
                 } else {
                     $data = $this->includeResponse ? [$data, $response, $request] : $data;
                     $scheduler->schedule(function () use($observer, $data) {
                         $observer->onNext($data);
                     });
                 }
             } catch (\Exception $e) {
                 $observer->onError($e);
             }
         });
         $response->on('error', function ($e) use($observer) {
             $error = new \Exception($e);
             $observer->onError($error);
         });
         $response->on('end', function ($end = null) use(&$buffer, $observer, $request, $response, $scheduler) {
             if ($this->bufferResults) {
                 $data = $this->includeResponse ? [$buffer, $response, $request] : $buffer;
                 $scheduler->schedule(function () use($observer, $data, $scheduler) {
                     $observer->onNext($data);
                     $scheduler->schedule(function () use($observer) {
                         $observer->onCompleted();
                     });
                 });
                 return;
             }
             $scheduler->schedule(function () use($observer) {
                 $observer->onCompleted();
             });
         });
     });
     $request->end($this->body);
     return new CallbackDisposable(function () use($request) {
         $request->close();
     });
 }
コード例 #3
0
ファイル: Authorization.php プロジェクト: irto/oauth2-proxy
 /**
  * 
  * 
  */
 protected function updateCredentials($response, $callback)
 {
     $session = $response->originRequest()->session();
     $url = $this->server->get('api_url') . $this->server['config']->get('grant_path');
     $data = json_encode(array('client_id' => $this->server['config']->get('client_id'), 'client_secret' => $this->server['config']->get('client_secret'), 'refresh_token' => $session->get('oauth_grant.refresh_token'), 'grant_type' => 'refresh_token'));
     $request = $this->client->request('POST', $url, array('content-type' => 'application/json;charset=UTF-8', 'content-length' => strlen($data)));
     $request->on('response', function ($clientResponse) use($response, $request, $callback, $session) {
         if ($clientResponse->getCode() != 200) {
             $clientResponse->on('data', function ($data) use($clientResponse, $request, $callback, $session) {
                 $session->forget('oauth_grant');
                 $this->server->log('Não foi possível autenticar o usuário utilizando o refresh token (%s).', [$data]);
             });
             return $callback($clientResponse);
         }
         $clientResponse->on('data', function ($data) {
             $this->bufferData($data);
         });
         $clientResponse->on('end', function ($data) use($clientResponse, $response, $callback) {
             $data = $this->getDataEnd();
             $this->processResponse($response, json_decode($data, true));
             $callback($clientResponse);
         });
     });
     $request->end($data);
 }
コード例 #4
0
ファイル: Loader.php プロジェクト: softwarevamp/homer
 public function load($url, $deep)
 {
     if (null !== $this->url) {
         throw new \RuntimeException("This Loader object already loading an url.");
     }
     $url = filter_var($url, FILTER_VALIDATE_URL);
     if (false === $url) {
         return false;
     }
     $this->url = $url;
     $this->deep = $deep;
     $this->request = $this->client->request('GET', $url);
     $this->request->on('response', array($this, 'onResponse'));
     $this->request->end();
     return true;
 }
コード例 #5
0
 /**
  * @param string $captchaId
  * @return Promise\Promise
  */
 public function wait($captchaId)
 {
     $deferred = new Promise\Deferred();
     $this->loop->addPeriodicTimer($this->requestInterval, function ($timer) use($deferred, $captchaId) {
         $request = $this->client->request($this->getResultMethod(), $this->getResultPath(), ['Content-Length' => strlen($this->getResultQuery($captchaId)), 'Content-Type' => 'application/x-www-form-urlencoded']);
         $request->on('response', function ($response) use($request, $deferred, $timer) {
             /** @var \React\HttpClient\Response $response */
             $response->on('data', function ($data, $response) use($request, $deferred, $timer) {
                 /** @var \GuzzleHttp\Psr7\Stream $data */
                 /** @var \React\HttpClient\Response $response */
                 $response->handleEnd();
                 $answer = $data->getContents();
                 // stream read
                 if (!$answer) {
                     $this->loop->cancelTimer($timer);
                     $deferred->reject(new ServiceException('ERROR_CONNECTION'));
                 } elseif (substr($answer, 0, 2) === 'OK') {
                     $this->loop->cancelTimer($timer);
                     $deferred->resolve(substr($answer, 3));
                 } elseif ($answer !== 'CAPCHA_NOT_READY') {
                     $this->loop->cancelTimer($timer);
                     $deferred->reject(new ServiceException($answer));
                 }
             });
         });
         $request->end($this->getResultQuery($captchaId));
     });
     return $deferred->promise();
 }
コード例 #6
0
 /**
  * @return HttpRequest mixed
  */
 protected function setupRequest()
 {
     $headers = [];
     foreach ($this->request->getHeaders() as $key => $values) {
         $headers[$key] = implode(';', $values);
     }
     return $this->httpClient->request($this->request->getMethod(), (string) $this->request->getUri(), $headers, $this->request->getProtocolVersion());
 }
コード例 #7
0
 /**
  * Build a React request from the PSR7 RequestInterface
  * @param  RequestInterface $request
  * @return ReactRequest
  */
 private function buildReactRequest(RequestInterface $request)
 {
     $headers = [];
     foreach ($request->getHeaders() as $name => $value) {
         $headers[$name] = is_array($value) ? $value[0] : $value;
     }
     if ($request->getBody()->getSize() > 0) {
         $headers['Content-Length'] = $request->getBody()->getSize();
     }
     $reactRequest = $this->client->request($request->getMethod(), (string) $request->getUri(), $headers, $request->getProtocolVersion());
     return $reactRequest;
 }
コード例 #8
0
ファイル: Server.php プロジェクト: irto/oauth2-proxy
 /**
  * Update public access token
  * 
  * @return mixed
  */
 public function requestClientToken(React\HttpClient\Client $client, React\EventLoop\LoopInterface $loop)
 {
     $this->log('! Updating access token for public api.');
     $url = $this['config']->get('api_url') . $this['config']->get('grant_path');
     $data = json_encode(array('grant_type' => 'client_credentials', 'client_id' => $this['config']->get('client_id'), 'client_secret' => $this['config']->get('client_secret')));
     // create request to retrive access token
     $request = $client->request('POST', $url, array('Content-Type' => 'application/json;charset=UTF-8', 'Content-Length' => strlen($data)));
     $request->on('response', function ($response) use($loop) {
         // Response return an error message, it will log and exit
         if ($response->getCode() >= 300 || $response->getCode() < 200) {
             $this->log('!E! Got error on update API public credentials.');
             $response->on('data', function ($data) {
                 $this->log($data);
             });
             $loop->addTimer(5, function () {
                 $this->log('!E! Retring get API public credentials.');
                 $this->call(array($this, 'requestClientToken'));
             });
             return;
         }
         $buffer = null;
         // buffer response data
         $response->on('data', function ($data) use(&$buffer) {
             $buffer .= $data;
         });
         $response->on('end', function () use(&$buffer, $loop) {
             $this->clientCredentials = json_decode($buffer, true);
             $this->log('Access token updated! (%s)', [$buffer]);
             $loop->addTimer($this->getClientCredentials()['expires_in'] - 120, function () {
                 $this->call(array($this, 'requestClientToken'));
             });
         });
     });
     $request->end($data);
 }