PageRenderTime 13ms CodeModel.GetById 1ms app.highlight 8ms RepoModel.GetById 1ms app.codeStats 0ms

/wp-includes/Requests/Cookie/Jar.php

https://bitbucket.org/skyarch-iijima/wordpress
PHP | 175 lines | 68 code | 20 blank | 87 comment | 8 complexity | e9300c5fb1f52670a0b52234d95c9510 MD5 | raw file
  1<?php
  2/**
  3 * Cookie holder object
  4 *
  5 * @package Requests
  6 * @subpackage Cookies
  7 */
  8
  9/**
 10 * Cookie holder object
 11 *
 12 * @package Requests
 13 * @subpackage Cookies
 14 */
 15class Requests_Cookie_Jar implements ArrayAccess, IteratorAggregate {
 16	/**
 17	 * Actual item data
 18	 *
 19	 * @var array
 20	 */
 21	protected $cookies = array();
 22
 23	/**
 24	 * Create a new jar
 25	 *
 26	 * @param array $cookies Existing cookie values
 27	 */
 28	public function __construct($cookies = array()) {
 29		$this->cookies = $cookies;
 30	}
 31
 32	/**
 33	 * Normalise cookie data into a Requests_Cookie
 34	 *
 35	 * @param string|Requests_Cookie $cookie
 36	 * @return Requests_Cookie
 37	 */
 38	public function normalize_cookie($cookie, $key = null) {
 39		if ($cookie instanceof Requests_Cookie) {
 40			return $cookie;
 41		}
 42
 43		return Requests_Cookie::parse($cookie, $key);
 44	}
 45
 46	/**
 47	 * Normalise cookie data into a Requests_Cookie
 48	 *
 49	 * @codeCoverageIgnore
 50	 * @deprecated Use {@see Requests_Cookie_Jar::normalize_cookie}
 51	 * @return Requests_Cookie
 52	 */
 53	public function normalizeCookie($cookie, $key = null) {
 54		return $this->normalize_cookie($cookie, $key);
 55	}
 56
 57	/**
 58	 * Check if the given item exists
 59	 *
 60	 * @param string $key Item key
 61	 * @return boolean Does the item exist?
 62	 */
 63	public function offsetExists($key) {
 64		return isset($this->cookies[$key]);
 65	}
 66
 67	/**
 68	 * Get the value for the item
 69	 *
 70	 * @param string $key Item key
 71	 * @return string Item value
 72	 */
 73	public function offsetGet($key) {
 74		if (!isset($this->cookies[$key])) {
 75			return null;
 76		}
 77
 78		return $this->cookies[$key];
 79	}
 80
 81	/**
 82	 * Set the given item
 83	 *
 84	 * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`)
 85	 *
 86	 * @param string $key Item name
 87	 * @param string $value Item value
 88	 */
 89	public function offsetSet($key, $value) {
 90		if ($key === null) {
 91			throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset');
 92		}
 93
 94		$this->cookies[$key] = $value;
 95	}
 96
 97	/**
 98	 * Unset the given header
 99	 *
100	 * @param string $key
101	 */
102	public function offsetUnset($key) {
103		unset($this->cookies[$key]);
104	}
105
106	/**
107	 * Get an iterator for the data
108	 *
109	 * @return ArrayIterator
110	 */
111	public function getIterator() {
112		return new ArrayIterator($this->cookies);
113	}
114
115	/**
116	 * Register the cookie handler with the request's hooking system
117	 *
118	 * @param Requests_Hooker $hooks Hooking system
119	 */
120	public function register(Requests_Hooker $hooks) {
121		$hooks->register('requests.before_request', array($this, 'before_request'));
122		$hooks->register('requests.before_redirect_check', array($this, 'before_redirect_check'));
123	}
124
125	/**
126	 * Add Cookie header to a request if we have any
127	 *
128	 * As per RFC 6265, cookies are separated by '; '
129	 *
130	 * @param string $url
131	 * @param array $headers
132	 * @param array $data
133	 * @param string $type
134	 * @param array $options
135	 */
136	public function before_request($url, &$headers, &$data, &$type, &$options) {
137		if (!$url instanceof Requests_IRI) {
138			$url = new Requests_IRI($url);
139		}
140
141		if (!empty($this->cookies)) {
142			$cookies = array();
143			foreach ($this->cookies as $key => $cookie) {
144				$cookie = $this->normalize_cookie($cookie, $key);
145
146				// Skip expired cookies
147				if ($cookie->is_expired()) {
148					continue;
149				}
150
151				if ($cookie->domain_matches($url->host)) {
152					$cookies[] = $cookie->format_for_header();
153				}
154			}
155
156			$headers['Cookie'] = implode('; ', $cookies);
157		}
158	}
159
160	/**
161	 * Parse all cookies from a response and attach them to the response
162	 *
163	 * @var Requests_Response $response
164	 */
165	public function before_redirect_check(Requests_Response &$return) {
166		$url = $return->url;
167		if (!$url instanceof Requests_IRI) {
168			$url = new Requests_IRI($url);
169		}
170
171		$cookies = Requests_Cookie::parse_from_headers($return->headers, $url);
172		$this->cookies = array_merge($this->cookies, $cookies);
173		$return->cookies = $this;
174	}
175}