/** * Sends the given request to the remote host, read the response and * returns an HTTP_Response2 instance. * * @param HTTP_Request2 $request The request to send * * @return HTTP_Response2 * @throws HTTP_Connection_Exception */ public function sendRequest(HTTP_Request2 $request) { $this->request = $request; if ($this->request->options['file'] !== null) { $this->handle = @fopen($this->request->options['file'], 'w'); if (!$this->handle) { throw new HTTP_Connection_Exception('Unable to open file ' . $this->request->options['file']); } } // open connection and notify of the event $this->open(); $this->request->state = HTTP_Request2::STATE_CONNECTED; $this->request->notify(); // send the request and notify of the event // Adapters are responsible of sending the events: $this->send(); $this->request->state = HTTP_Request2::STATE_REQUEST_SENT; $this->request->notify(); // read response and notify of the event // Adapters are responsible of notifying of the following events in // their own implementation: // - HTTP_Request2::STATE_RESPONSE_HEADERS // - HTTP_Request2::STATE_RESPONSE_TICK $response = $this->receive(); $this->request->state = HTTP_Request2::STATE_RESPONSE_RECEIVED; $this->request->notify(); // close the connection only if needed and notify of the event if ($response->shouldClose()) { $this->close(); $this->request->state = HTTP_Request2::STATE_DISCONNECTED; $this->request->notify(); } return $response; }