Blame view

sources/3rdparty/guzzle/parser/Guzzle/Parser/Cookie/CookieParser.php 2.98 KB
6d9380f96   Cédric Dupont   Update sources OC...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
  <?php
  
  namespace Guzzle\Parser\Cookie;
  
  /**
   * Default Guzzle implementation of a Cookie parser
   */
  class CookieParser implements CookieParserInterface
  {
      /** @var array Cookie part names to snake_case array values */
      protected static $cookieParts = array(
          'domain'      => 'Domain',
          'path'        => 'Path',
          'max_age'     => 'Max-Age',
          'expires'     => 'Expires',
          'version'     => 'Version',
          'secure'      => 'Secure',
          'port'        => 'Port',
          'discard'     => 'Discard',
          'comment'     => 'Comment',
          'comment_url' => 'Comment-Url',
          'http_only'   => 'HttpOnly'
      );
  
      public function parseCookie($cookie, $host = null, $path = null, $decode = false)
      {
          // Explode the cookie string using a series of semicolons
          $pieces = array_filter(array_map('trim', explode(';', $cookie)));
  
          // The name of the cookie (first kvp) must include an equal sign.
          if (empty($pieces) || !strpos($pieces[0], '=')) {
              return false;
          }
  
          // Create the default return array
          $data = array_merge(array_fill_keys(array_keys(self::$cookieParts), null), array(
              'cookies'   => array(),
              'data'      => array(),
              'path'      => $path ?: '/',
              'http_only' => false,
              'discard'   => false,
              'domain'    => $host
          ));
          $foundNonCookies = 0;
  
          // Add the cookie pieces into the parsed data array
          foreach ($pieces as $part) {
  
              $cookieParts = explode('=', $part, 2);
              $key = trim($cookieParts[0]);
  
              if (count($cookieParts) == 1) {
                  // Can be a single value (e.g. secure, httpOnly)
                  $value = true;
              } else {
                  // Be sure to strip wrapping quotes
                  $value = trim($cookieParts[1], " 
  \r\t\0\x0B\"");
                  if ($decode) {
                      $value = urldecode($value);
                  }
              }
  
              // Only check for non-cookies when cookies have been found
              if (!empty($data['cookies'])) {
                  foreach (self::$cookieParts as $mapValue => $search) {
                      if (!strcasecmp($search, $key)) {
                          $data[$mapValue] = $mapValue == 'port' ? array_map('trim', explode(',', $value)) : $value;
                          $foundNonCookies++;
                          continue 2;
                      }
                  }
              }
  
              // If cookies have not yet been retrieved, or this value was not found in the pieces array, treat it as a
              // cookie. IF non-cookies have been parsed, then this isn't a cookie, it's cookie data. Cookies then data.
              $data[$foundNonCookies ? 'data' : 'cookies'][$key] = $value;
          }
  
          // Calculate the expires date
          if (!$data['expires'] && $data['max_age']) {
              $data['expires'] = time() + (int) $data['max_age'];
          }
  
          return $data;
      }
  }