/** * @param HttpSocketTransporter $transporter * @param iStreamable $body * @param HttpResponse $response * @param Streamable $stream * @param iHttpRequest $request * * @return mixed */ function __invoke($transporter = null, $body = null, $response = null, $stream = null, $request = null) { $headers = $response->getHeaders(); // Decoding Data: if (!$body || !$transporter->optsData()->isAllowDecoding()) { ## do not decode body using raw data return ['body' => $body]; } if ($headers->has('Content-Encoding') && strstr(strtolower($headers->get('Content-Encoding')->renderValueLine()), 'gzip') !== false) { ## Uses PHP's zlib.inflate filter to inflate deflate or gzipped content $body->getResource()->appendFilter(new PhpRegisteredFilter('zlib.inflate'), STREAM_FILTER_READ); ### skip the first 10 bytes for zlib $body = new Streamable\SegmentWrapStream($body, -1, 10); } if ($headers->has('transfer-encoding') && strstr(strtolower($headers->get('Transfer-Encoding')->renderValueLine()), 'chunked') !== false) { $body->getResource()->appendFilter(new DechunkFilter(), STREAM_FILTER_READ); } return ['body' => $body]; }
protected function __readHeadersFromStream(iStreamable $stream) { $headers = ''; ## 255 can be vary, its each header length. // TODO just read header part from aggregate stream, it can be tagged for each stream while (!$stream->isEOF() && ($line = $stream->readLine("\r\n", 255)) !== null) { $break = false; $headers .= $line . "\r\n"; if (trim($line) === '') { ## http headers part read complete $break = true; } if ($break) { break; } } return $headers; }