X-Git-Url: https://mop.ddnsfree.com/gitweb/?a=blobdiff_plain;f=web%2FObj%2Fsac-a-push.phh;h=3f5c4c18b7b9d07d7d77b9434557a01709c925ff;hb=5038893a7b944417e7777426f145e2b87f37f4c1;hp=527d9b78d18d109f7671e38edb4ad195029699ab;hpb=31c53d65779a84c86cb833bfe13be8fe3e4dae1d;p=brisk.git diff --git a/web/Obj/sac-a-push.phh b/web/Obj/sac-a-push.phh index 527d9b7..3f5c4c1 100644 --- a/web/Obj/sac-a-push.phh +++ b/web/Obj/sac-a-push.phh @@ -1,5 +1,4 @@ $value) { - $s .= sprintf("%s: %s\r\n", $key, $value); + $cookies = ""; + + if (isset($header['cookies'])) { + $cookies = $header['cookies']->render(); + unset($header['cookies']); } - if ($len >= 0) { - $s .= sprintf("Content-Length: %d\r\n", $len); + if (isset($header['Location'])) { + $s = sprintf("HTTP/1.1 302 OK\r\n%sLocation: %s\r\n", $cookies, $header['Location']); } else { - $s .= "Cache-Control: no-cache, must-revalidate\r\n"; - $s .= "Expires: Mon, 26 Jul 1997 05:00:00 GMT\r\n"; - if (!isset($header['Content-Encoding'])) { - $s .= "Content-Encoding: chunked\r\n"; + $s = "HTTP/1.1 200 OK\r\n"; + + if (!isset($header['Date'])) + $s .= sprintf("Date: %s\r\n", date(DATE_RFC822)); + if (!isset($header['Connection'])) + $s .= "Connection: close\r\n"; + if (!isset($header['Content-Type'])) + $s .= "Content-Type: text/html\r\n"; + foreach($header as $key => $value) { + $s .= sprintf("%s: %s\r\n", $key, $value); } - $s .= "Transfer-Encoding: chunked\r\n"; + if ($len >= 0) { + $s .= sprintf("Content-Length: %d\r\n", $len); + } + else { + $s .= "Cache-Control: no-cache, must-revalidate\r\n"; + $s .= "Expires: Mon, 26 Jul 1997 05:00:00 GMT\r\n"; + if (!isset($header['Content-Encoding'])) { + $s .= "Content-Encoding: chunked\r\n"; + } + $s .= "Transfer-Encoding: chunked\r\n"; + } + $s .= $cookies; } $s .= "\r\n"; @@ -189,6 +195,104 @@ function get_encoding($header) return ($enc); } +class Cookie { + var $attr; + // Set-Cookie: reg_fb_gate=deleted; Expires=Thu, 01-Jan-1970 00:00:01 GMT; Path=/; Domain=.foo.com; HttpOnly + // string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] ) + function Cookie() + { + $this->attr = array(); + } + + static function create($name) + { + $thiz = new Cookie(); + + $thiz->attr[$name] = ""; + + $argc = func_num_args(); + for ($i = 1 ; $i < $argc ; $i++) { + $arg = func_get_arg($i); + switch ($i) { + case 1: + $thiz->attr[$name] = urlencode($arg); + break; + case 2: + $thiz->attr['Expires'] = gmdate('D, d M Y H:i:s \G\M\T', $arg); // RFC 1211 format + break; + case 3: + $thiz->attr['Path'] = $arg; + break; + case 4: + $thiz->attr['Domain'] = $arg; + break; + case 5: + if ($arg == TRUE) { + $thiz->attr['Secure'] = NULL; + } + break; + case 6: + if ($arg == TRUE) { + $thiz->attr['HttpOnly'] = NULL; + } + break; + default: + return FALSE; + } + } + + return $thiz; + } + + function render() + { + $r = "Set-Cookie: "; + $isfirst = TRUE; + + foreach ($this->attr as $k => $v) { + if ($v == NULL) { + $r .= sprintf("%s%s", ($isfirst ? "" : "; "), $k); + } + else { + $r .= sprintf("%s%s=%s", ($isfirst ? "" : "; "), $k, $v); + } + $isfirst = FALSE; + } + $r .= "\r\n"; + + return $r; + } +} + +class Cookies { + var $cookies; + + function Cookies() + { + $this->cookies = array(); + } + + function add($name) + { + if (($cookie = call_user_func_array("Cookie::create", func_get_args())) == FALSE) + return (FALSE); + + array_push($this->cookies, $cookie); + + return (TRUE); + } + + function render() + { + $r = ""; + foreach ($this->cookies as $cookie) { + $r .= $cookie->render(); + } + + return ($r); + } +} + class Sac_a_push { static $fixed_fd = 2; @@ -206,7 +310,6 @@ class Sac_a_push { var $blocking_mode; var $app; - var $bin5; var $curtime; @@ -382,13 +485,11 @@ class Sac_a_push { $addr = stream_socket_get_name($new_socket, TRUE); $header_out = array(); - $enc = get_encoding($header); - $subs = SITE_PREFIX."briskin5/"; $subs_l = strlen($subs); $rret = FALSE; if (!strncmp($path, SITE_PREFIX, SITE_PREFIX_LEN)) { - $rret = $this->app->request_mgr($this, $enc, $header_out, $new_socket, substr($path, SITE_PREFIX_LEN), $addr, $get, $post, $cookie); + $rret = $this->app->request_mgr($this, $header, $header_out, $new_socket, substr($path, SITE_PREFIX_LEN), $addr, $get, $post, $cookie); } if ($rret == FALSE) { // FIXME: manage 404 !!! @@ -444,6 +545,14 @@ class Sac_a_push { if ($line == "reload") { require("$DOCUMENT_ROOT/Etc/".BRISK_CONF); } + else if ($line == "shutdown") { + if ($this->app->dump_data()) { + exit(0); + } + else { + exit(1); + } + } } else { $key = array_search("$sock", $this->socks);