header['Content-Type'], 'boundary'); if (isset($request->header['Content-Type']) and $cd !== false) { $this->parseFormData($request, $cd); } else { if (substr($request->header['Content-Type'], 0, 33) == 'application/x-www-form-urlencoded') { parse_str($request->body, $request->post); } } } /** * 解析Cookies * @param $request \Swoole\Request */ function parseCookie(\Swoole\Request $request) { $request->cookie = self::parseParams($request->header['Cookie']); } /** * 解析form_data格式文件 * @param $part * @param $request \Swoole\Request * @param $cd */ static function parseFormData(\Swoole\Request $request, $cd) { $cd = '--' . str_replace('boundary=', '', $cd); $form = explode($cd, rtrim($request->body, "-")); //去掉末尾的-- foreach ($form as $f) { if ($f === '') { continue; } $parts = explode("\r\n\r\n", trim($f)); $header = self::parseHeaderLine($parts[0]); if (!isset($header['Content-Disposition'])) { continue; } $meta = self::parseParams($header['Content-Disposition']); //filename字段表示它是一个文件 if (!isset($meta['filename'])) { if (count($parts) < 2) { $parts[1] = ""; } //支持checkbox if (substr($meta['name'], -2) === '[]') { $request->post[substr($meta['name'], 0, -2)][] = trim($parts[1]); } else { $request->post[$meta['name']] = trim($parts[1], "\r\n"); } } else { $tmp_file = tempnam('/tmp', 'sw'); file_put_contents($tmp_file, $parts[1]); if (!isset($meta['name'])) { $meta['name'] = 'file'; } $request->files[$meta['name']] = array( 'name' => $meta['filename'], 'type' => $header['Content-Type'], 'size' => strlen($parts[1]), 'error' => UPLOAD_ERR_OK, 'tmp_name' => $tmp_file, ); } } } /** * 头部http协议 * @param $data * @return array */ function parse($data) { $_header = strstr($data, self::HTTP_EOF, true); if ($_header === false) { $this->buffer = $data; } $header = self::parseHeader($_header); if ($header === false) { $this->isError = true; } $this->header = $header; return $header; } }