PHP получает куки из строки заголовка - PullRequest
3 голосов
/ 13 сентября 2011

У меня есть строковая переменная, содержащая ответ заголовка. как это

Эта строка захватывается отправкой запроса через fsockopen() и извлечением заголовка с помощью

$nn= "\r\n";
    do {
        $header .= fgets ( $fp, 16384 );
    } while ( strpos ( $header, $nn . $nn ) === false );

Выход:

$header = "HTTP/1.0 200 OK Date: Tue, 13 Sep 2011 07:57:08 GMT Last-Modified: Tue, 13 Sep 2011 07:57:08 GMT 
Set-Cookie: EUID=face313a-dddd-11e0-a694-00000aab0f6c; 
expires=Mon, 08 Sep 2031 07:57:08 GMT; 
path=/; 
domain=.mysite.com; 
Set-Cookie: MIAMISESSION=face28e8-dddd-11e0-a694-00000aab0f6c:3493353428; 
path=/; 
domain=.mysite.com; 
Set-Cookie: USER_STATE_COOKIE=664d9ed4a110fa1deb0dc4cc2d7e76fa00a75a0b5c9b3fa8; 
path=/; 
domain=.mysite.com; 
Set-Cookie: MIAMIAUTH=f8d13d07cc4e8b0ef9904f5ce40367ce44c989661956ef1cd2804726b0dd5508db661a8f9582df19bc954c57d0f2c293760e4d5ddda88d556dbcfae8dd80a14c8378a2374eb5aeb636e8c4ca7849e48792f5588ad73b3d79ce55afb95660b5052d349082e88b29653d3df674e0fd328f75ad0edb5b63a434c0b7ce44b5c338a0676d6d6648b12e8e7f9570cf24b3ef7b5dfe647f2f36a62114ae5ef23b0a3f6ad15cabba99bf945243553a5329457337884d5671141f6cc438302813801fe2527ad29c1c4e76aedacded581bea2a1b6158b7d8ec3b09e2e6c9a87495f9e6d33188bdc5074d10564d30494e1b1f6af58ab96d11dd4817a0fc17619853792c8785; 
path=/; 
domain=.mysite.com; 
HttpOnly; 
Set-Cookie: SY_REMOTEACCESS=;
Content-Type: text/html Expires: Tue, 01 Jan 1980 04:00:00 GMT X-RE-Ref: 0 -77259901 X-Cache: MISS from 192.168.1.1 X-Cache-Lookup: MISS from 192.168.1.1 Via: 1.0 192.168.1.1 (squid) Connection: close";
";

теперь я хочу получить все куки в массив

$cookie[1] = "EUID=face313a-dddd-11e0-a694-00000aab0f6c";
$cookie[2] = "MIAMISESSION=face28e8-dddd-11e0-a694-00000aab0f6c:3493353428";
...

как я могу это сделать? Это задание регулярного выражения или есть класс или функция, чтобы сделать это проще?

Ответы [ 4 ]

2 голосов
/ 27 марта 2016

Еще один способ сделать это:

    $headerCookies = explode('; ', getallheaders()['Cookie']);
    $cookies = array();
    foreach($headerCookies as $itm) {
        list($key, $val) = explode('=', $itm,2);
        $cookies[$key] = $val;
    }

    print_r($cookies); // assoc array of all cookies
1 голос
/ 24 июля 2013

Я использовал следующий код:

$domain = "www.google.com";

// open the socket
$f = @stream_socket_client($domain . ":80", $err, $errstr, 30, STREAM_CLIENT_CONNECT);

if(!$f)
  die("Error: " . $err . $errstr);

// prepare the HTTP request headers
$request_headers  = "GET / HTTP/1.1" . "\r\n";
$request_headers .= "Host: " . $domain . "\r\n";
$request_headers .= "Connection: close" . "\r\n";
$request_headers .= "\r\n";

// send the HTTP request
fputs ($f, $request_headers);

// read everything from the socket
$buf = "";
while (!feof($f)) {
  $buf .= fgets ($f, 8192);
}

// close the socket
fclose($f);

// split the headers and the body
$response = preg_split("|(?:\r?\n){2}|m", $buf, 2);
if(!isset($response[1]))
  $response[1] = "";

$headers = array();
$content = $response[1];

$out = preg_split("|(?:\r?\n){1}|m", $response[0]);
foreach($out as $line){
  @list($key, $val) = explode(": ", $line, 2);
  if ($val != null) {
    if(!array_key_exists(strtolower($key), $headers))
      $headers[strtolower($key)] = strtolower(trim($val));
  } else 
    $headers[] = $key;
}

// now you have the response headers in an array
print_r($headers);

Далее нужно получить каждый файл cookie, сохраненный в виде строкового значения, и проанализировать его. Для этого я использовал функцию, скопированную из Zend Framework fromString () : http://www.sourcexref.com/xref/moodle/nav.html?lib/zend/Zend/Http/Cookie.php.source.html#l274.

Удачи.

PS Эта строка $ headers [strtolower ($ key)] = strtolower (trim ($ val)); переопределит значение параметра заголовка, если эта команда была дважды отправлена ​​сервером.

Т.е .:

...
Connection: close
Expires: -1
Connection: close
Cache-control: private, max-age=0
...
1 голос
/ 13 сентября 2011

Использование http_parse_headers() функция

0 голосов
/ 29 ноября 2015

Еще один короткий путь:

if(preg_match_all('/Set-Cookie:[\s]([^;]+)/', $header, $matches)){
    $cookies = $matches[1];
}

это даст вам именно то, что вы хотели

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...