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