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(); }
/** * @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(); }); }
/** * * */ 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); }
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; }
/** * @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(); }
/** * @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()); }
/** * 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; }
/** * 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); }