Hoa central
Connection.php
Go to the documentation of this file.
1 <?php
2 
37 namespace Hoa\Fastcgi;
38 
50 abstract class Connection
51 {
57  const HEADER_VERSION = 0;
58 
64  const HEADER_TYPE = 1;
65 
71  const HEADER_REQUEST_ID = 2;
72 
79 
86 
92  const HEADER_RESERVED = 5;
93 
99  const HEADER_CONTENT = 6;
100 
101 
102 
111  public function pack($type, $content, $id = 1)
112  {
113  $length = strlen($content);
114 
115  return
116  chr(1) . // version
117  chr($type) . // type
118  chr(($id >> 8) & 0xff) . // ID B1
119  chr($id & 0xff) . // ID B0
120  chr(($length >> 8) & 0xff) . // length B1
121  chr($length & 0xff) . // length b0
122  chr(0) . // padding length
123  chr(0) . // reserved
124  $content;
125  }
126 
133  public function packPairs(Array $pairs)
134  {
135  $out = null;
136 
137  foreach ($pairs as $key => $value) {
138  foreach ([$key, $value] as $handle) {
139  $length = strlen($handle);
140 
141  // B0
142  if ($length < 0x80) {
143  $out .= chr($length);
144  }
145  // B3 & B2 & B1 & B0
146  else {
147  $out .=
148  chr(($length >> 24) | 0x80) .
149  chr(($length >> 16) & 0xff) .
150  chr(($length >> 8) & 0xff) .
151  chr($length & 0xff);
152  }
153  }
154 
155  $out .= $key . $value;
156  }
157 
158  return $out;
159  }
160 
167  public function unpackPairs($pack)
168  {
169  if (null === $length) {
170  $length = strlen($pack);
171  }
172 
173  $out = [];
174  $i = 0;
175 
176  for ($i = 0; $length >= $i; $i += $keyLength + $valueLength) {
177  $keyLength = ord($pack[$i++]);
178 
179  if ($keyLength >= 0x80) {
180  $keyLength =
181  ($keyLength & 0x7f << 24)
182  | (ord($pack[$i++]) << 16)
183  | (ord($pack[$i++]) << 8)
184  | ord($pack[$i++]);
185  }
186 
187  $valueLength = ord($pack[$i++]);
188 
189  if ($valueLength >= 0x80) {
190  $valueLength =
191  ($valueLength & 0x7f << 24)
192  | (ord($pack[$i++]) << 16)
193  | (ord($pack[$i++]) << 8)
194  | ord($pack[$i++]);
195  }
196 
197  $out[substr($pack, $i, $keyLength)]
198  = substr($pack, $i + $keyLength, $valueLength);
199  }
200 
201  return $out;
202  }
203 
209  protected function readPack()
210  {
211  if ((null === $pack = $this->read(8)) ||
212  empty($pack)) {
213  return false;
214  }
215 
216  $headers = [
217  self::HEADER_VERSION => ord($pack[0]),
218  self::HEADER_TYPE => ord($pack[1]),
219  self::HEADER_REQUEST_ID => (ord($pack[2]) << 8) +
220  ord($pack[3]),
221  self::HEADER_CONTENT_LENGTH => (ord($pack[4]) << 8) +
222  ord($pack[5]),
223  self::HEADER_PADDING_LENGTH => ord($pack[6]),
224  self::HEADER_RESERVED => ord($pack[7]),
225  self::HEADER_CONTENT => null
226  ];
227  $length =
228  $headers[self::HEADER_CONTENT_LENGTH] +
229  $headers[self::HEADER_PADDING_LENGTH];
230 
231  if (0 === $length) {
232  return $headers;
233  }
234 
235  $headers[self::HEADER_CONTENT] = substr(
236  $this->read($length),
237  0,
238  $headers[self::HEADER_CONTENT_LENGTH]
239  );
240 
241  return $headers;
242  }
243 
250  abstract protected function read($length);
251 }
pack($type, $content, $id=1)
Definition: Connection.php:111
$content
Definition: Hoa.php:119
packPairs(Array $pairs)
Definition: Connection.php:133