/wp-content/plugins/wordfence/vendor/wordfence/wf-waf/src/lib/http.php
PHP | 440 lines | 261 code | 57 blank | 122 comment | 30 complexity | 6b59187f731a80951beb86ecb9b17592 MD5 | raw file
- <?php
- class wfWAFHTTP {
- private $url;
- private $auth;
- private $body;
- private $cookies;
- // private $fileNames;
- // private $files;
- private $headers;
- private $method;
- private $queryString;
- /**
- * @var wfWAFHTTPTransport
- */
- private $transport;
- /**
- * @param string $url
- * @param wfWAFHTTP $request
- * @return wfWAFHTTPResponse|bool
- * @throws wfWAFHTTPTransportException
- */
- public static function get($url, $request = null) {
- if (!$request) {
- $request = new self();
- }
- $request->setUrl($url);
- $request->setMethod('GET');
- $request->setTransport(wfWAFHTTPTransport::getInstance());
- // $request->setCookies("XDEBUG_SESSION=netbeans-xdebug");
- return $request->send();
- }
- /**
- * @param string $url
- * @param array $post
- * @param wfWAFHTTP $request
- * @return wfWAFHTTPResponse|bool
- * @throws wfWAFHTTPTransportException
- */
- public static function post($url, $post = array(), $request = null) {
- if (!$request) {
- $request = new self();
- }
- $request->setUrl($url);
- $request->setMethod('POST');
- $request->setBody($post);
- $request->setTransport(wfWAFHTTPTransport::getInstance());
- return $request->send();
- }
- /**
- * @return wfWAFHTTPResponse|bool
- * @throws wfWAFHTTPTransportException
- */
- public function send() {
- if (!$this->getTransport()) {
- throw new wfWAFHTTPTransportException('Need to provide a valid HTTP transport before calling ' . __METHOD__);
- }
- return $this->getTransport()->send($this);
- }
- /**
- * @return mixed
- */
- public function getUrl() {
- return $this->url;
- }
- /**
- * @param mixed $url
- */
- public function setUrl($url) {
- $this->url = $url;
- }
- /**
- * @return mixed
- */
- public function getAuth() {
- return $this->auth;
- }
- /**
- * @param mixed $auth
- */
- public function setAuth($auth) {
- $this->auth = $auth;
- }
- /**
- * @return mixed
- */
- public function getBody() {
- return $this->body;
- }
- /**
- * @param mixed $body
- */
- public function setBody($body) {
- $this->body = $body;
- }
- /**
- * @return mixed
- */
- public function getCookies() {
- return $this->cookies;
- }
- /**
- * @param mixed $cookies
- */
- public function setCookies($cookies) {
- $this->cookies = $cookies;
- }
- /**
- * @return mixed
- */
- public function getHeaders() {
- return $this->headers;
- }
- /**
- * @param mixed $headers
- */
- public function setHeaders($headers) {
- $this->headers = $headers;
- }
- /**
- * @return mixed
- */
- public function getMethod() {
- return $this->method;
- }
- /**
- * @param mixed $method
- */
- public function setMethod($method) {
- $this->method = $method;
- }
- /**
- * @return mixed
- */
- public function getQueryString() {
- return $this->queryString;
- }
- /**
- * @param mixed $queryString
- */
- public function setQueryString($queryString) {
- $this->queryString = $queryString;
- }
- /**
- * @return wfWAFHTTPTransport
- */
- public function getTransport() {
- return $this->transport;
- }
- /**
- * @param wfWAFHTTPTransport $transport
- */
- public function setTransport($transport) {
- $this->transport = $transport;
- }
- }
- class wfWAFHTTPResponse {
- private $body;
- private $headers;
- private $statusCode;
- /**
- * @return mixed
- */
- public function getBody() {
- return $this->body;
- }
- /**
- * @param mixed $body
- */
- public function setBody($body) {
- $this->body = $body;
- }
- /**
- * @return mixed
- */
- public function getHeaders() {
- return $this->headers;
- }
- /**
- * @param mixed $headers
- */
- public function setHeaders($headers) {
- $this->headers = $headers;
- }
- /**
- * @return mixed
- */
- public function getStatusCode() {
- return $this->statusCode;
- }
- /**
- * @param mixed $statusCode
- */
- public function setStatusCode($statusCode) {
- $this->statusCode = $statusCode;
- }
- }
- abstract class wfWAFHTTPTransport {
- private static $instance;
- /**
- * @return mixed
- */
- public static function getInstance() {
- if (!self::$instance) {
- self::$instance = self::getFirstTransport();
- }
- return self::$instance;
- }
- /**
- * @param mixed $instance
- */
- public static function setInstance($instance) {
- self::$instance = $instance;
- }
- /**
- * @return wfWAFHTTPTransport
- * @throws wfWAFHTTPTransportException
- */
- public static function getFirstTransport() {
- if (function_exists('curl_init')) {
- return new wfWAFHTTPTransportCurl();
- } else if (function_exists('file_get_contents')) {
- return new wfWAFHTTPTransportStreams();
- }
- throw new wfWAFHTTPTransportException('No valid HTTP transport found.');
- }
- /**
- * @param array $cookieArray
- * @return string
- */
- public static function buildCookieString($cookieArray) {
- $cookies = '';
- foreach ($cookieArray as $cookieName => $value) {
- $cookies .= "$cookieName=" . urlencode($value) . '; ';
- }
- $cookies = rtrim($cookies);
- return $cookies;
- }
- /**
- * @param wfWAFHTTP $request
- * @return wfWAFHTTPResponse|bool
- */
- abstract public function send($request);
- }
- class wfWAFHTTPTransportCurl extends wfWAFHTTPTransport {
- /**
- * @todo Proxy settings
- * @param wfWAFHTTP $request
- * @return wfWAFHTTPResponse|bool
- */
- public function send($request) {
- $url = $request->getUrl();
- if ($queryString = $request->getQueryString()) {
- if (is_array($queryString)) {
- $queryString = http_build_query($queryString, null, '&');
- }
- $url .= (wfWAFUtils::strpos($url, '?') !== false ? '&' : '?') . $queryString;
- }
- $ch = curl_init($url);
- switch (wfWAFUtils::strtolower($request->getMethod())) {
- case 'post':
- curl_setopt($ch, CURLOPT_POST, 1);
- break;
- }
- if ($body = $request->getBody()) {
- curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
- }
- if ($auth = $request->getAuth()) {
- curl_setopt($ch, CURLOPT_USERPWD, $auth['user'] . ':' . $auth['password']);
- }
- if ($cookies = $request->getCookies()) {
- if (is_array($cookies)) {
- $cookies = self::buildCookieString($cookies);
- }
- curl_setopt($ch, CURLOPT_COOKIE, $cookies);
- }
- if ($headers = $request->getHeaders()) {
- if (is_array($headers)) {
- $_headers = array();
- foreach ($headers as $header => $value) {
- $_headers[] = $header . ': ' . $value;
- }
- curl_setopt($ch, CURLOPT_HTTPHEADER, $_headers);
- }
- }
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_TIMEOUT, 5);
- curl_setopt($ch, CURLOPT_HEADER, 1);
- curl_setopt($ch, CURLOPT_CAINFO, WFWAF_PATH . 'cacert.pem'); //On some systems curl uses an outdated root certificate chain file
- $curlResponse = curl_exec($ch);
-
- if ($curlResponse !== false) {
- $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
- $header = wfWAFUtils::substr($curlResponse, 0, $headerSize);
- $body = wfWAFUtils::substr($curlResponse, $headerSize);
- $response = new wfWAFHTTPResponse();
- $response->setBody($body);
- $response->setHeaders($header);
- return $response;
- }
- return false;
- }
- }
- class wfWAFHTTPTransportStreams extends wfWAFHTTPTransport {
- /**
- * @todo Implement wfWAFHTTPTransportStreams::send.
- * @param wfWAFHTTP $request
- * @return mixed
- * @throws wfWAFHTTPTransportException
- */
- public function send($request) {
- $timeout = 5;
- $url = $request->getUrl();
- if ($queryString = $request->getQueryString()) {
- if (is_array($queryString)) {
- $queryString = http_build_query($queryString, null, '&');
- }
- $url .= (wfWAFUtils::strpos($url, '?') !== false ? '&' : '?') . $queryString;
- }
- $urlParsed = parse_url($request->getUrl());
- $headers = "Host: $urlParsed[host]\r\n";
- if ($auth = $request->getAuth()) {
- $headers .= 'Authorization: Basic ' . base64_encode($auth['user'] . ':' . $auth['password']) . "\r\n";
- }
- if ($cookies = $request->getCookies()) {
- if (is_array($cookies)) {
- $cookies = self::buildCookieString($cookies);
- }
- $headers .= "Cookie: $cookies\r\n";
- }
- $hasUA = false;
- if ($_headers = $request->getHeaders()) {
- if (is_array($_headers)) {
- foreach ($_headers as $header => $value) {
- if (trim(wfWAFUtils::strtolower($header)) === 'user-agent') {
- $hasUA = true;
- }
- $headers .= $header . ': ' . $value . "\r\n";
- }
- }
- }
- if (!$hasUA) {
- $headers .= "User-Agent: Wordfence Streams UA\r\n";
- }
- $httpOptions = array(
- 'method' => $request->getMethod(),
- 'ignore_errors' => true,
- 'timeout' => $timeout,
- 'follow_location' => 1,
- 'max_redirects' => 5,
- );
- if (wfWAFUtils::strlen($request->getBody()) > 0) {
- $httpOptions['content'] = $request->getBody();
- $headers .= 'Content-Length: ' . wfWAFUtils::strlen($httpOptions['content']) . "\r\n";
- }
- $httpOptions['header'] = $headers;
- $options = array(
- wfWAFUtils::strtolower($urlParsed['scheme']) => $httpOptions,
- );
- $context = stream_context_create($options);
- $stream = fopen($request->getUrl(), 'r', false, $context);
- if (!is_resource($stream)) {
- return false;
- }
- $metaData = stream_get_meta_data($stream);
- // Get the HTTP response code
- $httpResponse = array_shift($metaData['wrapper_data']);
- if (preg_match_all('/(\w+\/\d\.\d) (\d{3})/', $httpResponse, $matches) !== false) {
- // $protocol = $matches[1][0];
- $status = (int) $matches[2][0];
- } else {
- // $protocol = null;
- $status = null;
- }
- $responseObj = new wfWAFHTTPResponse();
- $responseObj->setHeaders(join("\r\n", $metaData['wrapper_data']));
- $responseObj->setBody(stream_get_contents($stream));
- $responseObj->setStatusCode($status);
- // Close the stream after use
- fclose($stream);
- return $responseObj;
- }
- }
- class wfWAFHTTPTransportException extends wfWAFException {
- }