/** * 获取请求的响应 * @public * @return <WebResponse> http请求的响应信息 */ public function getResponse() { if (!($fp = fsockopen($this->host, $this->port, $errno, $errstr, $this->timeout))) { switch ($errno) { case -3: $this->errormsg = 'Socket连接创建失败 (-3)'; break; case -4: $this->errormsg = 'DNS定位失败 (-4)'; break; case -5: $this->errormsg = '连接超时或被拒绝 (-5)'; break; default: $this->errormsg = '连接失败 (' . $errno . ')'; break; $this->errormsg .= ' ' . $errstr; } return false; } else { } socket_set_timeout($fp, $this->timeout); $request = $this->buildRequestInfo(); fwrite($fp, $request); $content = ''; $readState = 'start'; $response = new WebResponse(); while (!feof($fp)) { $line = fgets($fp, 4096); if ($readState == 'start') { $readState = 'header'; if (!preg_match('/HTTP\\/(\\d\\.\\d)\\s*(\\d+)\\s*(.*)/', $line, $m)) { $this->errormsg = "非法的请求状态: " . htmlentities($line); return false; } $http_version = $m[1]; //未使用 $response->setStatus($m[2]); $status_string = $m[3]; //未使用 } else { if ($readState == 'header') { if (trim($line) == '') { $readState = 'content'; } if (!preg_match('/([^:]+):\\s*(.*)/', $line, $m)) { continue; } $key = strtolower(trim($m[1])); $val = trim($m[2]); $response->appendHeader($key, $val); } else { $content .= $line; } } } fclose($fp); $response->setContent($content); return $response; }