protected function add_callback(RequestInterface $request, callable $callback)
 {
     $request->getEmitter()->on('response.output', function (OutputEvent $event) use($callback) {
         $callback($event->getContent(), $event->getType());
     });
     $request->getConfig()->set('attach_filter', true);
 }
Exemple #2
0
 private function emit(RequestInterface $request)
 {
     $event = new BeforeEvent(new Transaction(new Client(), $request));
     $request->getEmitter()->emit('before', $event);
 }
 /**
  * @param RequestInterface $request
  * @return RequestInterface
  */
 public function setupRequest(RequestInterface $request)
 {
     $identitiy = $this->getCurrentIdentity();
     if ($identitiy->getCookieJar() != null) {
         //todo
         // this seems pretty hacky... is there a better way to replace the cookie container of a request?
         // > Currently not @see https://github.com/guzzle/guzzle/issues/1028#issuecomment-96253542 - maybe with Guzzle 6
         // remove current cookie subscribers
         $emitter = $request->getEmitter();
         foreach ($emitter->listeners("complete") as $listener) {
             if (is_array($listener) && $listener[0] instanceof Cookie) {
                 $emitter->detach($listener[0]);
             }
         }
         // set new Cookie subscriber
         $cookie = new Cookie($identitiy->getCookieJar());
         $emitter->attach($cookie);
     }
     if ($identitiy->getUserAgent() != null) {
         $request->setHeader("user-agent", $identitiy->getUserAgent());
     }
     $headers = $identitiy->getDefaultRequestHeaders();
     if ($headers != null) {
         foreach ($headers as $key => $val) {
             $request->setHeader($key, $val);
         }
     }
     if ($identitiy->getReferer() != null && trim($identitiy->getReferer()) != "") {
         $request->setHeader("referer", $identitiy->getReferer());
     }
     $request = parent::setupRequest($request);
     return $request;
 }
Exemple #4
0
 private function add_subscribers(RequestInterface $request, $value)
 {
     if (!is_array($value)) {
         throw new \InvalidArgumentException('subscribers must be an array');
     }
     $emitter = $request->getEmitter();
     foreach ($value as $subscribers) {
         $emitter->attach($subscribers);
     }
 }
 protected function applyOptions(RequestInterface $request, array $options = [])
 {
     $config = $request->getConfig();
     $emitter = $request->getEmitter();
     foreach ($options as $key => $value) {
         if (isset(self::$configMap[$key])) {
             $config[$key] = $value;
             continue;
         }
         switch ($key) {
             case 'allow_redirects':
                 if ($value === false) {
                     continue;
                 }
                 if ($value === true) {
                     $value = self::$defaultRedirect;
                 } elseif (!isset($value['max'])) {
                     throw new Iae('allow_redirects must be true, false, or an ' . 'array that contains the \'max\' key');
                 } else {
                     // Merge the default settings with the provided settings
                     $value += self::$defaultRedirect;
                 }
                 $config['redirect'] = $value;
                 $emitter->attach($this->redirectPlugin);
                 break;
             case 'decode_content':
                 if ($value === false) {
                     continue;
                 }
                 $config['decode_content'] = true;
                 if ($value !== true) {
                     $request->setHeader('Accept-Encoding', $value);
                 }
                 break;
             case 'headers':
                 if (!is_array($value)) {
                     throw new Iae('header value must be an array');
                 }
                 // Do not overwrite existing headers
                 foreach ($value as $k => $v) {
                     if (!$request->hasHeader($k)) {
                         $request->setHeader($k, $v);
                     }
                 }
                 break;
             case 'exceptions':
                 if ($value === true) {
                     $emitter->attach($this->errorPlugin);
                 }
                 break;
             case 'body':
                 if (is_array($value)) {
                     $this->addPostData($request, $value);
                 } elseif ($value !== null) {
                     $request->setBody(Stream::factory($value));
                 }
                 break;
             case 'auth':
                 if (!$value) {
                     continue;
                 }
                 if (is_array($value)) {
                     $type = isset($value[2]) ? strtolower($value[2]) : 'basic';
                 } else {
                     $type = strtolower($value);
                 }
                 $config['auth'] = $value;
                 if ($type == 'basic') {
                     $request->setHeader('Authorization', 'Basic ' . base64_encode("{$value['0']}:{$value['1']}"));
                 } elseif ($type == 'digest') {
                     // @todo: Do not rely on curl
                     $config->setPath('curl/' . CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
                     $config->setPath('curl/' . CURLOPT_USERPWD, "{$value['0']}:{$value['1']}");
                 }
                 break;
             case 'query':
                 if ($value instanceof Query) {
                     $original = $request->getQuery();
                     // Do not overwrite existing query string variables by
                     // overwriting the object with the query string data passed
                     // in the URL
                     $value->overwriteWith($original->toArray());
                     $request->setQuery($value);
                 } elseif (is_array($value)) {
                     // Do not overwrite existing query string variables
                     $query = $request->getQuery();
                     foreach ($value as $k => $v) {
                         if (!isset($query[$k])) {
                             $query[$k] = $v;
                         }
                     }
                 } else {
                     throw new Iae('query must be an array or Query object');
                 }
                 break;
             case 'cookies':
                 if ($value === true) {
                     static $cookie = null;
                     if (!$cookie) {
                         $cookie = new Cookie();
                     }
                     $emitter->attach($cookie);
                 } elseif (is_array($value)) {
                     $emitter->attach(new Cookie(CookieJar::fromArray($value, $request->getHost())));
                 } elseif ($value instanceof CookieJarInterface) {
                     $emitter->attach(new Cookie($value));
                 } elseif ($value !== false) {
                     throw new Iae('cookies must be an array, true, or CookieJarInterface');
                 }
                 break;
             case 'events':
                 if (!is_array($value)) {
                     throw new Iae('events must be an array');
                 }
                 $this->attachListeners($request, $this->prepareListeners($value, ['before', 'complete', 'error', 'progress', 'end']));
                 break;
             case 'subscribers':
                 if (!is_array($value)) {
                     throw new Iae('subscribers must be an array');
                 }
                 foreach ($value as $subscribers) {
                     $emitter->attach($subscribers);
                 }
                 break;
             case 'json':
                 $request->setBody(Stream::factory(json_encode($value)));
                 if (!$request->hasHeader('Content-Type')) {
                     $request->setHeader('Content-Type', 'application/json');
                 }
                 break;
             default:
                 // Check for custom handler functions.
                 if (isset($this->customOptions[$key])) {
                     $fn = $this->customOptions[$key];
                     $fn($request, $value);
                     continue;
                 }
                 throw new Iae("No method can handle the {$key} config key");
         }
     }
 }
Exemple #6
0
 /**
  * @param RequestInterface $request
  */
 protected function extractCookiesArgument(RequestInterface $request)
 {
     $listeners = $request->getEmitter()->listeners('before');
     foreach ($listeners as $listener) {
         if ($listener[0] instanceof Cookie) {
             $values = [];
             $scheme = $request->getScheme();
             $host = $request->getHost();
             $path = $request->getPath();
             /** @var SetCookie $cookie */
             foreach ($listener[0]->getCookieJar() as $cookie) {
                 if ($cookie->matchesPath($path) && $cookie->matchesDomain($host) && !$cookie->isExpired() && (!$cookie->getSecure() || $scheme == 'https')) {
                     $values[] = $cookie->getName() . '=' . CookieJar::getCookieValue($cookie->getValue());
                 }
             }
             if ($values) {
                 $this->addOption('b', escapeshellarg(implode('; ', $values)));
             }
         }
     }
 }
 private function addListeners(RequestInterface $request, &$calls)
 {
     $request->getEmitter()->on('before', function (BeforeEvent $e) use(&$calls) {
         $calls[] = 'before';
     }, RequestEvents::EARLY);
     $request->getEmitter()->on('complete', function (CompleteEvent $e) use(&$calls) {
         $calls[] = 'complete';
     }, RequestEvents::EARLY);
     $request->getEmitter()->on('error', function (ErrorEvent $e) use(&$calls) {
         $calls[] = 'error';
     }, RequestEvents::EARLY);
     $request->getEmitter()->on('end', function (EndEvent $e) use(&$calls) {
         $calls[] = 'end';
     }, RequestEvents::EARLY);
 }