public function case_get_vendor_factory() { $self = $this; $this->given($transport = 'foo', $factory = function ($socketUri) use(&$called, $self, $transport) { $called = true; $self->string($socketUri)->isEqualTo($transport . '://bar/baz'); return new LUT(str_replace($transport, 'tcp', $socketUri)); }, SUT::register($transport, $factory))->when(function () use(&$result, $transport) { $result = SUT::getFactory($transport); })->then->object($result)->isInstanceOf('Closure')->object($result('foo://bar/baz'))->isEqualTo(new LUT('tcp://bar/baz'))->boolean($called)->isTrue(); }
/** * Set socket. * * @param string $socketUri Socket URI. * @return \Hoa\Socket * @throws \Hoa\Socket\Exception */ protected function setSocket($socketUri) { if (false === ($pos = strpos($socketUri, '://'))) { $socket = new Socket($socketUri); } else { $transport = substr($socketUri, 0, $pos); $factory = Socket\Transport::getFactory($transport); $socket = $factory($socketUri); if (!$socket instanceof Socket) { throw new Socket\Exception('The transport registered for scheme “%s” is not valid: ' . 'It must return a valid Hoa\\Socket\\Socket instance.', 0, $transport); } } $old = $this->_socket; $this->_socket = $socket; return $old; }
/** * Set the transport. * * @param string $transport Transport (TCP, UDP etc.). * @return string * @throws \Hoa\Socket\Exception */ protected function setTransport($transport) { $transport = strtolower($transport); if (false === Transport::exists($transport)) { throw new Exception('Transport %s is not enabled on this machin.', 3, $transport); } $old = $this->_transport; $this->_transport = $transport; return $old; }
} /** * Factory to create a valid `Hoa\Socket\Socket` object. * * @param string $socketUri URI of the socket to connect to. * @return void */ public static function transportFactory($socketUri) { $parsed = parse_url($socketUri); if (false === $parsed || !isset($parsed['host'])) { throw new Exception('URL %s seems invalid, cannot parse it.', 0, $socketUri); } $secure = isset($parsed['scheme']) ? 'ircs' === $parsed['scheme'] : false; /** * Regarding RFC * https://tools.ietf.org/html/draft-butcher-irc-url-04#section-2.4, * port 194 is likely to be a more “authentic” server, however at this * time the majority of IRC non secure servers are available on port * 6667. */ $port = isset($parsed['port']) ? $parsed['port'] : (true === $secure ? 994 : 6667); return new static('tcp://' . $parsed['host'] . ':' . $port, $secure); } } /** * Register `irc://` and `ircs://` transports. */ HoaSocket\Transport::register('irc', ['Hoa\\Irc\\Socket', 'transportFactory']); HoaSocket\Transport::register('ircs', ['Hoa\\Irc\\Socket', 'transportFactory']);