1<?php 2/** 3 * Copyright 2017 Facebook, Inc. 4 * 5 * You are hereby granted a non-exclusive, worldwide, royalty-free license to 6 * use, copy, modify, and distribute this software in source code or binary 7 * form for use in connection with the web services and APIs provided by 8 * Facebook. 9 * 10 * As with any software that integrates with the Facebook platform, your use 11 * of this software is subject to the Facebook Developer Principles and 12 * Policies [http://developers.facebook.com/policy/]. This copyright notice 13 * shall be included in all copies or substantial portions of the software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 * 23 */ 24namespace Facebook\HttpClients; 25 26use GuzzleHttp\Client; 27use InvalidArgumentException; 28use Exception; 29 30class HttpClientsFactory 31{ 32 private function __construct() 33 { 34 // a factory constructor should never be invoked 35 } 36 37 /** 38 * HTTP client generation. 39 * 40 * @param FacebookHttpClientInterface|Client|string|null $handler 41 * 42 * @throws Exception If the cURL extension or the Guzzle client aren't available (if required). 43 * @throws InvalidArgumentException If the http client handler isn't "curl", "stream", "guzzle", or an instance of Facebook\HttpClients\FacebookHttpClientInterface. 44 * 45 * @return FacebookHttpClientInterface 46 */ 47 public static function createHttpClient($handler) 48 { 49 if (!$handler) { 50 return self::detectDefaultClient(); 51 } 52 53 if ($handler instanceof FacebookHttpClientInterface) { 54 return $handler; 55 } 56 57 if ('stream' === $handler) { 58 return new FacebookStreamHttpClient(); 59 } 60 if ('curl' === $handler) { 61 if (!extension_loaded('curl')) { 62 throw new Exception('The cURL extension must be loaded in order to use the "curl" handler.'); 63 } 64 65 return new FacebookCurlHttpClient(); 66 } 67 68 if ('guzzle' === $handler && !class_exists('GuzzleHttp\Client')) { 69 throw new Exception('The Guzzle HTTP client must be included in order to use the "guzzle" handler.'); 70 } 71 72 if ($handler instanceof Client) { 73 return new FacebookGuzzleHttpClient($handler); 74 } 75 if ('guzzle' === $handler) { 76 return new FacebookGuzzleHttpClient(); 77 } 78 79 throw new InvalidArgumentException('The http client handler must be set to "curl", "stream", "guzzle", be an instance of GuzzleHttp\Client or an instance of Facebook\HttpClients\FacebookHttpClientInterface'); 80 } 81 82 /** 83 * Detect default HTTP client. 84 * 85 * @return FacebookHttpClientInterface 86 */ 87 private static function detectDefaultClient() 88 { 89 if (extension_loaded('curl')) { 90 return new FacebookCurlHttpClient(); 91 } 92 93 if (class_exists('GuzzleHttp\Client')) { 94 return new FacebookGuzzleHttpClient(); 95 } 96 97 return new FacebookStreamHttpClient(); 98 } 99} 100