port = $port ?: self::DEFAULT_PORT; $this->client = new Client($this->getUrl()); register_shutdown_function(array($this, 'stop')); } /** * Flush the received requests from the server * @throws RuntimeException */ public function flush() { $this->client->delete('guzzle-server/requests')->send(); } /** * Queue an array of responses or a single response on the server. * * Any currently queued responses will be overwritten. Subsequent requests * on the server will return queued responses in FIFO order. * * @param array|Response $responses A single or array of Responses to queue * @throws BadResponseException */ public function enqueue($responses) { $data = array(); foreach ((array) $responses as $response) { // Create the response object from a string if (is_string($response)) { $response = Response::fromMessage($response); } elseif (!($response instanceof Response)) { throw new BadResponseException('Responses must be strings or implement Response'); } $data[] = array( 'statusCode' => $response->getStatusCode(), 'reasonPhrase' => $response->getReasonPhrase(), 'headers' => $response->getHeaders()->toArray(), 'body' => $response->getBody(true) ); } $request = $this->client->put('guzzle-server/responses', null, json_encode($data)); $request->send(); } /** * Check if the server is running * * @return bool */ public function isRunning() { if ($this->running) { return true; } try { $this->client->get('guzzle-server/perf', array(), array('timeout' => 5))->send(); $this->running = true; return true; } catch (\Exception $e) { return false; } } /** * Get the URL to the server * * @return string */ public function getUrl() { return 'http://127.0.0.1:' . $this->getPort() . '/'; } /** * Get the port that the server is listening on * * @return int */ public function getPort() { return $this->port; } /** * Get all of the received requests * * @param bool $hydrate Set to TRUE to turn the messages into * actual {@see RequestInterface} objects. If $hydrate is FALSE, * requests will be returned as strings. * * @return array * @throws RuntimeException */ public function getReceivedRequests($hydrate = false) { $response = $this->client->get('guzzle-server/requests')->send(); $data = array_filter(explode(self::REQUEST_DELIMITER, $response->getBody(true))); if ($hydrate) { $data = array_map(function($message) { return RequestFactory::getInstance()->fromMessage($message); }, $data); } return $data; } /** * Start running the node.js server in the background */ public function start() { if (!$this->isRunning()) { exec('node ' . __DIR__ . \DIRECTORY_SEPARATOR . 'server.js ' . $this->port . ' >> /tmp/server.log 2>&1 &'); // Wait at most 5 seconds for the server the setup before // proceeding. $start = time(); while (!$this->isRunning() && time() - $start < 5); if (!$this->running) { throw new RuntimeException( 'Unable to contact server.js. Have you installed node.js v0.5.0+? node must be in your path.' ); } } } /** * Stop running the node.js server */ public function stop() { if (!$this->isRunning()) { return false; } $this->running = false; $this->client->delete('guzzle-server')->send(); } }