From a9f37c90b749a5b0fd77c8772d8db4332bb70a8e Mon Sep 17 00:00:00 2001
From: wispx <1591788658@qq.com>
Date: Mon, 3 Dec 2018 15:25:29 +0800
Subject: [PATCH] =?UTF-8?q?=E5=8F=96=E6=B6=88zip=E6=8B=93=E5=B1=95?=
=?UTF-8?q?=E9=9C=80=E6=B1=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 1 -
application/index/controller/Install.php | 4 +-
application/index/view/install/index.html | 12 -
composer.lock | 58 +++-
install.sql | 174 -----------
thinkphp/library/think/console/Table.php | 281 ++++++++++++++++++
.../think/console/command/RouteList.php | 130 ++++++++
.../library/think/console/command/Version.php | 31 ++
.../think/console/command/make/Command.php | 56 ++++
.../console/command/make/stubs/command.stub | 24 ++
thinkphp/library/think/db/Where.php | 178 +++++++++++
thinkphp/library/think/facade/Template.php | 36 +++
thinkphp/library/think/response/Download.php | 137 +++++++++
update.sql | 4 -
vendor/composer/autoload_files.php | 1 +
vendor/composer/autoload_static.php | 1 +
vendor/composer/installed.json | 62 +++-
vendor/guzzlehttp/psr7/.editorconfig | 9 +
vendor/guzzlehttp/psr7/CHANGELOG.md | 215 ++++++++++----
vendor/guzzlehttp/psr7/README.md | 8 +-
vendor/guzzlehttp/psr7/composer.json | 14 +-
vendor/guzzlehttp/psr7/src/AppendStream.php | 16 +-
vendor/guzzlehttp/psr7/src/FnStream.php | 9 +
vendor/guzzlehttp/psr7/src/InflateStream.php | 2 +-
vendor/guzzlehttp/psr7/src/Request.php | 4 +-
vendor/guzzlehttp/psr7/src/Response.php | 4 +
vendor/guzzlehttp/psr7/src/Rfc7230.php | 18 ++
vendor/guzzlehttp/psr7/src/ServerRequest.php | 32 +-
vendor/guzzlehttp/psr7/src/Stream.php | 39 ++-
vendor/guzzlehttp/psr7/src/StreamWrapper.php | 46 ++-
vendor/guzzlehttp/psr7/src/Uri.php | 88 ++++--
vendor/guzzlehttp/psr7/src/functions.php | 127 ++++++--
.../src/Qiniu/Storage/ArgusManager.php | 73 +++++
vendor/ralouphie/getallheaders/.gitignore | 5 +
vendor/ralouphie/getallheaders/.travis.yml | 18 ++
vendor/ralouphie/getallheaders/LICENSE | 21 ++
vendor/ralouphie/getallheaders/README.md | 19 ++
vendor/ralouphie/getallheaders/composer.json | 21 ++
vendor/ralouphie/getallheaders/phpunit.xml | 22 ++
.../getallheaders/src/getallheaders.php | 46 +++
.../getallheaders/tests/GetAllHeadersTest.php | 121 ++++++++
41 files changed, 1806 insertions(+), 361 deletions(-)
delete mode 100644 install.sql
create mode 100644 thinkphp/library/think/console/Table.php
create mode 100644 thinkphp/library/think/console/command/RouteList.php
create mode 100644 thinkphp/library/think/console/command/Version.php
create mode 100644 thinkphp/library/think/console/command/make/Command.php
create mode 100644 thinkphp/library/think/console/command/make/stubs/command.stub
create mode 100644 thinkphp/library/think/db/Where.php
create mode 100644 thinkphp/library/think/facade/Template.php
create mode 100644 thinkphp/library/think/response/Download.php
delete mode 100644 update.sql
create mode 100644 vendor/guzzlehttp/psr7/.editorconfig
create mode 100644 vendor/guzzlehttp/psr7/src/Rfc7230.php
create mode 100644 vendor/qiniu/php-sdk/src/Qiniu/Storage/ArgusManager.php
create mode 100644 vendor/ralouphie/getallheaders/.gitignore
create mode 100644 vendor/ralouphie/getallheaders/.travis.yml
create mode 100644 vendor/ralouphie/getallheaders/LICENSE
create mode 100644 vendor/ralouphie/getallheaders/README.md
create mode 100644 vendor/ralouphie/getallheaders/composer.json
create mode 100644 vendor/ralouphie/getallheaders/phpunit.xml
create mode 100644 vendor/ralouphie/getallheaders/src/getallheaders.php
create mode 100644 vendor/ralouphie/getallheaders/tests/GetAllHeadersTest.php
diff --git a/README.md b/README.md
index fb5d7e46..dbb114cc 100644
--- a/README.md
+++ b/README.md
@@ -35,7 +35,6 @@
* mysqli支持
* fileinfo拓展
* curl拓展
-* zip拓展
* rewrite
安装教程
diff --git a/application/index/controller/Install.php b/application/index/controller/Install.php
index cd99ed12..3d93edb7 100644
--- a/application/index/controller/Install.php
+++ b/application/index/controller/Install.php
@@ -30,18 +30,16 @@ class Install extends Controller
$phpVerGt56 = PHP_VERSION >= 5.6;
$isCurl = function_exists('curl_init');
- $isZip = function_exists('zip_open');
$isFileInfo = function_exists('finfo_open');
$isMysqli = class_exists('mysqli');
switch ($step) {
case 1:
// 运行环境检测
- $testing = $phpVerGt56 && $isCurl && $isFileInfo && $isZip && $isMysqli;
+ $testing = $phpVerGt56 && $isCurl && $isFileInfo && $isMysqli;
$this->assign([
'phpVerGt56' => $phpVerGt56,
'isCurl' => $isCurl,
- 'isZip' => $isZip,
'isFileInfo' => $isFileInfo,
'isMysqli' => $isMysqli,
'testing' => $testing
diff --git a/application/index/view/install/index.html b/application/index/view/install/index.html
index cc5f4a49..bfa51ebd 100644
--- a/application/index/view/install/index.html
+++ b/application/index/view/install/index.html
@@ -74,18 +74,6 @@
{/if}
-
|
mysqli:
diff --git a/composer.lock b/composer.lock
index 27750874..3217b126 100644
--- a/composer.lock
+++ b/composer.lock
@@ -261,32 +261,33 @@
},
{
"name": "guzzlehttp/psr7",
- "version": "1.4.2",
+ "version": "1.5.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
- "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
+ "reference": "53662d6688033a5eccde987bdd5a4a98ebe2d952"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
- "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/53662d6688033a5eccde987bdd5a4a98ebe2d952",
+ "reference": "53662d6688033a5eccde987bdd5a4a98ebe2d952",
"shasum": ""
},
"require": {
"php": ">=5.4.0",
- "psr/http-message": "~1.0"
+ "psr/http-message": "~1.0",
+ "ralouphie/getallheaders": "^2.0.5"
},
"provide": {
"psr/http-message-implementation": "1.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.0"
+ "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.4-dev"
+ "dev-master": "1.5-dev"
}
},
"autoload": {
@@ -316,13 +317,14 @@
"keywords": [
"http",
"message",
+ "psr-7",
"request",
"response",
"stream",
"uri",
"url"
],
- "time": "2017-03-20T17:10:46+00:00"
+ "time": "2018-12-03T05:07:51+00:00"
},
{
"name": "phpmailer/phpmailer",
@@ -537,6 +539,46 @@
],
"time": "2018-11-06T13:34:32+00:00"
},
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "2.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa",
+ "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~3.7.0",
+ "satooshi/php-coveralls": ">=1.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "description": "A polyfill for getallheaders.",
+ "time": "2016-02-11T07:05:27+00:00"
+ },
{
"name": "symfony/event-dispatcher",
"version": "v2.8.48",
diff --git a/install.sql b/install.sql
deleted file mode 100644
index 9ac5b592..00000000
--- a/install.sql
+++ /dev/null
@@ -1,174 +0,0 @@
--- phpMyAdmin SQL Dump
--- version 4.8.2
--- https://www.phpmyadmin.net/
---
--- Host: localhost:3306
--- Generation Time: 2018-09-28 17:54:47
--- 服务器版本: 5.7.21
--- PHP Version: 7.2.7
-
-SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
-SET time_zone = "+00:00";
-
---
--- Database: `lsky`
---
-
--- --------------------------------------------------------
-
---
--- 表的结构 `lsky_config`
---
-
-DROP TABLE IF EXISTS `lsky_config`;
-CREATE TABLE IF NOT EXISTS `lsky_config` (
- `id` smallint(6) UNSIGNED NOT NULL,
- `key` varchar(32) DEFAULT NULL COMMENT 'key',
- `type` varchar(32) NOT NULL DEFAULT 'text' COMMENT 'text|bool|textarea|select',
- `input_type` varchar(32) NOT NULL DEFAULT 'text' COMMENT 'input type属性',
- `name` varchar(32) CHARACTER SET utf8mb4 NOT NULL COMMENT '配置名',
- `title` varchar(100) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '配置标题',
- `tip` varchar(100) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '配置描述',
- `value` text CHARACTER SET utf8mb4 NOT NULL COMMENT '配置值',
- `extend` text CHARACTER SET utf8mb4 NOT NULL COMMENT '扩展属性'
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置' ROW_FORMAT=COMPACT;
-
---
--- 转存表中的数据 `lsky_config`
---
-
-INSERT INTO `lsky_config` (`id`, `key`, `type`, `input_type`, `name`, `title`, `tip`, `value`, `extend`) VALUES
-(1, 'basics', 'bool', 'checkbox', 'close_register', '关闭注册', NULL, '0', ''),
-(2, 'basics', 'text', 'text', 'site_name', '网站标题', NULL, 'Lsky Pro', ''),
-(3, 'basics', 'text', 'text', 'site_keywords', '网站关键字', NULL, 'Lsky Pro', ''),
-(4, 'basics', 'text', 'text', 'site_description', '网站描述', NULL, 'Lsky Pro, Your photo album on the cloud.', ''),
-(5, 'basics', 'text', 'text', 'icp_number', '备案号', NULL, '', ''),
-(6, 'upload', 'bool', 'checkbox', 'allowed_tourist_upload', '允许游客上传', '是否允许游客上传', '1', ''),
-(7, 'upload', 'text', 'text', 'upload_max_size', '最大上传大小', '单位:b,默认5242880:5M', '5242880', ''),
-(8, 'upload', 'text', 'number', 'upload_single_num', '单次同时上传数量', NULL, '10', ''),
-(9, 'upload', 'text', 'text', 'upload_allowed_exts', '允许上传的文件后缀', '逗号隔开', 'jpg,jpeg,gif,png,ico', ''),
-(10, 'upload', 'text', 'text', 'path_naming_rule', '文件路径命名规则', '路径命名变量对照表', '{Y}/{m}/{d}', ''),
-(11, 'upload', 'text', 'text', 'file_naming_rule', '文件路径命名规则', '文件命名变量对照表', '{uniqid}', ''),
-(12, 'user', 'text', 'text', 'user_initial_quota', '用户初始配额容量', '单位:b,默认1073741824:1G,最大18位', '1073741824', ''),
-(13, 'mail', 'select', 'text', 'mail_send_mode', '邮件发送方式', NULL, 'smtp', '{\"smtp\":\"SMTP\"}'),
-(14, 'mail', 'select', 'text', 'mail_smtp_secure', 'SMTP验证方式', NULL, 'none', '{\"none\":\"None\",\"tls\":\"TLS\",\"ssl\":\"SSL\"}'),
-(15, 'mail', 'text', 'text', 'mail_smtp_host', 'SMTP主机地址', NULL, '', ''),
-(16, 'mail', 'text', 'text', 'mail_smtp_username', 'SMTP用户名', NULL, '', ''),
-(17, 'mail', 'text', 'password', 'mail_smtp_password', 'SMTP密码', NULL, '', ''),
-(18, 'mail', 'text', 'number', 'mail_smtp_port', 'SMTP端口', '25/465', '25', ''),
-(19, 'mail', 'text', 'email', 'mail_form_email', '发件人邮箱', NULL, '', ''),
-(20, 'other', 'bool', 'checkbox', 'soft_delete', '软删除', '删除图片时不删除源文件,不建议开启', '0', ''),
-
-(21, 'storage_strategy', 'select', 'text', 'storage_strategy', '储存策略', NULL, 'local', ''),
-(22, 'local', 'text', 'text', 'local_cdn_domain', 'CDN加速域名', '为空使用当前站点域名', '', ''),
-(23, 'oss', 'text', 'text', 'oss_cdn_domain', 'Bucket域名', '为空使用当前站点域名', '', ''),
-(24, 'oss', 'text', 'text', 'oss_access_key_id', 'AccessKeyId', NULL, '', ''),
-(25, 'oss', 'text', 'text', 'oss_access_key_secret', 'AccessKeySecret', NULL, '', ''),
-(26, 'oss', 'text', 'text', 'oss_endpoint', 'Endpoint', '地域节点', '', ''),
-(27, 'oss', 'text', 'text', 'oss_bucket', 'Bucket', NULL, '', ''),
-(28, 'cos', 'text', 'text', 'cos_cdn_domain', 'CDN加速域名', '为空使用当前站点域名,储存桶->域名管理->加速域名', '', ''),
-(29, 'cos', 'text', 'text', 'cos_secret_id', 'SecretId', NULL, '', ''),
-(30, 'cos', 'text', 'text', 'cos_secret_key', 'SecretKey', NULL, '', ''),
-(31, 'cos', 'text', 'text', 'cos_region', '所属地域', NULL, '', ''),
-(32, 'cos', 'text', 'text', 'cos_bucket', 'Bucket', '储存桶名称', '', ''),
-(33, 'qiniu', 'text', 'text', 'qiniu_cdn_domain', 'CDN加速域名', '为空使用当前站点域名', '', ''),
-(34, 'qiniu', 'text', 'text', 'qiniu_access_key', 'AccessKey', NULL, '', ''),
-(35, 'qiniu', 'text', 'text', 'qiniu_secret_key', 'SecretKey', NULL, '', ''),
-(36, 'qiniu', 'text', 'text', 'qiniu_bucket', 'Bucket', NULL, '', ''),
-(37, 'upyun', 'text', 'text', 'upyun_cdn_domain', 'CDN加速域名', '为空使用当前站点域名', '', ''),
-(38, 'upyun', 'text', 'text', 'upyun_operator_name', 'OperatorName', '操作员账号', '', ''),
-(39, 'upyun', 'text', 'password', 'upyun_operator_pwd', 'OperatorPwd', '操作员密码', '', ''),
-(40, 'upyun', 'text', 'text', 'upyun_service_name', 'ServiceName', '云储存服务名称', '', ''),
-(41, '', 'text', 'text', 'system_version', '系统版本', NULL, '1.1', '');
-
--- --------------------------------------------------------
-
---
--- 表的结构 `lsky_images`
---
-
-DROP TABLE IF EXISTS `lsky_images`;
-CREATE TABLE IF NOT EXISTS `lsky_images` (
- `id` int(11) UNSIGNED NOT NULL COMMENT 'ID',
- `user_id` int(11) NOT NULL DEFAULT 0 COMMENT '用户ID,为0表示游客上传',
- `strategy` varchar(32) NOT NULL DEFAULT 'local' COMMENT '储存策略,默认本地',
- `path` varchar(500) NOT NULL COMMENT '保存路径',
- `name` varchar(500) NOT NULL COMMENT '保存名称',
- `pathname` varchar(500) NOT NULL COMMENT '保存名称',
- `size` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '图片大小(字节:b)',
- `mime` varchar(32) NOT NULL COMMENT '文件MIME类型',
- `sha1` varchar(100) NOT NULL COMMENT 'hash sha1',
- `md5` varchar(32) NOT NULL COMMENT 'hash md5',
- `ip` varchar(128) DEFAULT NULL COMMENT '上传者IP',
- `create_time` int(11) NOT NULL COMMENT '创建时间'
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图片表';
-
--- --------------------------------------------------------
-
---
--- 表的结构 `lsky_users`
---
-
-DROP TABLE IF EXISTS `lsky_users`;
-CREATE TABLE IF NOT EXISTS `lsky_users` (
- `id` int(11) UNSIGNED NOT NULL,
- `username` varchar(32) NOT NULL COMMENT '用户名',
- `nickname` varchar(32) DEFAULT NULL COMMENT '昵称',
- `email` varchar(100) NOT NULL COMMENT '邮箱',
- `password` varchar(32) NOT NULL COMMENT '密码',
- `quota` decimal(20,2) NOT NULL DEFAULT '0.00' COMMENT '可用配额容量(字节:b)',
- `is_admin` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否为管理员',
- `state` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0:冻结,1:正常',
- `token` varchar(32) DEFAULT NULL COMMENT 'Token',
- `reg_ip` varchar(32) DEFAULT NULL COMMENT '注册IP',
- `delete_time` int(11) DEFAULT NULL COMMENT '删除时间',
- `update_time` int(11) NOT NULL COMMENT '更新时间',
- `create_time` int(11) NOT NULL COMMENT '添加时间'
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-
---
--- Indexes for dumped tables
---
-
---
--- Indexes for table `lsky_config`
---
-ALTER TABLE `lsky_config`
- ADD PRIMARY KEY (`id`),
- ADD UNIQUE KEY `name` (`name`);
-
---
--- Indexes for table `lsky_images`
---
-ALTER TABLE `lsky_images`
- ADD PRIMARY KEY (`id`);
-
---
--- Indexes for table `lsky_users`
---
-ALTER TABLE `lsky_users`
- ADD PRIMARY KEY (`id`),
- ADD UNIQUE KEY `username` (`username`),
- ADD UNIQUE KEY `email` (`email`);
-
---
--- 在导出的表使用AUTO_INCREMENT
---
-
---
--- 使用表AUTO_INCREMENT `lsky_config`
---
-ALTER TABLE `lsky_config`
- MODIFY `id` smallint(6) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=42;
-
---
--- 使用表AUTO_INCREMENT `lsky_images`
---
-ALTER TABLE `lsky_images`
- MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID';
-
---
--- 使用表AUTO_INCREMENT `lsky_users`
---
-ALTER TABLE `lsky_users`
- MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
diff --git a/thinkphp/library/think/console/Table.php b/thinkphp/library/think/console/Table.php
new file mode 100644
index 00000000..9e28e266
--- /dev/null
+++ b/thinkphp/library/think/console/Table.php
@@ -0,0 +1,281 @@
+
+// +----------------------------------------------------------------------
+
+namespace think\console;
+
+class Table
+{
+ const ALIGN_LEFT = 1;
+ const ALIGN_RIGHT = 0;
+ const ALIGN_CENTER = 2;
+
+ /**
+ * 头信息数据
+ * @var array
+ */
+ protected $header = [];
+
+ /**
+ * 头部对齐方式 默认1 ALGIN_LEFT 0 ALIGN_RIGHT 2 ALIGN_CENTER
+ * @var int
+ */
+ protected $headerAlign = 1;
+
+ /**
+ * 表格数据(二维数组)
+ * @var array
+ */
+ protected $rows = [];
+
+ /**
+ * 单元格对齐方式 默认1 ALGIN_LEFT 0 ALIGN_RIGHT 2 ALIGN_CENTER
+ * @var int
+ */
+ protected $cellAlign = 1;
+
+ /**
+ * 单元格宽度信息
+ * @var array
+ */
+ protected $colWidth = [];
+
+ /**
+ * 表格输出样式
+ * @var string
+ */
+ protected $style = 'default';
+
+ /**
+ * 表格样式定义
+ * @var array
+ */
+ protected $format = [
+ 'compact' => [],
+ 'default' => [
+ 'top' => ['+', '-', '+', '+'],
+ 'cell' => ['|', ' ', '|', '|'],
+ 'middle' => ['+', '-', '+', '+'],
+ 'bottom' => ['+', '-', '+', '+'],
+ 'cross-top' => ['+', '-', '-', '+'],
+ 'cross-bottom' => ['+', '-', '-', '+'],
+ ],
+ 'markdown' => [
+ 'top' => [' ', ' ', ' ', ' '],
+ 'cell' => ['|', ' ', '|', '|'],
+ 'middle' => ['|', '-', '|', '|'],
+ 'bottom' => [' ', ' ', ' ', ' '],
+ 'cross-top' => ['|', ' ', ' ', '|'],
+ 'cross-bottom' => ['|', ' ', ' ', '|'],
+ ],
+ 'borderless' => [
+ 'top' => ['=', '=', ' ', '='],
+ 'cell' => [' ', ' ', ' ', ' '],
+ 'middle' => ['=', '=', ' ', '='],
+ 'bottom' => ['=', '=', ' ', '='],
+ 'cross-top' => ['=', '=', ' ', '='],
+ 'cross-bottom' => ['=', '=', ' ', '='],
+ ],
+ 'box' => [
+ 'top' => ['┌', '─', '┬', '┐'],
+ 'cell' => ['│', ' ', '│', '│'],
+ 'middle' => ['├', '─', '┼', '┤'],
+ 'bottom' => ['└', '─', '┴', '┘'],
+ 'cross-top' => ['├', '─', '┴', '┤'],
+ 'cross-bottom' => ['├', '─', '┬', '┤'],
+ ],
+ 'box-double' => [
+ 'top' => ['╔', '═', '╤', '╗'],
+ 'cell' => ['║', ' ', '│', '║'],
+ 'middle' => ['╠', '─', '╪', '╣'],
+ 'bottom' => ['╚', '═', '╧', '╝'],
+ 'cross-top' => ['╠', '═', '╧', '╣'],
+ 'cross-bottom' => ['╠', '═', '╤', '╣'],
+ ],
+ ];
+
+ /**
+ * 设置表格头信息 以及对齐方式
+ * @access public
+ * @param array $header 要输出的Header信息
+ * @param int $align 对齐方式 默认1 ALGIN_LEFT 0 ALIGN_RIGHT 2 ALIGN_CENTER
+ * @return void
+ */
+ public function setHeader(array $header, $align = self::ALIGN_LEFT)
+ {
+ $this->header = $header;
+ $this->headerAlign = $align;
+
+ $this->checkColWidth($header);
+ }
+
+ /**
+ * 设置输出表格数据 及对齐方式
+ * @access public
+ * @param array $rows 要输出的表格数据(二维数组)
+ * @param int $align 对齐方式 默认1 ALGIN_LEFT 0 ALIGN_RIGHT 2 ALIGN_CENTER
+ * @return void
+ */
+ public function setRows(array $rows, $align = self::ALIGN_LEFT)
+ {
+ $this->rows = $rows;
+ $this->cellAlign = $align;
+
+ foreach ($rows as $row) {
+ $this->checkColWidth($row);
+ }
+ }
+
+ /**
+ * 检查列数据的显示宽度
+ * @access public
+ * @param mixed $row 行数据
+ * @return void
+ */
+ protected function checkColWidth($row)
+ {
+ if (is_array($row)) {
+ foreach ($row as $key => $cell) {
+ if (!isset($this->colWidth[$key]) || strlen($cell) > $this->colWidth[$key]) {
+ $this->colWidth[$key] = strlen($cell);
+ }
+ }
+ }
+ }
+
+ /**
+ * 增加一行表格数据
+ * @access public
+ * @param mixed $row 行数据
+ * @param bool $first 是否在开头插入
+ * @return void
+ */
+ public function addRow($row, $first = false)
+ {
+ if ($first) {
+ array_unshift($this->rows, $row);
+ } else {
+ $this->rows[] = $row;
+ }
+
+ $this->checkColWidth($row);
+ }
+
+ /**
+ * 设置输出表格的样式
+ * @access public
+ * @param string $style 样式名
+ * @return void
+ */
+ public function setStyle($style)
+ {
+ $this->style = isset($this->format[$style]) ? $style : 'default';
+ }
+
+ /**
+ * 输出分隔行
+ * @access public
+ * @param string $pos 位置
+ * @return string
+ */
+ protected function renderSeparator($pos)
+ {
+ $style = $this->getStyle($pos);
+ $array = [];
+
+ foreach ($this->colWidth as $width) {
+ $array[] = str_repeat($style[1], $width + 2);
+ }
+
+ return $style[0] . implode($style[2], $array) . $style[3] . PHP_EOL;
+ }
+
+ /**
+ * 输出表格头部
+ * @access public
+ * @return string
+ */
+ protected function renderHeader()
+ {
+ $style = $this->getStyle('cell');
+ $content = $this->renderSeparator('top');
+
+ foreach ($this->header as $key => $header) {
+ $array[] = ' ' . str_pad($header, $this->colWidth[$key], $style[1], $this->headerAlign);
+ }
+
+ if (!empty($array)) {
+ $content .= $style[0] . implode(' ' . $style[2], $array) . ' ' . $style[3] . PHP_EOL;
+
+ if ($this->rows) {
+ $content .= $this->renderSeparator('middle');
+ }
+ }
+
+ return $content;
+ }
+
+ protected function getStyle($style)
+ {
+ if ($this->format[$this->style]) {
+ $style = $this->format[$this->style][$style];
+ } else {
+ $style = [' ', ' ', ' ', ' '];
+ }
+
+ return $style;
+ }
+
+ /**
+ * 输出表格
+ * @access public
+ * @param array $dataList 表格数据
+ * @return string
+ */
+ public function render($dataList = [])
+ {
+ if ($dataList) {
+ $this->setRows($dataList);
+ }
+
+ // 输出头部
+ $content = $this->renderHeader();
+ $style = $this->getStyle('cell');
+
+ if ($this->rows) {
+ foreach ($this->rows as $row) {
+ if (is_string($row) && '-' === $row) {
+ $content .= $this->renderSeparator('middle');
+ } elseif (is_scalar($row)) {
+ $content .= $this->renderSeparator('cross-top');
+ $array = str_pad($row, 3 * (count($this->colWidth) - 1) + array_reduce($this->colWidth, function ($a, $b) {
+ return $a + $b;
+ }));
+
+ $content .= $style[0] . ' ' . $array . ' ' . $style[3] . PHP_EOL;
+ $content .= $this->renderSeparator('cross-bottom');
+ } else {
+ $array = [];
+
+ foreach ($row as $key => $val) {
+ $array[] = ' ' . str_pad($val, $this->colWidth[$key], ' ', $this->cellAlign);
+ }
+
+ $content .= $style[0] . implode(' ' . $style[2], $array) . ' ' . $style[3] . PHP_EOL;
+
+ }
+ }
+ }
+
+ $content .= $this->renderSeparator('bottom');
+
+ return $content;
+ }
+}
diff --git a/thinkphp/library/think/console/command/RouteList.php b/thinkphp/library/think/console/command/RouteList.php
new file mode 100644
index 00000000..0405c31b
--- /dev/null
+++ b/thinkphp/library/think/console/command/RouteList.php
@@ -0,0 +1,130 @@
+
+// +----------------------------------------------------------------------
+namespace think\console\command;
+
+use think\console\Command;
+use think\console\Input;
+use think\console\input\Argument;
+use think\console\input\Option;
+use think\console\Output;
+use think\console\Table;
+use think\Container;
+
+class RouteList extends Command
+{
+ protected $sortBy = [
+ 'rule' => 0,
+ 'route' => 1,
+ 'method' => 2,
+ 'name' => 3,
+ 'domain' => 4,
+ ];
+
+ protected function configure()
+ {
+ $this->setName('route:list')
+ ->addArgument('style', Argument::OPTIONAL, "the style of the table.", 'default')
+ ->addOption('sort', 's', Option::VALUE_OPTIONAL, 'order by rule name.', 0)
+ ->addOption('more', 'm', Option::VALUE_NONE, 'show route options.')
+ ->setDescription('show route list.');
+ }
+
+ protected function execute(Input $input, Output $output)
+ {
+ $filename = Container::get('app')->getRuntimePath() . 'route_list.php';
+
+ if (is_file($filename)) {
+ unlink($filename);
+ }
+
+ $content = $this->getRouteList();
+ file_put_contents($filename, 'Route List' . PHP_EOL . $content);
+ }
+
+ protected function getRouteList()
+ {
+ Container::get('route')->setTestMode(true);
+ // 路由检测
+ $path = Container::get('app')->getRoutePath();
+
+ $files = is_dir($path) ? scandir($path) : [];
+
+ foreach ($files as $file) {
+ if (strpos($file, '.php')) {
+ $filename = $path . DIRECTORY_SEPARATOR . $file;
+ // 导入路由配置
+ $rules = include $filename;
+
+ if (is_array($rules)) {
+ Container::get('route')->import($rules);
+ }
+ }
+ }
+
+ if (Container::get('config')->get('route_annotation')) {
+ $suffix = Container::get('config')->get('controller_suffix') || Container::get('config')->get('class_suffix');
+
+ include Container::get('build')->buildRoute($suffix);
+ }
+
+ $table = new Table();
+
+ if ($this->input->hasOption('more')) {
+ $header = ['Rule', 'Route', 'Method', 'Name', 'Domain', 'Option', 'Pattern'];
+ } else {
+ $header = ['Rule', 'Route', 'Method', 'Name', 'Domain'];
+ }
+
+ $table->setHeader($header);
+
+ $routeList = Container::get('route')->getRuleList();
+ $rows = [];
+
+ foreach ($routeList as $domain => $items) {
+ foreach ($items as $item) {
+ $item['route'] = $item['route'] instanceof \Closure ? '' : $item['route'];
+
+ if ($this->input->hasOption('more')) {
+ $item = [$item['rule'], $item['route'], $item['method'], $item['name'], $domain, json_encode($item['option']), json_encode($item['pattern'])];
+ } else {
+ $item = [$item['rule'], $item['route'], $item['method'], $item['name'], $domain];
+ }
+
+ $rows[] = $item;
+ }
+ }
+
+ if ($this->input->getOption('sort')) {
+ $sort = $this->input->getOption('sort');
+
+ if (isset($this->sortBy[$sort])) {
+ $sort = $this->sortBy[$sort];
+ }
+
+ uasort($rows, function ($a, $b) use ($sort) {
+ $itemA = isset($a[$sort]) ? $a[$sort] : null;
+ $itemB = isset($b[$sort]) ? $b[$sort] : null;
+
+ return strcasecmp($itemA, $itemB);
+ });
+ }
+
+ $table->setRows($rows);
+
+ if ($this->input->getArgument('style')) {
+ $style = $this->input->getArgument('style');
+ $table->setStyle($style);
+ }
+
+ return $this->table($table);
+ }
+
+}
diff --git a/thinkphp/library/think/console/command/Version.php b/thinkphp/library/think/console/command/Version.php
new file mode 100644
index 00000000..ee7eca9c
--- /dev/null
+++ b/thinkphp/library/think/console/command/Version.php
@@ -0,0 +1,31 @@
+
+// +----------------------------------------------------------------------
+namespace think\console\command;
+
+use think\console\Command;
+use think\console\Input;
+use think\console\Output;
+use think\facade\App;
+
+class Version extends Command
+{
+ protected function configure()
+ {
+ // 指令配置
+ $this->setName('version')
+ ->setDescription('show thinkphp framework version');
+ }
+
+ protected function execute(Input $input, Output $output)
+ {
+ $output->writeln('v' . App::version());
+ }
+}
diff --git a/thinkphp/library/think/console/command/make/Command.php b/thinkphp/library/think/console/command/make/Command.php
new file mode 100644
index 00000000..b539eb23
--- /dev/null
+++ b/thinkphp/library/think/console/command/make/Command.php
@@ -0,0 +1,56 @@
+
+// +----------------------------------------------------------------------
+
+namespace think\console\command\make;
+
+use think\console\command\Make;
+use think\console\input\Argument;
+use think\facade\App;
+
+class Command extends Make
+{
+ protected $type = "Command";
+
+ protected function configure()
+ {
+ parent::configure();
+ $this->setName('make:command')
+ ->addArgument('commandName', Argument::OPTIONAL, "The name of the command")
+ ->setDescription('Create a new command class');
+ }
+
+ protected function buildClass($name)
+ {
+ $commandName = $this->input->getArgument('commandName') ?: strtolower(basename($name));
+ $namespace = trim(implode('\\', array_slice(explode('\\', $name), 0, -1)), '\\');
+
+ $class = str_replace($namespace . '\\', '', $name);
+ $stub = file_get_contents($this->getStub());
+
+ return str_replace(['{%commandName%}', '{%className%}', '{%namespace%}', '{%app_namespace%}'], [
+ $commandName,
+ $class,
+ $namespace,
+ App::getNamespace(),
+ ], $stub);
+ }
+
+ protected function getStub()
+ {
+ return __DIR__ . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'command.stub';
+ }
+
+ protected function getNamespace($appNamespace, $module)
+ {
+ return $appNamespace . '\\command';
+ }
+
+}
diff --git a/thinkphp/library/think/console/command/make/stubs/command.stub b/thinkphp/library/think/console/command/make/stubs/command.stub
new file mode 100644
index 00000000..d2c7c1e7
--- /dev/null
+++ b/thinkphp/library/think/console/command/make/stubs/command.stub
@@ -0,0 +1,24 @@
+setName('{%commandName%}');
+ // 设置参数
+
+ }
+
+ protected function execute(Input $input, Output $output)
+ {
+ // 指令输出
+ $output->writeln('{%commandName%}');
+ }
+}
diff --git a/thinkphp/library/think/db/Where.php b/thinkphp/library/think/db/Where.php
new file mode 100644
index 00000000..9132e546
--- /dev/null
+++ b/thinkphp/library/think/db/Where.php
@@ -0,0 +1,178 @@
+
+// +----------------------------------------------------------------------
+
+namespace think\db;
+
+use ArrayAccess;
+
+class Where implements ArrayAccess
+{
+ /**
+ * 查询表达式
+ * @var array
+ */
+ protected $where = [];
+
+ /**
+ * 是否需要增加括号
+ * @var bool
+ */
+ protected $enclose = false;
+
+ /**
+ * 创建一个查询表达式
+ *
+ * @param array $where 查询条件数组
+ * @param bool $enclose 是否增加括号
+ */
+ public function __construct(array $where = [], $enclose = false)
+ {
+ $this->where = $where;
+ $this->enclose = $enclose;
+ }
+
+ /**
+ * 设置是否添加括号
+ * @access public
+ * @param bool $enclose
+ * @return $this
+ */
+ public function enclose($enclose = true)
+ {
+ $this->enclose = $enclose;
+ return $this;
+ }
+
+ /**
+ * 解析为Query对象可识别的查询条件数组
+ * @access public
+ * @return array
+ */
+ public function parse()
+ {
+ $where = [];
+
+ foreach ($this->where as $key => $val) {
+ if ($val instanceof Expression) {
+ $where[] = [$key, 'exp', $val];
+ } elseif (is_null($val)) {
+ $where[] = [$key, 'NULL', ''];
+ } elseif (is_array($val)) {
+ $where[] = $this->parseItem($key, $val);
+ } else {
+ $where[] = [$key, '=', $val];
+ }
+ }
+
+ return $this->enclose ? [$where] : $where;
+ }
+
+ /**
+ * 分析查询表达式
+ * @access protected
+ * @param string $field 查询字段
+ * @param array $where 查询条件
+ * @return array
+ */
+ protected function parseItem($field, $where = [])
+ {
+ $op = $where[0];
+ $condition = isset($where[1]) ? $where[1] : null;
+
+ if (is_array($op)) {
+ // 同一字段多条件查询
+ array_unshift($where, $field);
+ } elseif (is_null($condition)) {
+ if (in_array(strtoupper($op), ['NULL', 'NOTNULL', 'NOT NULL'], true)) {
+ // null查询
+ $where = [$field, $op, ''];
+ } elseif (in_array($op, ['=', 'eq', 'EQ', null], true)) {
+ $where = [$field, 'NULL', ''];
+ } elseif (in_array($op, ['<>', 'neq', 'NEQ'], true)) {
+ $where = [$field, 'NOTNULL', ''];
+ } else {
+ // 字段相等查询
+ $where = [$field, '=', $op];
+ }
+ } else {
+ $where = [$field, $op, $condition];
+ }
+
+ return $where;
+ }
+
+ /**
+ * 修改器 设置数据对象的值
+ * @access public
+ * @param string $name 名称
+ * @param mixed $value 值
+ * @return void
+ */
+ public function __set($name, $value)
+ {
+ $this->where[$name] = $value;
+ }
+
+ /**
+ * 获取器 获取数据对象的值
+ * @access public
+ * @param string $name 名称
+ * @return mixed
+ */
+ public function __get($name)
+ {
+ return isset($this->where[$name]) ? $this->where[$name] : null;
+ }
+
+ /**
+ * 检测数据对象的值
+ * @access public
+ * @param string $name 名称
+ * @return boolean
+ */
+ public function __isset($name)
+ {
+ return isset($this->where[$name]);
+ }
+
+ /**
+ * 销毁数据对象的值
+ * @access public
+ * @param string $name 名称
+ * @return void
+ */
+ public function __unset($name)
+ {
+ unset($this->where[$name]);
+ }
+
+ // ArrayAccess
+ public function offsetSet($name, $value)
+ {
+ $this->__set($name, $value);
+ }
+
+ public function offsetExists($name)
+ {
+ return $this->__isset($name);
+ }
+
+ public function offsetUnset($name)
+ {
+ $this->__unset($name);
+ }
+
+ public function offsetGet($name)
+ {
+ return $this->__get($name);
+ }
+
+}
diff --git a/thinkphp/library/think/facade/Template.php b/thinkphp/library/think/facade/Template.php
new file mode 100644
index 00000000..f91b1182
--- /dev/null
+++ b/thinkphp/library/think/facade/Template.php
@@ -0,0 +1,36 @@
+
+// +----------------------------------------------------------------------
+
+namespace think\facade;
+
+use think\Facade;
+
+/**
+ * @see \think\Template
+ * @mixin \think\Template
+ * @method void assign(mixed $name, mixed $value = '') static 模板变量赋值
+ * @method mixed get(string $name = '') static 获取模板变量
+ * @method void fetch(string $template, array $vars = [], array $config = []) static 渲染模板文件
+ * @method void display(string $content, array $vars = [], array $config = []) static 渲染模板内容
+ * @method mixed layout(string $name, string $replace = '') static 设置模板布局
+ */
+class Template extends Facade
+{
+ /**
+ * 获取当前Facade对应类名(或者已经绑定的容器对象标识)
+ * @access protected
+ * @return string
+ */
+ protected static function getFacadeClass()
+ {
+ return 'template';
+ }
+}
diff --git a/thinkphp/library/think/response/Download.php b/thinkphp/library/think/response/Download.php
new file mode 100644
index 00000000..02a440df
--- /dev/null
+++ b/thinkphp/library/think/response/Download.php
@@ -0,0 +1,137 @@
+
+// +----------------------------------------------------------------------
+
+namespace think\response;
+
+use think\Exception;
+use think\Response;
+
+class Download extends Response
+{
+ protected $expire = 360;
+ protected $name;
+ protected $mimeType;
+ protected $isContent = false;
+
+ /**
+ * 处理数据
+ * @access protected
+ * @param mixed $data 要处理的数据
+ * @return mixed
+ * @throws \Exception
+ */
+ protected function output($data)
+ {
+ if (!$this->isContent && !is_file($data)) {
+ throw new Exception('file not exists:' . $data);
+ }
+
+ ob_end_clean();
+
+ if (!empty($this->name)) {
+ $name = $this->name;
+ } else {
+ $name = !$this->isContent ? pathinfo($data, PATHINFO_BASENAME) : '';
+ }
+
+ if ($this->isContent) {
+ $mimeType = $this->mimeType;
+ $size = strlen($data);
+ } else {
+ $mimeType = $this->getMimeType($data);
+ $size = filesize($data);
+ }
+
+ $this->header['Pragma'] = 'public';
+ $this->header['Content-Type'] = $mimeType ?: 'application/octet-stream';
+ $this->header['Cache-control'] = 'max-age=' . $this->expire;
+ $this->header['Content-Disposition'] = 'attachment; filename="' . $name . '"';
+ $this->header['Content-Length'] = $size;
+ $this->header['Content-Transfer-Encoding'] = 'binary';
+ $this->header['Expires'] = gmdate("D, d M Y H:i:s", time() + $this->expire) . ' GMT';
+
+ $this->lastModified(gmdate('D, d M Y H:i:s', time()) . ' GMT');
+
+ $data = $this->isContent ? $data : file_get_contents($data);
+ return $data;
+ }
+
+ /**
+ * 设置是否为内容 必须配合mimeType方法使用
+ * @access public
+ * @param bool $content
+ * @return $this
+ */
+ public function isContent($content = true)
+ {
+ $this->isContent = $content;
+ return $this;
+ }
+
+ /**
+ * 设置有效期
+ * @access public
+ * @param integer $expire 有效期
+ * @return $this
+ */
+ public function expire($expire)
+ {
+ $this->expire = $expire;
+ return $this;
+ }
+
+ /**
+ * 设置文件类型
+ * @access public
+ * @param string $filename 文件名
+ * @return $this
+ */
+ public function mimeType($mimeType)
+ {
+ $this->mimeType = $mimeType;
+ return $this;
+ }
+
+ /**
+ * 获取文件类型信息
+ * @access public
+ * @param string $filename 文件名
+ * @return string
+ */
+ protected function getMimeType($filename)
+ {
+ if (!empty($this->mimeType)) {
+ return $this->mimeType;
+ }
+
+ $finfo = finfo_open(FILEINFO_MIME_TYPE);
+
+ return finfo_file($finfo, $filename);
+ }
+
+ /**
+ * 设置下载文件的显示名称
+ * @access public
+ * @param string $filename 文件名
+ * @param bool $extension 后缀自动识别
+ * @return $this
+ */
+ public function name($filename, $extension = true)
+ {
+ $this->name = $filename;
+
+ if ($extension && false === strpos($filename, '.')) {
+ $this->name .= '.' . pathinfo($this->data, PATHINFO_EXTENSION);
+ }
+
+ return $this;
+ }
+}
diff --git a/update.sql b/update.sql
deleted file mode 100644
index 256acd65..00000000
--- a/update.sql
+++ /dev/null
@@ -1,4 +0,0 @@
---
--- Sql更新文件,选择数据库后导入,或直接复制内容执行
---
-UPDATE `lsky_config` SET `value` = '1.2.1' WHERE `lsky_config`.`name` = 'system_version';
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index d5878289..23cf8ee9 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -6,6 +6,7 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
+ '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
'37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 592fdedc..4e4ef451 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -7,6 +7,7 @@ namespace Composer\Autoload;
class ComposerStaticInit04f78adc0d26d025ab398ddde054e232
{
public static $files = array (
+ '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
'37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 5e2ce6ee..97470259 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -262,34 +262,35 @@
},
{
"name": "guzzlehttp/psr7",
- "version": "1.4.2",
- "version_normalized": "1.4.2.0",
+ "version": "1.5.0",
+ "version_normalized": "1.5.0.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
- "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
+ "reference": "53662d6688033a5eccde987bdd5a4a98ebe2d952"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
- "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/53662d6688033a5eccde987bdd5a4a98ebe2d952",
+ "reference": "53662d6688033a5eccde987bdd5a4a98ebe2d952",
"shasum": ""
},
"require": {
"php": ">=5.4.0",
- "psr/http-message": "~1.0"
+ "psr/http-message": "~1.0",
+ "ralouphie/getallheaders": "^2.0.5"
},
"provide": {
"psr/http-message-implementation": "1.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.0"
+ "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
},
- "time": "2017-03-20T17:10:46+00:00",
+ "time": "2018-12-03T05:07:51+00:00",
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.4-dev"
+ "dev-master": "1.5-dev"
}
},
"installation-source": "dist",
@@ -320,6 +321,7 @@
"keywords": [
"http",
"message",
+ "psr-7",
"request",
"response",
"stream",
@@ -548,6 +550,48 @@
"storage"
]
},
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "2.0.5",
+ "version_normalized": "2.0.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa",
+ "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~3.7.0",
+ "satooshi/php-coveralls": ">=1.0"
+ },
+ "time": "2016-02-11T07:05:27+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "description": "A polyfill for getallheaders."
+ },
{
"name": "symfony/event-dispatcher",
"version": "v2.8.48",
diff --git a/vendor/guzzlehttp/psr7/.editorconfig b/vendor/guzzlehttp/psr7/.editorconfig
new file mode 100644
index 00000000..677e36e2
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/.editorconfig
@@ -0,0 +1,9 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
diff --git a/vendor/guzzlehttp/psr7/CHANGELOG.md b/vendor/guzzlehttp/psr7/CHANGELOG.md
index 5c252b3a..02c902bd 100644
--- a/vendor/guzzlehttp/psr7/CHANGELOG.md
+++ b/vendor/guzzlehttp/psr7/CHANGELOG.md
@@ -1,32 +1,68 @@
-# CHANGELOG
+# Change Log
-## 1.4.2 - 2017-03-20
-* Reverted BC break to `Uri::resolve` and `Uri::removeDotSegments` by removing
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
+
+
+## [Unreleased]
+
+
+## [1.5.0] - 2018-12-03
+
+### Added
+
+- Response first-line to response string exception (fixes #145)
+- A test for #129 behavior
+- `get_message_body_summary` function in order to get the message summary
+- `3gp` and `mkv` mime types
+
+### Changed
+
+- Clarify exception message when stream is detached
+
+### Deprecated
+
+- Deprecated parsing folded header lines as per RFC 7230
+
+### Fixed
+
+- Fix `AppendStream::detach` to not close streams
+- `InflateStream` preserves `isSeekable` attribute of the underlying stream
+- `ServerRequest::getUriFromGlobals` to support URLs in query parameters
+
+
+Several other fixes and improvements.
+
+
+## [1.4.2] - 2017-03-20
+
+### Fixed
+
+- Reverted BC break to `Uri::resolve` and `Uri::removeDotSegments` by removing
calls to `trigger_error` when deprecated methods are invoked.
-## 1.4.1 - 2017-02-27
-* Reverted BC break by reintroducing behavior to automagically fix a URI with a
+## [1.4.1] - 2017-02-27
+
+### Added
+
+- Rriggering of silenced deprecation warnings.
+
+### Fixed
+
+- Reverted BC break by reintroducing behavior to automagically fix a URI with a
relative path and an authority by adding a leading slash to the path. It's only
deprecated now.
-* Added triggering of silenced deprecation warnings.
-## 1.4.0 - 2017-02-21
-* Fix `Stream::read` when length parameter <= 0.
-* `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory.
-* Fix `ServerRequest::getUriFromGlobals` when `Host` header contains port.
-* Ensure `ServerRequest::getUriFromGlobals` returns a URI in absolute form.
-* Allow `parse_response` to parse a response without delimiting space and reason.
-* Ensure each URI modification results in a valid URI according to PSR-7 discussions.
- Invalid modifications will throw an exception instead of returning a wrong URI or
- doing some magic.
- - `(new Uri)->withPath('foo')->withHost('example.com')` will throw an exception
- because the path of a URI with an authority must start with a slash "/" or be empty
- - `(new Uri())->withScheme('http')` will return `'http://localhost'`
-* Fix compatibility of URIs with `file` scheme and empty host.
-* Added common URI utility methods based on RFC 3986 (see documentation in the readme):
+## [1.4.0] - 2017-02-21
+
+### Added
+
+- Added common URI utility methods based on RFC 3986 (see documentation in the readme):
- `Uri::isDefaultPort`
- `Uri::isAbsolute`
- `Uri::isNetworkPathReference`
@@ -37,69 +73,117 @@
- `UriNormalizer::normalize`
- `UriNormalizer::isEquivalent`
- `UriResolver::relativize`
-* Deprecated `Uri::resolve` in favor of `UriResolver::resolve`
-* Deprecated `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments`
-## 1.3.1 - 2016-06-25
+### Changed
-* Fix `Uri::__toString` for network path references, e.g. `//example.org`.
-* Fix missing lowercase normalization for host.
-* Fix handling of URI components in case they are `'0'` in a lot of places,
+- Ensure `ServerRequest::getUriFromGlobals` returns a URI in absolute form.
+- Allow `parse_response` to parse a response without delimiting space and reason.
+- Ensure each URI modification results in a valid URI according to PSR-7 discussions.
+ Invalid modifications will throw an exception instead of returning a wrong URI or
+ doing some magic.
+ - `(new Uri)->withPath('foo')->withHost('example.com')` will throw an exception
+ because the path of a URI with an authority must start with a slash "/" or be empty
+ - `(new Uri())->withScheme('http')` will return `'http://localhost'`
+
+### Deprecated
+
+- `Uri::resolve` in favor of `UriResolver::resolve`
+- `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments`
+
+### Fixed
+
+- `Stream::read` when length parameter <= 0.
+- `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory.
+- `ServerRequest::getUriFromGlobals` when `Host` header contains port.
+- Compatibility of URIs with `file` scheme and empty host.
+
+
+## [1.3.1] - 2016-06-25
+
+### Fixed
+
+- `Uri::__toString` for network path references, e.g. `//example.org`.
+- Missing lowercase normalization for host.
+- Handling of URI components in case they are `'0'` in a lot of places,
e.g. as a user info password.
-* Fix `Uri::withAddedHeader` to correctly merge headers with different case.
-* Fix trimming of header values in `Uri::withAddedHeader`. Header values may
+- `Uri::withAddedHeader` to correctly merge headers with different case.
+- Trimming of header values in `Uri::withAddedHeader`. Header values may
be surrounded by whitespace which should be ignored according to RFC 7230
Section 3.2.4. This does not apply to header names.
-* Fix `Uri::withAddedHeader` with an array of header values.
-* Fix `Uri::resolve` when base path has no slash and handling of fragment.
-* Fix handling of encoding in `Uri::with(out)QueryValue` so one can pass the
+- `Uri::withAddedHeader` with an array of header values.
+- `Uri::resolve` when base path has no slash and handling of fragment.
+- Handling of encoding in `Uri::with(out)QueryValue` so one can pass the
key/value both in encoded as well as decoded form to those methods. This is
consistent with withPath, withQuery etc.
-* Fix `ServerRequest::withoutAttribute` when attribute value is null.
+- `ServerRequest::withoutAttribute` when attribute value is null.
-## 1.3.0 - 2016-04-13
-* Added remaining interfaces needed for full PSR7 compatibility
+## [1.3.0] - 2016-04-13
+
+### Added
+
+- Remaining interfaces needed for full PSR7 compatibility
(ServerRequestInterface, UploadedFileInterface, etc.).
-* Added support for stream_for from scalars.
-* Can now extend Uri.
-* Fixed a bug in validating request methods by making it more permissive.
+- Support for stream_for from scalars.
-## 1.2.3 - 2016-02-18
+### Changed
-* Fixed support in `GuzzleHttp\Psr7\CachingStream` for seeking forward on remote
+- Can now extend Uri.
+
+### Fixed
+- A bug in validating request methods by making it more permissive.
+
+
+## [1.2.3] - 2016-02-18
+
+### Fixed
+
+- Support in `GuzzleHttp\Psr7\CachingStream` for seeking forward on remote
streams, which can sometimes return fewer bytes than requested with `fread`.
-* Fixed handling of gzipped responses with FNAME headers.
+- Handling of gzipped responses with FNAME headers.
-## 1.2.2 - 2016-01-22
-* Added support for URIs without any authority.
-* Added support for HTTP 451 'Unavailable For Legal Reasons.'
-* Added support for using '0' as a filename.
-* Added support for including non-standard ports in Host headers.
+## [1.2.2] - 2016-01-22
-## 1.2.1 - 2015-11-02
+### Added
-* Now supporting negative offsets when seeking to SEEK_END.
+- Support for URIs without any authority.
+- Support for HTTP 451 'Unavailable For Legal Reasons.'
+- Support for using '0' as a filename.
+- Support for including non-standard ports in Host headers.
-## 1.2.0 - 2015-08-15
-* Body as `"0"` is now properly added to a response.
-* Now allowing forward seeking in CachingStream.
-* Now properly parsing HTTP requests that contain proxy targets in
+## [1.2.1] - 2015-11-02
+
+### Changes
+
+- Now supporting negative offsets when seeking to SEEK_END.
+
+
+## [1.2.0] - 2015-08-15
+
+### Changed
+
+- Body as `"0"` is now properly added to a response.
+- Now allowing forward seeking in CachingStream.
+- Now properly parsing HTTP requests that contain proxy targets in
`parse_request`.
-* functions.php is now conditionally required.
-* user-info is no longer dropped when resolving URIs.
+- functions.php is now conditionally required.
+- user-info is no longer dropped when resolving URIs.
-## 1.1.0 - 2015-06-24
-* URIs can now be relative.
-* `multipart/form-data` headers are now overridden case-insensitively.
-* URI paths no longer encode the following characters because they are allowed
+## [1.1.0] - 2015-06-24
+
+### Changed
+
+- URIs can now be relative.
+- `multipart/form-data` headers are now overridden case-insensitively.
+- URI paths no longer encode the following characters because they are allowed
in URIs: "(", ")", "*", "!", "'"
-* A port is no longer added to a URI when the scheme is missing and no port is
+- A port is no longer added to a URI when the scheme is missing and no port is
present.
+
## 1.0.0 - 2015-05-19
Initial release.
@@ -108,3 +192,18 @@ Currently unsupported:
- `Psr\Http\Message\ServerRequestInterface`
- `Psr\Http\Message\UploadedFileInterface`
+
+
+
+[Unreleased]: https://github.com/guzzle/psr7/compare/1.5.0...HEAD
+[1.5.0]: https://github.com/guzzle/psr7/compare/1.4.2...1.5.0
+[1.4.2]: https://github.com/guzzle/psr7/compare/1.4.1...1.4.2
+[1.4.1]: https://github.com/guzzle/psr7/compare/1.4.0...1.4.1
+[1.4.0]: https://github.com/guzzle/psr7/compare/1.3.1...1.4.0
+[1.3.1]: https://github.com/guzzle/psr7/compare/1.3.0...1.3.1
+[1.3.0]: https://github.com/guzzle/psr7/compare/1.2.3...1.3.0
+[1.2.3]: https://github.com/guzzle/psr7/compare/1.2.2...1.2.3
+[1.2.2]: https://github.com/guzzle/psr7/compare/1.2.1...1.2.2
+[1.2.1]: https://github.com/guzzle/psr7/compare/1.2.0...1.2.1
+[1.2.0]: https://github.com/guzzle/psr7/compare/1.1.0...1.2.0
+[1.1.0]: https://github.com/guzzle/psr7/compare/1.0.0...1.1.0
diff --git a/vendor/guzzlehttp/psr7/README.md b/vendor/guzzlehttp/psr7/README.md
index 16499358..c60a6a38 100644
--- a/vendor/guzzlehttp/psr7/README.md
+++ b/vendor/guzzlehttp/psr7/README.md
@@ -372,7 +372,7 @@ This method accepts the following `$resource` types:
$stream = GuzzleHttp\Psr7\stream_for('foo');
$stream = GuzzleHttp\Psr7\stream_for(fopen('/path/to/file', 'r'));
-$generator function ($bytes) {
+$generator = function ($bytes) {
for ($i = 0; $i < $bytes; $i++) {
yield ' ';
}
@@ -606,6 +606,12 @@ Creates a new URI with a specific query string value. Any existing query string
provided key are removed and replaced with the given key value pair. A value of null will set the query string
key without a value, e.g. "key" instead of "key=value".
+### `GuzzleHttp\Psr7\Uri::withQueryValues`
+
+`public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface`
+
+Creates a new URI with multiple query string values. It has the same behavior as `withQueryValue()` but for an
+associative array of key => value.
### `GuzzleHttp\Psr7\Uri::withoutQueryValue`
diff --git a/vendor/guzzlehttp/psr7/composer.json b/vendor/guzzlehttp/psr7/composer.json
index b1c5a90b..2add153e 100644
--- a/vendor/guzzlehttp/psr7/composer.json
+++ b/vendor/guzzlehttp/psr7/composer.json
@@ -2,7 +2,7 @@
"name": "guzzlehttp/psr7",
"type": "library",
"description": "PSR-7 message implementation that also provides common utility methods",
- "keywords": ["request", "response", "message", "stream", "http", "uri", "url"],
+ "keywords": ["request", "response", "message", "stream", "http", "uri", "url", "psr-7"],
"license": "MIT",
"authors": [
{
@@ -17,10 +17,11 @@
],
"require": {
"php": ">=5.4.0",
- "psr/http-message": "~1.0"
+ "psr/http-message": "~1.0",
+ "ralouphie/getallheaders": "^2.0.5"
},
"require-dev": {
- "phpunit/phpunit": "~4.0"
+ "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
},
"provide": {
"psr/http-message-implementation": "1.0"
@@ -31,9 +32,14 @@
},
"files": ["src/functions_include.php"]
},
+ "autoload-dev": {
+ "psr-4": {
+ "GuzzleHttp\\Tests\\Psr7\\": "tests/"
+ }
+ },
"extra": {
"branch-alias": {
- "dev-master": "1.4-dev"
+ "dev-master": "1.5-dev"
}
}
}
diff --git a/vendor/guzzlehttp/psr7/src/AppendStream.php b/vendor/guzzlehttp/psr7/src/AppendStream.php
index 23039fd7..472a0d61 100644
--- a/vendor/guzzlehttp/psr7/src/AppendStream.php
+++ b/vendor/guzzlehttp/psr7/src/AppendStream.php
@@ -16,7 +16,6 @@ class AppendStream implements StreamInterface
private $seekable = true;
private $current = 0;
private $pos = 0;
- private $detached = false;
/**
* @param StreamInterface[] $streams Streams to decorate. Each stream must
@@ -73,6 +72,7 @@ class AppendStream implements StreamInterface
public function close()
{
$this->pos = $this->current = 0;
+ $this->seekable = true;
foreach ($this->streams as $stream) {
$stream->close();
@@ -82,14 +82,22 @@ class AppendStream implements StreamInterface
}
/**
- * Detaches each attached stream
+ * Detaches each attached stream.
+ *
+ * Returns null as it's not clear which underlying stream resource to return.
*
* {@inheritdoc}
*/
public function detach()
{
- $this->close();
- $this->detached = true;
+ $this->pos = $this->current = 0;
+ $this->seekable = true;
+
+ foreach ($this->streams as $stream) {
+ $stream->detach();
+ }
+
+ $this->streams = [];
}
public function tell()
diff --git a/vendor/guzzlehttp/psr7/src/FnStream.php b/vendor/guzzlehttp/psr7/src/FnStream.php
index cc9b4453..73daea6f 100644
--- a/vendor/guzzlehttp/psr7/src/FnStream.php
+++ b/vendor/guzzlehttp/psr7/src/FnStream.php
@@ -52,6 +52,15 @@ class FnStream implements StreamInterface
}
}
+ /**
+ * An unserialize would allow the __destruct to run when the unserialized value goes out of scope.
+ * @throws \LogicException
+ */
+ public function __wakeup()
+ {
+ throw new \LogicException('FnStream should never be unserialized');
+ }
+
/**
* Adds custom functionality to an underlying stream by intercepting
* specific method calls.
diff --git a/vendor/guzzlehttp/psr7/src/InflateStream.php b/vendor/guzzlehttp/psr7/src/InflateStream.php
index 0051d3fe..5e4f6028 100644
--- a/vendor/guzzlehttp/psr7/src/InflateStream.php
+++ b/vendor/guzzlehttp/psr7/src/InflateStream.php
@@ -27,7 +27,7 @@ class InflateStream implements StreamInterface
$stream = new LimitStream($stream, -1, 10 + $filenameHeaderLength);
$resource = StreamWrapper::getResource($stream);
stream_filter_append($resource, 'zlib.inflate', STREAM_FILTER_READ);
- $this->stream = new Stream($resource);
+ $this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource));
}
/**
diff --git a/vendor/guzzlehttp/psr7/src/Request.php b/vendor/guzzlehttp/psr7/src/Request.php
index 08285484..00066424 100644
--- a/vendor/guzzlehttp/psr7/src/Request.php
+++ b/vendor/guzzlehttp/psr7/src/Request.php
@@ -45,7 +45,7 @@ class Request implements RequestInterface
$this->setHeaders($headers);
$this->protocol = $version;
- if (!$this->hasHeader('Host')) {
+ if (!isset($this->headerNames['host'])) {
$this->updateHostFromUri();
}
@@ -110,7 +110,7 @@ class Request implements RequestInterface
$new = clone $this;
$new->uri = $uri;
- if (!$preserveHost) {
+ if (!$preserveHost || !isset($this->headerNames['host'])) {
$new->updateHostFromUri();
}
diff --git a/vendor/guzzlehttp/psr7/src/Response.php b/vendor/guzzlehttp/psr7/src/Response.php
index 2830c6c9..6e72c06b 100644
--- a/vendor/guzzlehttp/psr7/src/Response.php
+++ b/vendor/guzzlehttp/psr7/src/Response.php
@@ -93,6 +93,10 @@ class Response implements ResponseInterface
$version = '1.1',
$reason = null
) {
+ if (filter_var($status, FILTER_VALIDATE_INT) === false) {
+ throw new \InvalidArgumentException('Status code must be an integer value.');
+ }
+
$this->statusCode = (int) $status;
if ($body !== '' && $body !== null) {
diff --git a/vendor/guzzlehttp/psr7/src/Rfc7230.php b/vendor/guzzlehttp/psr7/src/Rfc7230.php
new file mode 100644
index 00000000..505e4742
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/Rfc7230.php
@@ -0,0 +1,18 @@
+@,;:\\\"/[\]?={}\x01-\x20\x7F]++):[ \t]*+((?:[ \t]*+[\x21-\x7E\x80-\xFF]++)*+)[ \t]*+\r?\n)m";
+ const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)";
+}
diff --git a/vendor/guzzlehttp/psr7/src/ServerRequest.php b/vendor/guzzlehttp/psr7/src/ServerRequest.php
index 575aab84..99f453a5 100644
--- a/vendor/guzzlehttp/psr7/src/ServerRequest.php
+++ b/vendor/guzzlehttp/psr7/src/ServerRequest.php
@@ -166,7 +166,7 @@ class ServerRequest extends Request implements ServerRequestInterface
public static function fromGlobals()
{
$method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET';
- $headers = function_exists('getallheaders') ? getallheaders() : [];
+ $headers = getallheaders();
$uri = self::getUriFromGlobals();
$body = new LazyOpenStream('php://input', 'r+');
$protocol = isset($_SERVER['SERVER_PROTOCOL']) ? str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1';
@@ -180,23 +180,41 @@ class ServerRequest extends Request implements ServerRequestInterface
->withUploadedFiles(self::normalizeFiles($_FILES));
}
+ private static function extractHostAndPortFromAuthority($authority)
+ {
+ $uri = 'http://'.$authority;
+ $parts = parse_url($uri);
+ if (false === $parts) {
+ return [null, null];
+ }
+
+ $host = isset($parts['host']) ? $parts['host'] : null;
+ $port = isset($parts['port']) ? $parts['port'] : null;
+
+ return [$host, $port];
+ }
+
/**
* Get a Uri populated with values from $_SERVER.
*
* @return UriInterface
*/
- public static function getUriFromGlobals() {
+ public static function getUriFromGlobals()
+ {
$uri = new Uri('');
$uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http');
$hasPort = false;
if (isset($_SERVER['HTTP_HOST'])) {
- $hostHeaderParts = explode(':', $_SERVER['HTTP_HOST']);
- $uri = $uri->withHost($hostHeaderParts[0]);
- if (isset($hostHeaderParts[1])) {
+ list($host, $port) = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']);
+ if ($host !== null) {
+ $uri = $uri->withHost($host);
+ }
+
+ if ($port !== null) {
$hasPort = true;
- $uri = $uri->withPort($hostHeaderParts[1]);
+ $uri = $uri->withPort($port);
}
} elseif (isset($_SERVER['SERVER_NAME'])) {
$uri = $uri->withHost($_SERVER['SERVER_NAME']);
@@ -210,7 +228,7 @@ class ServerRequest extends Request implements ServerRequestInterface
$hasQuery = false;
if (isset($_SERVER['REQUEST_URI'])) {
- $requestUriParts = explode('?', $_SERVER['REQUEST_URI']);
+ $requestUriParts = explode('?', $_SERVER['REQUEST_URI'], 2);
$uri = $uri->withPath($requestUriParts[0]);
if (isset($requestUriParts[1])) {
$hasQuery = true;
diff --git a/vendor/guzzlehttp/psr7/src/Stream.php b/vendor/guzzlehttp/psr7/src/Stream.php
index e3366287..111795eb 100644
--- a/vendor/guzzlehttp/psr7/src/Stream.php
+++ b/vendor/guzzlehttp/psr7/src/Stream.php
@@ -24,11 +24,11 @@ class Stream implements StreamInterface
'r' => true, 'w+' => true, 'r+' => true, 'x+' => true, 'c+' => true,
'rb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true,
'c+b' => true, 'rt' => true, 'w+t' => true, 'r+t' => true,
- 'x+t' => true, 'c+t' => true, 'a+' => true
+ 'x+t' => true, 'c+t' => true, 'a+' => true, 'rb+' => true,
],
'write' => [
'w' => true, 'w+' => true, 'rw' => true, 'r+' => true, 'x+' => true,
- 'c+' => true, 'wb' => true, 'w+b' => true, 'r+b' => true,
+ 'c+' => true, 'wb' => true, 'w+b' => true, 'r+b' => true, 'rb+' => true,
'x+b' => true, 'c+b' => true, 'w+t' => true, 'r+t' => true,
'x+t' => true, 'c+t' => true, 'a' => true, 'a+' => true
]
@@ -70,15 +70,6 @@ class Stream implements StreamInterface
$this->uri = $this->getMetadata('uri');
}
- public function __get($name)
- {
- if ($name == 'stream') {
- throw new \RuntimeException('The stream is detached');
- }
-
- throw new \BadMethodCallException('No value for ' . $name);
- }
-
/**
* Closes the stream when the destructed
*/
@@ -99,6 +90,10 @@ class Stream implements StreamInterface
public function getContents()
{
+ if (!isset($this->stream)) {
+ throw new \RuntimeException('Stream is detached');
+ }
+
$contents = stream_get_contents($this->stream);
if ($contents === false) {
@@ -173,11 +168,19 @@ class Stream implements StreamInterface
public function eof()
{
- return !$this->stream || feof($this->stream);
+ if (!isset($this->stream)) {
+ throw new \RuntimeException('Stream is detached');
+ }
+
+ return feof($this->stream);
}
public function tell()
{
+ if (!isset($this->stream)) {
+ throw new \RuntimeException('Stream is detached');
+ }
+
$result = ftell($this->stream);
if ($result === false) {
@@ -194,9 +197,13 @@ class Stream implements StreamInterface
public function seek($offset, $whence = SEEK_SET)
{
+ if (!isset($this->stream)) {
+ throw new \RuntimeException('Stream is detached');
+ }
if (!$this->seekable) {
throw new \RuntimeException('Stream is not seekable');
- } elseif (fseek($this->stream, $offset, $whence) === -1) {
+ }
+ if (fseek($this->stream, $offset, $whence) === -1) {
throw new \RuntimeException('Unable to seek to stream position '
. $offset . ' with whence ' . var_export($whence, true));
}
@@ -204,6 +211,9 @@ class Stream implements StreamInterface
public function read($length)
{
+ if (!isset($this->stream)) {
+ throw new \RuntimeException('Stream is detached');
+ }
if (!$this->readable) {
throw new \RuntimeException('Cannot read from non-readable stream');
}
@@ -225,6 +235,9 @@ class Stream implements StreamInterface
public function write($string)
{
+ if (!isset($this->stream)) {
+ throw new \RuntimeException('Stream is detached');
+ }
if (!$this->writable) {
throw new \RuntimeException('Cannot write to a non-writable stream');
}
diff --git a/vendor/guzzlehttp/psr7/src/StreamWrapper.php b/vendor/guzzlehttp/psr7/src/StreamWrapper.php
index cf7b2232..0f3a2856 100644
--- a/vendor/guzzlehttp/psr7/src/StreamWrapper.php
+++ b/vendor/guzzlehttp/psr7/src/StreamWrapper.php
@@ -38,9 +38,21 @@ class StreamWrapper
. 'writable, or both.');
}
- return fopen('guzzle://stream', $mode, null, stream_context_create([
+ return fopen('guzzle://stream', $mode, null, self::createStreamContext($stream));
+ }
+
+ /**
+ * Creates a stream context that can be used to open a stream as a php stream resource.
+ *
+ * @param StreamInterface $stream
+ *
+ * @return resource
+ */
+ public static function createStreamContext(StreamInterface $stream)
+ {
+ return stream_context_create([
'guzzle' => ['stream' => $stream]
- ]));
+ ]);
}
/**
@@ -94,12 +106,21 @@ class StreamWrapper
return true;
}
+ public function stream_cast($cast_as)
+ {
+ $stream = clone($this->stream);
+
+ return $stream->detach();
+ }
+
public function stream_stat()
{
static $modeMap = [
'r' => 33060,
+ 'rb' => 33060,
'r+' => 33206,
- 'w' => 33188
+ 'w' => 33188,
+ 'wb' => 33188
];
return [
@@ -118,4 +139,23 @@ class StreamWrapper
'blocks' => 0
];
}
+
+ public function url_stat($path, $flags)
+ {
+ return [
+ 'dev' => 0,
+ 'ino' => 0,
+ 'mode' => 0,
+ 'nlink' => 0,
+ 'uid' => 0,
+ 'gid' => 0,
+ 'rdev' => 0,
+ 'size' => 0,
+ 'atime' => 0,
+ 'mtime' => 0,
+ 'ctime' => 0,
+ 'blksize' => 0,
+ 'blocks' => 0
+ ];
+ }
}
diff --git a/vendor/guzzlehttp/psr7/src/Uri.php b/vendor/guzzlehttp/psr7/src/Uri.php
index f46c1db9..36219568 100644
--- a/vendor/guzzlehttp/psr7/src/Uri.php
+++ b/vendor/guzzlehttp/psr7/src/Uri.php
@@ -301,15 +301,7 @@ class Uri implements UriInterface
*/
public static function withoutQueryValue(UriInterface $uri, $key)
{
- $current = $uri->getQuery();
- if ($current === '') {
- return $uri;
- }
-
- $decodedKey = rawurldecode($key);
- $result = array_filter(explode('&', $current), function ($part) use ($decodedKey) {
- return rawurldecode(explode('=', $part)[0]) !== $decodedKey;
- });
+ $result = self::getFilteredQueryString($uri, [$key]);
return $uri->withQuery(implode('&', $result));
}
@@ -331,26 +323,29 @@ class Uri implements UriInterface
*/
public static function withQueryValue(UriInterface $uri, $key, $value)
{
- $current = $uri->getQuery();
+ $result = self::getFilteredQueryString($uri, [$key]);
- if ($current === '') {
- $result = [];
- } else {
- $decodedKey = rawurldecode($key);
- $result = array_filter(explode('&', $current), function ($part) use ($decodedKey) {
- return rawurldecode(explode('=', $part)[0]) !== $decodedKey;
- });
- }
+ $result[] = self::generateQueryString($key, $value);
- // Query string separators ("=", "&") within the key or value need to be encoded
- // (while preventing double-encoding) before setting the query string. All other
- // chars that need percent-encoding will be encoded by withQuery().
- $key = strtr($key, self::$replaceQuery);
+ return $uri->withQuery(implode('&', $result));
+ }
- if ($value !== null) {
- $result[] = $key . '=' . strtr($value, self::$replaceQuery);
- } else {
- $result[] = $key;
+ /**
+ * Creates a new URI with multiple specific query string values.
+ *
+ * It has the same behavior as withQueryValue() but for an associative array of key => value.
+ *
+ * @param UriInterface $uri URI to use as a base.
+ * @param array $keyValueArray Associative array of key and values
+ *
+ * @return UriInterface
+ */
+ public static function withQueryValues(UriInterface $uri, array $keyValueArray)
+ {
+ $result = self::getFilteredQueryString($uri, array_keys($keyValueArray));
+
+ foreach ($keyValueArray as $key => $value) {
+ $result[] = self::generateQueryString($key, $value);
}
return $uri->withQuery(implode('&', $result));
@@ -620,6 +615,47 @@ class Uri implements UriInterface
return $port;
}
+ /**
+ * @param UriInterface $uri
+ * @param array $keys
+ *
+ * @return array
+ */
+ private static function getFilteredQueryString(UriInterface $uri, array $keys)
+ {
+ $current = $uri->getQuery();
+
+ if ($current === '') {
+ return [];
+ }
+
+ $decodedKeys = array_map('rawurldecode', $keys);
+
+ return array_filter(explode('&', $current), function ($part) use ($decodedKeys) {
+ return !in_array(rawurldecode(explode('=', $part)[0]), $decodedKeys, true);
+ });
+ }
+
+ /**
+ * @param string $key
+ * @param string|null $value
+ *
+ * @return string
+ */
+ private static function generateQueryString($key, $value)
+ {
+ // Query string separators ("=", "&") within the key or value need to be encoded
+ // (while preventing double-encoding) before setting the query string. All other
+ // chars that need percent-encoding will be encoded by withQuery().
+ $queryString = strtr($key, self::$replaceQuery);
+
+ if ($value !== null) {
+ $queryString .= '=' . strtr($value, self::$replaceQuery);
+ }
+
+ return $queryString;
+ }
+
private function removeDefaultPort()
{
if ($this->port !== null && self::isDefaultPort($this)) {
diff --git a/vendor/guzzlehttp/psr7/src/functions.php b/vendor/guzzlehttp/psr7/src/functions.php
index e40348d6..a0cb8ccc 100644
--- a/vendor/guzzlehttp/psr7/src/functions.php
+++ b/vendor/guzzlehttp/psr7/src/functions.php
@@ -69,10 +69,10 @@ function uri_for($uri)
* - metadata: Array of custom metadata.
* - size: Size of the stream.
*
- * @param resource|string|null|int|float|bool|StreamInterface|callable $resource Entity body data
- * @param array $options Additional options
+ * @param resource|string|null|int|float|bool|StreamInterface|callable|\Iterator $resource Entity body data
+ * @param array $options Additional options
*
- * @return Stream
+ * @return StreamInterface
* @throws \InvalidArgumentException if the $resource arg is not valid.
*/
function stream_for($resource = '', array $options = [])
@@ -238,7 +238,7 @@ function modify_request(RequestInterface $request, array $changes)
}
if ($request instanceof ServerRequestInterface) {
- return new ServerRequest(
+ return (new ServerRequest(
isset($changes['method']) ? $changes['method'] : $request->getMethod(),
$uri,
$headers,
@@ -247,7 +247,11 @@ function modify_request(RequestInterface $request, array $changes)
? $changes['version']
: $request->getProtocolVersion(),
$request->getServerParams()
- );
+ ))
+ ->withParsedBody($request->getParsedBody())
+ ->withQueryParams($request->getQueryParams())
+ ->withCookieParams($request->getCookieParams())
+ ->withUploadedFiles($request->getUploadedFiles());
}
return new Request(
@@ -431,7 +435,7 @@ function hash(
* @param StreamInterface $stream Stream to read from
* @param int $maxLength Maximum buffer length
*
- * @return string|bool
+ * @return string
*/
function readline(StreamInterface $stream, $maxLength = null)
{
@@ -495,7 +499,7 @@ function parse_response($message)
// between status-code and reason-phrase is required. But browsers accept
// responses without space and reason as well.
if (!preg_match('/^HTTP\/.* [0-9]{3}( .*|$)/', $data['start-line'])) {
- throw new \InvalidArgumentException('Invalid response string');
+ throw new \InvalidArgumentException('Invalid response string: ' . $data['start-line']);
}
$parts = explode(' ', $data['start-line'], 3);
@@ -516,8 +520,8 @@ function parse_response($message)
* PHP style arrays into an associative array (e.g., foo[a]=1&foo[b]=2 will
* be parsed into ['foo[a]' => '1', 'foo[b]' => '2']).
*
- * @param string $str Query string to parse
- * @param bool|string $urlEncoding How the query string is encoded
+ * @param string $str Query string to parse
+ * @param int|bool $urlEncoding How the query string is encoded
*
* @return array
*/
@@ -533,9 +537,9 @@ function parse_query($str, $urlEncoding = true)
$decoder = function ($value) {
return rawurldecode(str_replace('+', ' ', $value));
};
- } elseif ($urlEncoding == PHP_QUERY_RFC3986) {
+ } elseif ($urlEncoding === PHP_QUERY_RFC3986) {
$decoder = 'rawurldecode';
- } elseif ($urlEncoding == PHP_QUERY_RFC1738) {
+ } elseif ($urlEncoding === PHP_QUERY_RFC1738) {
$decoder = 'urldecode';
} else {
$decoder = function ($str) { return $str; };
@@ -633,6 +637,7 @@ function mimetype_from_filename($filename)
function mimetype_from_extension($extension)
{
static $mimetypes = [
+ '3gp' => 'video/3gpp',
'7z' => 'application/x-7z-compressed',
'aac' => 'audio/x-aac',
'ai' => 'application/postscript',
@@ -680,6 +685,7 @@ function mimetype_from_extension($extension)
'mid' => 'audio/midi',
'midi' => 'audio/midi',
'mov' => 'video/quicktime',
+ 'mkv' => 'video/x-matroska',
'mp3' => 'audio/mpeg',
'mp4' => 'video/mp4',
'mp4a' => 'audio/mp4',
@@ -758,29 +764,53 @@ function _parse_message($message)
throw new \InvalidArgumentException('Invalid message');
}
- // Iterate over each line in the message, accounting for line endings
- $lines = preg_split('/(\\r?\\n)/', $message, -1, PREG_SPLIT_DELIM_CAPTURE);
- $result = ['start-line' => array_shift($lines), 'headers' => [], 'body' => ''];
- array_shift($lines);
+ $message = ltrim($message, "\r\n");
- for ($i = 0, $totalLines = count($lines); $i < $totalLines; $i += 2) {
- $line = $lines[$i];
- // If two line breaks were encountered, then this is the end of body
- if (empty($line)) {
- if ($i < $totalLines - 1) {
- $result['body'] = implode('', array_slice($lines, $i + 2));
- }
- break;
- }
- if (strpos($line, ':')) {
- $parts = explode(':', $line, 2);
- $key = trim($parts[0]);
- $value = isset($parts[1]) ? trim($parts[1]) : '';
- $result['headers'][$key][] = $value;
- }
+ $messageParts = preg_split("/\r?\n\r?\n/", $message, 2);
+
+ if ($messageParts === false || count($messageParts) !== 2) {
+ throw new \InvalidArgumentException('Invalid message: Missing header delimiter');
}
- return $result;
+ list($rawHeaders, $body) = $messageParts;
+ $rawHeaders .= "\r\n"; // Put back the delimiter we split previously
+ $headerParts = preg_split("/\r?\n/", $rawHeaders, 2);
+
+ if ($headerParts === false || count($headerParts) !== 2) {
+ throw new \InvalidArgumentException('Invalid message: Missing status line');
+ }
+
+ list($startLine, $rawHeaders) = $headerParts;
+
+ if (preg_match("/(?:^HTTP\/|^[A-Z]+ \S+ HTTP\/)(\d+(?:\.\d+)?)/i", $startLine, $matches) && $matches[1] === '1.0') {
+ // Header folding is deprecated for HTTP/1.1, but allowed in HTTP/1.0
+ $rawHeaders = preg_replace(Rfc7230::HEADER_FOLD_REGEX, ' ', $rawHeaders);
+ }
+
+ /** @var array[] $headerLines */
+ $count = preg_match_all(Rfc7230::HEADER_REGEX, $rawHeaders, $headerLines, PREG_SET_ORDER);
+
+ // If these aren't the same, then one line didn't match and there's an invalid header.
+ if ($count !== substr_count($rawHeaders, "\n")) {
+ // Folding is deprecated, see https://tools.ietf.org/html/rfc7230#section-3.2.4
+ if (preg_match(Rfc7230::HEADER_FOLD_REGEX, $rawHeaders)) {
+ throw new \InvalidArgumentException('Invalid header syntax: Obsolete line folding');
+ }
+
+ throw new \InvalidArgumentException('Invalid header syntax');
+ }
+
+ $headers = [];
+
+ foreach ($headerLines as $headerLine) {
+ $headers[$headerLine[1]][] = $headerLine[2];
+ }
+
+ return [
+ 'start-line' => $startLine,
+ 'headers' => $headers,
+ 'body' => $body,
+ ];
}
/**
@@ -809,6 +839,41 @@ function _parse_request_uri($path, array $headers)
return $scheme . '://' . $host . '/' . ltrim($path, '/');
}
+/**
+ * Get a short summary of the message body
+ *
+ * Will return `null` if the response is not printable.
+ *
+ * @param MessageInterface $message The message to get the body summary
+ * @param int $truncateAt The maximum allowed size of the summary
+ *
+ * @return null|string
+ */
+function get_message_body_summary(MessageInterface $message, $truncateAt = 120)
+{
+ $body = $message->getBody();
+
+ if (!$body->isSeekable()) {
+ return null;
+ }
+
+ $size = $body->getSize();
+ $summary = $body->read($truncateAt);
+ $body->rewind();
+
+ if ($size > $truncateAt) {
+ $summary .= ' (truncated...)';
+ }
+
+ // Matches any printable character, including unicode characters:
+ // letters, marks, numbers, punctuation, spacing, and separators.
+ if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/', $summary)) {
+ return null;
+ }
+
+ return $summary;
+}
+
/** @internal */
function _caseless_remove($keys, array $data)
{
diff --git a/vendor/qiniu/php-sdk/src/Qiniu/Storage/ArgusManager.php b/vendor/qiniu/php-sdk/src/Qiniu/Storage/ArgusManager.php
new file mode 100644
index 00000000..08893708
--- /dev/null
+++ b/vendor/qiniu/php-sdk/src/Qiniu/Storage/ArgusManager.php
@@ -0,0 +1,73 @@
+auth = $auth;
+ if ($config == null) {
+ $this->config = new Config();
+ } else {
+ $this->config = $config;
+ }
+ }
+
+ /**
+ * 视频鉴黄
+ *
+ * @param $body body信息
+ * @param $vid videoID
+ *
+ * @return mixed 成功返回NULL,失败返回对象Qiniu\Http\Error
+ * @link https://developer.qiniu.com/dora/manual/4258/video-pulp
+ */
+ public function pulpVideo($body, $vid)
+ {
+ $path = '/v1/video/' . $vid;
+
+ return $this->arPost($path, $body);
+ }
+
+ private function getArHost()
+ {
+ $scheme = "http://";
+ if ($this->config->useHTTPS == true) {
+ $scheme = "https://";
+ }
+ return $scheme . Config::ARGUS_HOST;
+ }
+
+ private function arPost($path, $body = null)
+ {
+ $url = $this->getArHost() . $path;
+ return $this->post($url, $body);
+ }
+
+ private function post($url, $body)
+ {
+ $headers = $this->auth->authorizationV2($url, 'POST', $body, 'application/json');
+ $headers['Content-Type']='application/json';
+ $ret = Client::post($url, $body, $headers);
+ if (!$ret->ok()) {
+ print($ret->statusCode);
+ return array(null, new Error($url, $ret));
+ }
+ $r = ($ret->body === null) ? array() : $ret->json();
+ return array($r, null);
+ }
+}
diff --git a/vendor/ralouphie/getallheaders/.gitignore b/vendor/ralouphie/getallheaders/.gitignore
new file mode 100644
index 00000000..1324e7d3
--- /dev/null
+++ b/vendor/ralouphie/getallheaders/.gitignore
@@ -0,0 +1,5 @@
+.idea
+.DS_store
+/vendor/
+composer.phar
+composer.lock
diff --git a/vendor/ralouphie/getallheaders/.travis.yml b/vendor/ralouphie/getallheaders/.travis.yml
new file mode 100644
index 00000000..f45b55fa
--- /dev/null
+++ b/vendor/ralouphie/getallheaders/.travis.yml
@@ -0,0 +1,18 @@
+language: php
+
+php:
+ - 5.3
+ - 5.4
+ - 5.5
+ - 5.6
+ - 7.0
+
+before_script:
+ - composer install
+
+script:
+ - mkdir -p build/logs
+ - php vendor/bin/phpunit -c phpunit.xml
+
+after_script:
+ - php vendor/bin/coveralls -v
\ No newline at end of file
diff --git a/vendor/ralouphie/getallheaders/LICENSE b/vendor/ralouphie/getallheaders/LICENSE
new file mode 100644
index 00000000..be5540c2
--- /dev/null
+++ b/vendor/ralouphie/getallheaders/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Ralph Khattar
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/ralouphie/getallheaders/README.md b/vendor/ralouphie/getallheaders/README.md
new file mode 100644
index 00000000..f3329d66
--- /dev/null
+++ b/vendor/ralouphie/getallheaders/README.md
@@ -0,0 +1,19 @@
+getallheaders
+=============
+
+PHP `getallheaders()` polyfill. Compatible with PHP >= 5.3.
+
+[](https://travis-ci.org/ralouphie/getallheaders)
+[](https://coveralls.io/r/ralouphie/getallheaders?branch=master)
+[](https://packagist.org/packages/ralouphie/getallheaders)
+[](https://packagist.org/packages/ralouphie/getallheaders)
+[](https://packagist.org/packages/ralouphie/getallheaders)
+
+
+This is a simple polyfill for [`getallheaders()`](http://www.php.net/manual/en/function.getallheaders.php).
+
+## Install
+
+```
+composer require ralouphie/getallheaders
+```
diff --git a/vendor/ralouphie/getallheaders/composer.json b/vendor/ralouphie/getallheaders/composer.json
new file mode 100644
index 00000000..5a0d595c
--- /dev/null
+++ b/vendor/ralouphie/getallheaders/composer.json
@@ -0,0 +1,21 @@
+{
+ "name": "ralouphie/getallheaders",
+ "description": "A polyfill for getallheaders.",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "require": {
+ "php": ">=5.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~3.7.0",
+ "satooshi/php-coveralls": ">=1.0"
+ },
+ "autoload": {
+ "files": ["src/getallheaders.php"]
+ }
+}
\ No newline at end of file
diff --git a/vendor/ralouphie/getallheaders/phpunit.xml b/vendor/ralouphie/getallheaders/phpunit.xml
new file mode 100644
index 00000000..7255b23d
--- /dev/null
+++ b/vendor/ralouphie/getallheaders/phpunit.xml
@@ -0,0 +1,22 @@
+
+
+
+ ./tests
+
+
+
+
+ src
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vendor/ralouphie/getallheaders/src/getallheaders.php b/vendor/ralouphie/getallheaders/src/getallheaders.php
new file mode 100644
index 00000000..c7285a5b
--- /dev/null
+++ b/vendor/ralouphie/getallheaders/src/getallheaders.php
@@ -0,0 +1,46 @@
+ 'Content-Type',
+ 'CONTENT_LENGTH' => 'Content-Length',
+ 'CONTENT_MD5' => 'Content-Md5',
+ );
+
+ foreach ($_SERVER as $key => $value) {
+ if (substr($key, 0, 5) === 'HTTP_') {
+ $key = substr($key, 5);
+ if (!isset($copy_server[$key]) || !isset($_SERVER[$key])) {
+ $key = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $key))));
+ $headers[$key] = $value;
+ }
+ } elseif (isset($copy_server[$key])) {
+ $headers[$copy_server[$key]] = $value;
+ }
+ }
+
+ if (!isset($headers['Authorization'])) {
+ if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) {
+ $headers['Authorization'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];
+ } elseif (isset($_SERVER['PHP_AUTH_USER'])) {
+ $basic_pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : '';
+ $headers['Authorization'] = 'Basic ' . base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $basic_pass);
+ } elseif (isset($_SERVER['PHP_AUTH_DIGEST'])) {
+ $headers['Authorization'] = $_SERVER['PHP_AUTH_DIGEST'];
+ }
+ }
+
+ return $headers;
+ }
+
+}
diff --git a/vendor/ralouphie/getallheaders/tests/GetAllHeadersTest.php b/vendor/ralouphie/getallheaders/tests/GetAllHeadersTest.php
new file mode 100644
index 00000000..8e3d1790
--- /dev/null
+++ b/vendor/ralouphie/getallheaders/tests/GetAllHeadersTest.php
@@ -0,0 +1,121 @@
+ $val) {
+ $_SERVER[$key] = $val;
+ }
+ $result = getallheaders();
+ $this->assertEquals($expected, $result, "Error testing $test_type works.");
+ }
+
+ public function testWorksData()
+ {
+ return array(
+ array(
+ 'normal case',
+ array(
+ 'Key-One' => 'foo',
+ 'Key-Two' => 'bar',
+ 'Another-Key-For-Testing' => 'baz'
+ ),
+ array(
+ 'HTTP_KEY_ONE' => 'foo',
+ 'HTTP_KEY_TWO' => 'bar',
+ 'HTTP_ANOTHER_KEY_FOR_TESTING' => 'baz'
+ )
+ ),
+ array(
+ 'Content-Type',
+ array(
+ 'Content-Type' => 'two'
+ ),
+ array(
+ 'HTTP_CONTENT_TYPE' => 'one',
+ 'CONTENT_TYPE' => 'two'
+ )
+ ),
+ array(
+ 'Content-Length',
+ array(
+ 'Content-Length' => '222'
+ ),
+ array(
+ 'CONTENT_LENGTH' => '222',
+ 'HTTP_CONTENT_LENGTH' => '111'
+ )
+ ),
+ array(
+ 'Content-Length (HTTP_CONTENT_LENGTH only)',
+ array(
+ 'Content-Length' => '111'
+ ),
+ array(
+ 'HTTP_CONTENT_LENGTH' => '111'
+ )
+ ),
+ array(
+ 'Content-MD5',
+ array(
+ 'Content-Md5' => 'aef123'
+ ),
+ array(
+ 'CONTENT_MD5' => 'aef123',
+ 'HTTP_CONTENT_MD5' => 'fea321'
+ )
+ ),
+ array(
+ 'Content-MD5 (HTTP_CONTENT_MD5 only)',
+ array(
+ 'Content-Md5' => 'f123'
+ ),
+ array(
+ 'HTTP_CONTENT_MD5' => 'f123'
+ )
+ ),
+ array(
+ 'Authorization (normal)',
+ array(
+ 'Authorization' => 'testing'
+ ),
+ array(
+ 'HTTP_AUTHORIZATION' => 'testing',
+ )
+ ),
+ array(
+ 'Authorization (redirect)',
+ array(
+ 'Authorization' => 'testing redirect'
+ ),
+ array(
+ 'REDIRECT_HTTP_AUTHORIZATION' => 'testing redirect',
+ )
+ ),
+ array(
+ 'Authorization (PHP_AUTH_USER + PHP_AUTH_PW)',
+ array(
+ 'Authorization' => 'Basic ' . base64_encode('foo:bar')
+ ),
+ array(
+ 'PHP_AUTH_USER' => 'foo',
+ 'PHP_AUTH_PW' => 'bar'
+ )
+ ),
+ array(
+ 'Authorization (PHP_AUTH_DIGEST)',
+ array(
+ 'Authorization' => 'example-digest'
+ ),
+ array(
+ 'PHP_AUTH_DIGEST' => 'example-digest'
+ )
+ )
+ );
+ }
+}
|