コード例 #1
0
ファイル: HttpRequest.php プロジェクト: domraider/rxnet
 /**
  * @param ConnectorEvent $event
  * @return Observable
  */
 public function __invoke(ConnectorEvent $event)
 {
     $this->stream = $event->getStream();
     $this->stream->subscribe($this);
     $this->stream->write($this->data);
     return $this;
 }
コード例 #2
0
 /**
  * @param ConnectorEvent $event
  */
 public function onNext($event)
 {
     $transport = $event->getStream();
     $dispose = $transport->subscribe($this->request);
     $this->request->subscribeCallback(null, null, function () use($dispose) {
         $dispose->dispose();
     });
     $transport->write($this->request->data);
 }
コード例 #3
0
ファイル: HttpProxyRequest.php プロジェクト: domraider/rxnet
 /**
  * @param StreamEvent $event
  */
 public function onNext($event)
 {
     if ($event instanceof ConnectorEvent) {
         $this->__invoke($event);
         return;
     }
     $stream = $this->connectorEvent->getStream();
     if (!stristr($event->data, 'HTTP/1.1 200 Connection established')) {
         $stream->removeObserver($this);
         $this->notifyError(new \UnexpectedValueException("Proxy connection failed {$event->data}"));
         return;
     }
     if (!$this->toggleCrypto) {
         $stream->removeObserver($this);
         foreach ($this->observers as $observer) {
             $observer->onNext($this->getConnectorEvent());
         }
         return;
     }
     // Enable crypto
     $socket = $stream->getSocket();
     $loop = EventLoop::getLoop();
     // Stop event loop for this socket
     $loop->removeReadStream($socket);
     $method = STREAM_CRYPTO_METHOD_TLS_CLIENT;
     if (defined('STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT')) {
         $method |= STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT;
     }
     if (defined('STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT')) {
         $method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;
     }
     if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) {
         $method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
     }
     // Stop listening on proxy connect
     $stream->removeObserver($this);
     //stream_set_blocking ($socket, true);
     set_error_handler(function ($errno, $errstr) {
         $this->notifyError(new \UnexpectedValueException("Failed to enable crypto ({$errno}) : {$errstr} "));
     });
     // Wait until handshake is finished
     while (true) {
         $res = stream_socket_enable_crypto($socket, true, $method);
         if ($res === true) {
             // Handshake ok, time to pass the hand to the request
             $loop->removeReadStream($socket);
             foreach ($this->observers as $observer) {
                 /* @var \Rx\ObserverInterface $observer */
                 $observer->onNext($this->getConnectorEvent());
             }
             break;
         } elseif ($res === false) {
             // handshake failed
             // Error handler should have done the work
             break;
         } else {
             // let's loop until handshake is ok
             $loop->tick();
         }
     }
     restore_error_handler();
 }