Skip to content

Commit

Permalink
Merge pull request #306 from LuckyCyborg/master
Browse files Browse the repository at this point in the history
Improve the HTTP Sessions management
  • Loading branch information
walkor authored Apr 3, 2018
2 parents 717e8ad + 881d74e commit e3b3e23
Showing 1 changed file with 104 additions and 19 deletions.
123 changes: 104 additions & 19 deletions Protocols/Http.php
Original file line number Diff line number Diff line change
Expand Up @@ -175,21 +175,21 @@ public static function decode($recv_buffer, TcpConnection $connection)
parse_str($http_body, $_POST);
break;
case 'application/json':
$_POST = json_decode($http_body, true);
break;
$_POST = json_decode($http_body, true);
break;
}
}
}
// 解析其他HTTP动作参数

// Parse other HTTP action parameters
if ($_SERVER['REQUEST_METHOD'] != 'GET' && $_SERVER['REQUEST_METHOD'] != "POST") {
$data = array();
if ($_SERVER['HTTP_CONTENT_TYPE'] === "application/x-www-form-urlencoded") {
parse_str($http_body, $data);
} elseif ($_SERVER['HTTP_CONTENT_TYPE'] === "application/json") {
$data = json_decode($http_body, true);
}
$_REQUEST = array_merge($_REQUEST, $data);
$data = array();
if ($_SERVER['HTTP_CONTENT_TYPE'] === "application/x-www-form-urlencoded") {
parse_str($http_body, $data);
} elseif ($_SERVER['HTTP_CONTENT_TYPE'] === "application/json") {
$data = json_decode($http_body, true);
}
$_REQUEST = array_merge($_REQUEST, $data);
}

// HTTP_RAW_REQUEST_DATA HTTP_RAW_POST_DATA
Expand Down Expand Up @@ -344,6 +344,85 @@ public static function setcookie(
. (!$HTTPOnly ? '' : '; HttpOnly'), false);
}

/**
* sessionCreateId
*
* @param string|prefix $prefix
*
* @return string
*/
public static function sessionCreateId($prefix = null)
{
return session_create_id($prefix);
}

/**
* sessionId
*
* @param string $id
*
* @return string|null
*/
public static function sessionId($id = null)
{
if (PHP_SAPI != 'cli') {
return $id ? session_id($id) : session_id();
}
if (static::sessionStarted() && HttpCache::$instance->sessionFile) {
return str_replace('sess_', '', basename(HttpCache::$instance->sessionFile));
}
return '';
}

/**
* sessionName
*
* @param string $name
*
* @return string
*/
public static function sessionName($name = null)
{
if (PHP_SAPI != 'cli') {
return $name ? session_name($name) : session_name();
}
$session_name = HttpCache::$sessionName;
if ($name && ! static::sessionStarted()) {
HttpCache::$sessionName = $name;
}
return $session_name;
}

/**
* sessionSavePath
*
* @param string $path
*
* @return void
*/
public static function sessionSavePath($path = null)
{
if (PHP_SAPI != 'cli') {
return $path ? session_save_path($path) : session_save_path();
}
if ($path && is_dir($path) && is_writable($path) && !static::sessionStarted()) {
HttpCache::$sessionPath = $path;
}
return HttpCache::$sessionPath;
}

/**
* sessionStarted
*
* @return bool
*/
public static function sessionStarted()
{
if (!HttpCache::$instance) return false;

return HttpCache::$instance->sessionStarted;
}

/**
* sessionStart
*
Expand All @@ -363,13 +442,13 @@ public static function sessionStart()
}
HttpCache::$instance->sessionStarted = true;
// Generate a SID.
if (!isset($_COOKIE[HttpCache::$sessionName]) || !is_file(HttpCache::$sessionPath . '/ses' . $_COOKIE[HttpCache::$sessionName])) {
$file_name = tempnam(HttpCache::$sessionPath, 'ses');
if (!$file_name) {
return false;
if (!isset($_COOKIE[HttpCache::$sessionName]) || !is_file(HttpCache::$sessionPath . '/sess_' . $_COOKIE[HttpCache::$sessionName])) {
// Create a unique session_id and the associated file name.
while (true) {
$session_id = static::sessionCreateId();
if (!is_file($file_name = HttpCache::$sessionPath . '/sess_' . $session_id)) break;
}
HttpCache::$instance->sessionFile = $file_name;
$session_id = substr(basename($file_name), strlen('ses'));
return self::setcookie(
HttpCache::$sessionName
, $session_id
Expand All @@ -381,7 +460,7 @@ public static function sessionStart()
);
}
if (!HttpCache::$instance->sessionFile) {
HttpCache::$instance->sessionFile = HttpCache::$sessionPath . '/ses' . $_COOKIE[HttpCache::$sessionName];
HttpCache::$instance->sessionFile = HttpCache::$sessionPath . '/sess_' . $_COOKIE[HttpCache::$sessionName];
}
// Read session from session file.
if (HttpCache::$instance->sessionFile) {
Expand Down Expand Up @@ -579,8 +658,14 @@ class HttpCache

public static function init()
{
self::$sessionName = ini_get('session.name');
self::$sessionPath = @session_save_path();
if (!self::$sessionName) {
self::$sessionName = ini_get('session.name');
}

if (!self::$sessionPath) {
self::$sessionPath = @session_save_path();
}

if (!self::$sessionPath || strpos(self::$sessionPath, 'tcp://') === 0) {
self::$sessionPath = sys_get_temp_dir();
}
Expand Down

0 comments on commit e3b3e23

Please sign in to comment.