/** * @uses \Crunch\FastCGI\Protocol\Record * @uses \Crunch\FastCGI\Protocol\RecordType * @uses \Crunch\FastCGI\Protocol\Header * @covers ::encode */ public function testEncodeEmptyParameters() { $parameters = new RequestParameters([]); $records = $parameters->encode(123); self::assertCount(1, $records); self::assertEquals(123, $records[0]->getRequestId()); self::assertSame(RecordType::params(), $records[0]->getType()); self::assertEquals('', $records[0]->getContent()); }
/** * @param int $requestId * * @return Record[]|Traversable */ public function encode($requestId) { $packet = ''; foreach ($this->parameters as $name => $value) { // TODO "pack(C)" when < 128 // 0x80000000 => 4byte, highest bit 1, rest 0 (0x1000...0000) $new = \pack('NN', \strlen($name) + 0x80000000, \strlen($value) + 0x80000000) . $name . $value; // Although the specs states, that it isn't important it looks like // at least php-fpm expects parameters not to be spread over several // records. That doesn't make much sense for really long values though ... if (strlen($new) + strlen($packet) > 65535) { $result[] = new Record(new Header(RecordType::params(), $requestId, strlen($packet)), $packet); $packet = ''; } $packet .= $new; } if ($packet) { $result[] = new Record(new Header(RecordType::params(), $requestId, strlen($packet)), $packet); } // Some servers miss to drop the padding on the empty PARAMS-record // I look at you php-fpm ;) $result[] = new Record(new Header(RecordType::params(), $requestId, 0, 0), ''); return new ArrayIterator($result); }
/** * @covers ::params */ public function testDirectInstancationMethodOfParams() { $expectedRecordType = RecordType::instance(RecordType::PARAMS); $recordType = RecordType::params(); self::assertSame($expectedRecordType, $recordType); }