/**
  * Processes this batch. This sends the captured requests to the server as one batch.
  *
  * @throws ClientException
  * @return bool - true if processing of the batch was  or the HttpResponse object in case of a failure. A successful process just means that tha parts were processed. Each part has it's own response though and should be checked on its own.
  */
 public function process()
 {
     $this->stopCapture();
     $this->setBatchRequest(true);
     $data = '';
     $batchParts = $this->getBatchParts();
     if (count($batchParts) == 0) {
         throw new ClientException('Can\'t process empty batch.');
     }
     /** @var $partValue BatchPart */
     foreach ($batchParts as $partValue) {
         $data .= '--' . HttpHelper::MIME_BOUNDARY . HttpHelper::EOL;
         $data .= 'Content-Type: application/x-arango-batchpart' . HttpHelper::EOL;
         if (!is_null($partValue->getId())) {
             $data .= 'Content-Id: ' . (string) $partValue->getId() . HttpHelper::EOL . HttpHelper::EOL;
         } else {
             $data .= HttpHelper::EOL;
         }
         $data .= (string) $partValue->getRequest() . HttpHelper::EOL;
     }
     $data .= '--' . HttpHelper::MIME_BOUNDARY . '--' . HttpHelper::EOL . HttpHelper::EOL;
     $params = array();
     $url = UrlHelper::appendParamsUrl(Urls::URL_BATCH, $params);
     $this->_batchResponse = $this->_connection->post($url, $data);
     if ($this->_batchResponse->getHttpCode() !== 200) {
         return $this->_batchResponse;
     }
     $body = $this->_batchResponse->getBody();
     $body = trim($body, '--' . HttpHelper::MIME_BOUNDARY . '--');
     $batchParts = $this->splitWithContentIdKey('--' . HttpHelper::MIME_BOUNDARY . HttpHelper::EOL, $body);
     foreach ($batchParts as $partKey => $partValue) {
         $response = new HttpResponse($partValue);
         $body = $response->getBody();
         $response = new HttpResponse($body);
         $batchPartResponses[$partKey] = $response;
         $this->getPart($partKey)->setResponse($batchPartResponses[$partKey]);
     }
     return $this;
 }
 /**
  * Execute an HTTP request and return the results
  *
  * This function will throw if no connection to the server can be established or if
  * there is a problem during data exchange with the server.
  *
  * will restore it.
  *
  * @throws Exception
  *
  * @param string $method       - HTTP request method
  * @param string $url          - HTTP URL
  * @param string $data         - data to post in body
  * @param array  $customHeader - any array containing header elements
  *
  * @return HttpResponse
  */
 private function executeRequest($method, $url, $data, $customHeader = array())
 {
     HttpHelper::validateMethod($method);
     $database = $this->getDatabase();
     if ($database === '') {
         $url = '/_db/' . '_system' . $url;
     } else {
         $url = '/_db/' . $database . $url;
     }
     // create request data
     if ($this->_batchRequest === false) {
         if ($this->_captureBatch === true) {
             $this->_options->offsetSet(ConnectionOptions::OPTION_BATCHPART, true);
             $request = HttpHelper::buildRequest($this->_options, $method, $url, $data, $customHeader);
             $this->_options->offsetSet(ConnectionOptions::OPTION_BATCHPART, false);
         } else {
             $request = HttpHelper::buildRequest($this->_options, $method, $url, $data, $customHeader);
         }
         if ($this->_captureBatch === true) {
             $batchPart = $this->doBatch($method, $request);
             if (!is_null($batchPart)) {
                 return $batchPart;
             }
         }
     } else {
         $this->_batchRequest = false;
         $this->_options->offsetSet(ConnectionOptions::OPTION_BATCH, true);
         $request = HttpHelper::buildRequest($this->_options, $method, $url, $data, $customHeader);
         $this->_options->offsetSet(ConnectionOptions::OPTION_BATCH, false);
     }
     $traceFunc = $this->_options[ConnectionOptions::OPTION_TRACE];
     if ($traceFunc) {
         // call tracer func
         if ($this->_options[ConnectionOptions::OPTION_ENHANCED_TRACE]) {
             list($header) = HttpHelper::parseHttpMessage($request, $url, $method);
             $headers = HttpHelper::parseHeaders($header);
             $traceFunc(new TraceRequest($headers[2], $method, $url, $data));
         } else {
             $traceFunc('send', $request);
         }
     }
     // open the socket. note: this might throw if the connection cannot be established
     $handle = $this->getHandle();
     if ($handle) {
         // send data and get response back
         if ($traceFunc) {
             // only issue syscall if we need it
             $startTime = microtime(true);
         }
         $result = HttpHelper::transfer($handle, $request);
         if ($traceFunc) {
             // only issue syscall if we need it
             $timeTaken = microtime(true) - $startTime;
         }
         $status = socket_get_status($handle);
         if ($status['timed_out']) {
             throw new ClientException('Got a timeout while waiting for the server\'s response', 408);
         }
         if (!$this->_useKeepAlive) {
             // must close the connection
             fclose($handle);
         }
         $response = new HttpResponse($result, $url, $method);
         if ($traceFunc) {
             // call tracer func
             if ($this->_options[ConnectionOptions::OPTION_ENHANCED_TRACE]) {
                 $traceFunc(new TraceResponse($response->getHeaders(), $response->getHttpCode(), $response->getBody(), $timeTaken));
             } else {
                 $traceFunc('receive', $result);
             }
         }
         return $response;
     }
     throw new ClientException('Whoops, this should never happen');
 }
Beispiel #3
0
 /**
  * @dataProvider httpCodeProvider
  *
  * @param int $code
  */
 public function testGetHttpCode($code)
 {
     $response = new HttpResponse('', $code, '');
     $this->assertEquals($code, $response->getHttpCode());
 }