21 Commits

Author SHA1 Message Date
Ahmad Nassri
2074abf904 keeping deprecated auth method functional 2015-02-05 12:22:46 -05:00
Ahmad Nassri
96cdf61101 allowing all native libcurl authentication methods 2015-02-05 12:19:47 -05:00
Ahmad Nassri
002c175cd1 typo fix 2015-02-05 11:41:42 -05:00
Ahmad Nassri
c5be546d1b Proxies!
closes #47
2015-02-05 11:33:59 -05:00
Ahmad Nassri
5fa02336f9 rounded corners for badges 2015-01-15 17:31:04 -05:00
Ahmad Nassri
23c3cb5b00 fix badge + unified description 2015-01-15 17:15:37 -05:00
Ahmad Nassri
8ce5204c37 updates to badges and text 2015-01-15 15:25:45 -05:00
Ahmad Nassri
90be29ced4 typo 2015-01-15 01:47:58 -05:00
Ahmad Nassri
8dcb11e0a6 updating README with new info 2015-01-15 01:46:21 -05:00
Ahmad Nassri
3591292c3e eliminating code smells and converting Unirest\Request::send into a public method 2015-01-15 01:42:43 -05:00
Ahmad Nassri
3ec25a5d17 adjusting requirements 2015-01-15 01:32:53 -05:00
Ahmad Nassri
fbe66400fc allow hhvm to fail 2015-01-15 01:30:10 -05:00
Ahmad Nassri
f68939375b closing code 2015-01-15 01:25:30 -05:00
Ahmad Nassri
ba25e0304a JSON Decoding options
- users can now specify all the json_decode params to be used
- additional method added: `Unirest\Request::defaultHeaders`
2015-01-15 01:22:23 -05:00
Ahmad Nassri
3bb82974cc codeclimate seems to have a self-signed ssl, which causes errors in travis 2015-01-15 00:33:18 -05:00
Ahmad Nassri
3eb8536d3d new test to validate #58 2015-01-15 00:30:47 -05:00
Ahmad Nassri
4762858017 fixing ext-json dependency for older php 2015-01-15 00:16:40 -05:00
Ahmad Nassri
7404fca828 minor update to README & Travis fix 2015-01-15 00:12:52 -05:00
Ahmad Nassri
1dfcade505 Update README.md 2015-01-14 21:47:33 -05:00
Ahmad Nassri
976247358b Update README.md 2015-01-14 21:45:22 -05:00
Ahmad Nassri
a58c5592d5 Update README.md 2015-01-14 21:45:01 -05:00
7 changed files with 361 additions and 91 deletions

View File

@@ -6,8 +6,13 @@ php:
- 5.6 - 5.6
- hhvm - hhvm
before_script:
- composer selfupdate
- composer install
after_script: after_script:
- vendor/bin/test-reporter - vendor/bin/test-reporter --stdout > codeclimate.json
- "curl -X POST -d @codeclimate.json -H 'Content-Type: application/json' -H 'User-Agent: Code Climate (PHP Test Reporter v0.1.1)' https://codeclimate.com/test_reports"
notifications: notifications:
webhooks: webhooks:
@@ -16,3 +21,8 @@ notifications:
on_success: always on_success: always
on_failure: always on_failure: always
on_start: false on_start: false
matrix:
fast_finish: true
allow_failures:
- php: hhvm

167
README.md
View File

@@ -1,23 +1,28 @@
# Unirest for PHP [![version][composer-image]][composer-url] # Unirest for PHP [![Build Status][travis-image]][travis-url] [![version][packagist-version]][packagist-url]
[![Build Status][travis-image]][travis-url] [![Downloads][packagist-downloads]][packagist-url]
[![Code Climate][codeclimate-image]][codeclimate-url] [![Code Climate][codeclimate-quality]][codeclimate-url]
[![Coverage Status][codecoverage-image]][codecoverage-url] [![Coverage Status][codeclimate-coverage]][codeclimate-url]
[![Dependency Status][dependency-image]][dependency-url] [![Dependencies][versioneye-image]][versioneye-url]
[![Gitter][gitter-image]][gitter-url] [![Gitter][gitter-image]][gitter-url]
[![License][packagist-license]][license-url]
Unirest is a set of lightweight HTTP libraries available in multiple languages, ideal for most applications: Unirest is a set of lightweight HTTP libraries available in [multiple languages](http://unirest.io).
## Features ## Features
* Utility methods to call `GET`, `HEAD`, `POST`, `PUT`, `DELETE`, `CONNECT`, `OPTIONS`, `TRACE`, `PATCH` requests * Utility methods to call `GET`, `HEAD`, `POST`, `PUT`, `DELETE`, `CONNECT`, `OPTIONS`, `TRACE`, `PATCH` requests
* Supports form parameters, file uploads and custom body entities * Supports form parameters, file uploads and custom body entities
* Supports gzip * Supports gzip
* Supports Basic Authentication natively * Supports Basic, Digest, Negotiate, NTLM Authentication natively
* Customizable timeout * Customizable timeout
* Customizable default headers for every request (DRY) * Customizable default headers for every request (DRY)
* Automatic JSON parsing into a native object for JSON responses * Automatic JSON parsing into a native object for JSON responses
## Requirements
- [cURL](http://php.net/manual/en/book.curl.php)
## Installation ## Installation
### Using [Composer](https://getcomposer.org) ### Using [Composer](https://getcomposer.org)
@@ -25,7 +30,6 @@ Unirest is a set of lightweight HTTP libraries available in multiple languages,
To install unirest-php with Composer, just add the following to your `composer.json` file: To install unirest-php with Composer, just add the following to your `composer.json` file:
```json ```json
// composer.json
{ {
"require-dev": { "require-dev": {
"mashape/unirest-php": "2.*" "mashape/unirest-php": "2.*"
@@ -106,29 +110,67 @@ $body = json_encode(array("foo" => "hellow", "bar" => "world"));
$response = Unirest\Request::post("http://httpbin.org/post", $headers, $body); $response = Unirest\Request::post("http://httpbin.org/post", $headers, $body);
``` ```
### Basic Authentication ### Authentication
Authenticating the request with basic authentication can be done by providing the `username` and `password` arguments: Passing a username, password *(optional)*, defaults to Basic Authentication:
```php
// basic auth
Unirest\Request::auth('username', 'password');
```
The third parameter, which is a bitmask, will Unirest which HTTP authentication method(s) you want it to use for your proxy authentication.
If more than one bit is set, Unirest *(at PHP's libcurl level)* will first query the site to see what authentication methods it supports and then pick the best one you allow it to use. *For some methods, this will induce an extra network round-trip.*
**Supported Method**
| Method | Description |
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `CURLAUTH_BASIC` | HTTP Basic authentication. This is the default choice |
| `CURLAUTH_DIGEST` | HTTP Digest authentication. as defined in [RFC 2617](http://www.ietf.org/rfc/rfc2617.txt) |
| `CURLAUTH_DIGEST_IE` | HTTP Digest authentication with an IE flavor. *The IE flavor is simply that libcurl will use a special "quirk" that IE is known to have used before version 7 and that some servers require the client to use.* |
| `CURLAUTH_NEGOTIATE` | HTTP Negotiate (SPNEGO) authentication. as defined in [RFC 4559](http://www.ietf.org/rfc/rfc4559.txt) |
| `CURLAUTH_NTLM` | HTTP NTLM authentication. A proprietary protocol invented and used by Microsoft. |
| `CURLAUTH_NTLM_WB` | NTLM delegating to winbind helper. Authentication is performed by a separate binary application. *see [libcurl docs](http://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html) for more info* |
| `CURLAUTH_ANY` | This is a convenience macro that sets all bits and thus makes libcurl pick any it finds suitable. libcurl will automatically select the one it finds most secure. |
| `CURLAUTH_ANYSAFE` | This is a convenience macro that sets all bits except Basic and thus makes libcurl pick any it finds suitable. libcurl will automatically select the one it finds most secure. |
| `CURLAUTH_ONLY` | This is a meta symbol. OR this value together with a single specific auth value to force libcurl to probe for un-restricted auth and if not, only that single auth algorithm is acceptable. |
```php
// custom auth method
Unirest\Request::proxyAuth('username', 'password', CURLAUTH_DIGEST);
```
Previous versions of **Unirest** support *Basic Authentication* by providing the `username` and `password` arguments:
```php ```php
$response = Unirest\Request::get("http://httpbin.org/get", null, null, "username", "password"); $response = Unirest\Request::get("http://httpbin.org/get", null, null, "username", "password");
``` ```
**This has been deprecated, and will be completely removed in `v.3.0.0` please use the `Unirest\Request::auth()` method instead**
### Request Object ### Request Object
```php ```php
Unirest\Request::get($url, $headers = array(), $parameters = NULL, $username = NULL, $password = NULL) Unirest\Request::get($url, $headers = array(), $parameters = null)
Unirest\Request::post($url, $headers = array(), $body = NULL, $username = NULL, $password = NULL) Unirest\Request::post($url, $headers = array(), $body = null)
Unirest\Request::put($url, $headers = array(), $body = NULL, $username = NULL, $password = NULL) Unirest\Request::put($url, $headers = array(), $body = null)
Unirest\Request::patch($url, $headers = array(), $body = NULL, $username = NULL, $password = NULL) Unirest\Request::patch($url, $headers = array(), $body = null)
Unirest\Request::delete($url, $headers = array(), $body = NULL, $username = NULL, $password = NULL) Unirest\Request::delete($url, $headers = array(), $body = null)
``` ```
- `url` - Endpoint, address, or uri to be acted upon and requested information from. - `url` - Endpoint, address, or uri to be acted upon and requested information from.
- `headers` - Request Headers as associative array or object - `headers` - Request Headers as associative array or object
- `body` - Request Body as associative array or object - `body` - Request Body as associative array or object
- `username` - Basic Authentication username
- `password` - Basic Authentication password You can send a request with any [standard](http://www.iana.org/assignments/http-methods/http-methods.xhtml) or custom HTTP Method:
```php
Unirest\Request::send(Unirest\Method::LINK, $url, $headers = array(), $body);
Unirest\Request::send('CHECKOUT', $url, $headers = array(), $body);
```
### Response Object ### Response Object
@@ -143,6 +185,17 @@ Upon recieving a response Unirest returns the result in the form of an Object, t
You can set some advanced configuration to tune Unirest-PHP: You can set some advanced configuration to tune Unirest-PHP:
#### Custom JSON Decode Flags
Unirest uses PHP's [JSON Extension](http://php.net/manual/en/book.json.php) for automatically decoding JSON responses.
sometime you may want to return associative arrays, limit the depth of recursion, or use any of the [customization flags](http://php.net/manual/en/json.constants.php#constant.json-hex-tag).
To do so, simply set the desired options using the `jsonOpts` request method:
```php
Unirest\Request::jsonOpts(true, 512, JSON_NUMERIC_CHECK & JSON_FORCE_OBJECT & JSON_UNESCAPED_SLASHES);
```
#### Timeout #### Timeout
You can set a custom timeout value (in **seconds**): You can set a custom timeout value (in **seconds**):
@@ -151,6 +204,45 @@ You can set a custom timeout value (in **seconds**):
Unirest\Request::timeout(5); // 5s timeout Unirest\Request::timeout(5); // 5s timeout
``` ```
#### Proxy
Set the proxy to use for the upcoming request.
you can also set the proxy type to be one of `CURLPROXY_HTTP`, `CURLPROXY_HTTP_1_0`, `CURLPROXY_SOCKS4`, `CURLPROXY_SOCKS5`, `CURLPROXY_SOCKS4A`, and `CURLPROXY_SOCKS5_HOSTNAME`.
*check the [cURL docs](http://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html) for more info*.
```php
// quick setup with default port: 1080
Unirest\Request::proxy('10.10.10.1');
// custom port and proxy type
Unirest\Request::proxy('10.10.10.1', 8080, CURLPROXY_HTTP);
// enable tunneling
Unirest\Request::proxy('10.10.10.1', 8080, CURLPROXY_HTTP, true);
```
##### Proxy Authenticaton
Passing a username, password *(optional)*, defaults to Basic Authentication:
```php
// basic auth
Unirest\Request::proxyAuth('username', 'password');
```
The third parameter, which is a bitmask, will Unirest which HTTP authentication method(s) you want it to use for your proxy authentication.
If more than one bit is set, Unirest *(at PHP's libcurl level)* will first query the site to see what authentication methods it supports and then pick the best one you allow it to use. *For some methods, this will induce an extra network round-trip.*
See [Authentication](#authentication) for more details on methods supported.
```php
// basic auth
Unirest\Request::proxyAuth('username', 'password', CURLAUTH_DIGEST);
```
#### Default Request Headers #### Default Request Headers
You can set default headers that will be sent on every request: You can set default headers that will be sent on every request:
@@ -160,6 +252,15 @@ Unirest\Request::defaultHeader("Header1", "Value1");
Unirest\Request::defaultHeader("Header2", "Value2"); Unirest\Request::defaultHeader("Header2", "Value2");
``` ```
You can do set default headers in bulk:
```php
Unirest\Request::defaultHeaders(array(
"Header1" => "Value1",
"Header2" => "Value2"
));
```
You can clear the default headers anytime with: You can clear the default headers anytime with:
```php ```php
@@ -176,28 +277,26 @@ Unirest\Request::verifyPeer(false); // Disables SSL cert validation
By default is `true`. By default is `true`.
## License ----
Licensed under [the MIT license](LICENSE). Made with ♥ from the [Mashape](https://www.mashape.com/) team
Created with love by [![Mashape Logo][mashape-logo]](https://www.mashape.com/) [license-url]: https://github.com/Mashape/unirest-php/blob/master/LICENSE
[gitter-url]: https://gitter.im/Mashape [gitter-url]: https://gitter.im/Mashape/unirest-php
[gitter-image]: https://badges.gitter.im/Mashape.png [gitter-image]: https://img.shields.io/badge/Gitter-Join%20Chat-blue.svg?style=flat
[composer-url]: http://badge.fury.io/ph/mashape%2Funirest-php
[composer-image]: https://badge.fury.io/ph/mashape%2Funirest-php.svg
[travis-url]: https://travis-ci.org/Mashape/unirest-php [travis-url]: https://travis-ci.org/Mashape/unirest-php
[travis-image]: https://travis-ci.org/Mashape/unirest-php.png?branch=master [travis-image]: https://img.shields.io/travis/Mashape/unirest-php.svg?style=flat
[packagist-url]: https://packagist.org/packages/Mashape/unirest-php
[packagist-license]: https://img.shields.io/packagist/l/Mashape/unirest-php.svg?style=flat
[packagist-version]: https://img.shields.io/packagist/v/Mashape/unirest-php.svg?style=flat
[packagist-downloads]: https://img.shields.io/packagist/dm/Mashape/unirest-php.svg?style=flat
[codeclimate-url]: https://codeclimate.com/github/Mashape/unirest-php [codeclimate-url]: https://codeclimate.com/github/Mashape/unirest-php
[codeclimate-image]: https://codeclimate.com/github/Mashape/unirest-php/badges/gpa.svg [codeclimate-quality]: https://img.shields.io/codeclimate/github/Mashape/unirest-php.svg?style=flat
[codeclimate-coverage]: https://img.shields.io/codeclimate/coverage/github/Mashape/unirest-php.svg?style=flat
[codecoverage-url]: https://codeclimate.com/github/Mashape/unirest-php [versioneye-url]: https://www.versioneye.com/user/projects/54b82450050646ca5c0001f3
[codecoverage-image]: https://codeclimate.com/github/Mashape/unirest-php/badges/coverage.svg [versioneye-image]: https://img.shields.io/versioneye/d/user/projects/54b82450050646ca5c0001f3.svg?style=flat
[dependency-url]: https://www.versioneye.com/user/projects/54b702db050646ca5c00019d
[dependency-image]: https://www.versioneye.com/user/projects/54b702db050646ca5c00019d/badge.svg?style=flat
[mashape-logo]: https://cloud.githubusercontent.com/assets/183195/5750736/c94e178c-9c26-11e4-91b2-84bcd5d33e28.png

View File

@@ -8,11 +8,10 @@
"author": "Mashape <opensource@mashape.com> (https://www.mashape.com)", "author": "Mashape <opensource@mashape.com> (https://www.mashape.com)",
"require": { "require": {
"php": ">=5.4.0", "php": ">=5.4.0",
"ext-curl": "0.0.0.*", "ext-curl": "*",
"ext-json": "~1.3" "ext-json": "*"
}, },
"require-dev": { "require-dev": {
"ext-xdebug": "~2.2",
"phpunit/phpunit": "~4.4", "phpunit/phpunit": "~4.4",
"codeclimate/php-test-reporter": "0.1.*" "codeclimate/php-test-reporter": "0.1.*"
}, },

View File

@@ -7,36 +7,84 @@ use Unirest\Response;
class Request class Request
{ {
private static $jsonOpts = array();
private static $verifyPeer = true; private static $verifyPeer = true;
private static $socketTimeout = null; private static $socketTimeout = null;
private static $defaultHeaders = array(); private static $defaultHeaders = array();
private static $auth = array (
'user' => '',
'pass' => '',
'method' => CURLAUTH_BASIC
);
private static $proxy = array(
'port' => false,
'tunnel' => false,
'address' => false,
'type' => CURLPROXY_HTTP,
'auth' => array (
'user' => '',
'pass' => '',
'method' => CURLAUTH_BASIC
)
);
/**
* Set JSON decode mode
*
* @param bool $assoc When TRUE, returned objects will be converted into associative arrays.
* @param bool $depth User specified recursion depth.
* @param bool $options Bitmask of JSON decode options. Currently only JSON_BIGINT_AS_STRING is supported (default is to cast large integers as floats)
*/
public static function jsonOpts($assoc = false, $depth = 512, $options = 0)
{
return self::$jsonOpts = array($assoc, $depth, $options);
}
/** /**
* Verify SSL peer * Verify SSL peer
*
* @param bool $enabled enable SSL verification, by default is true * @param bool $enabled enable SSL verification, by default is true
*/ */
public static function verifyPeer($enabled) public static function verifyPeer($enabled)
{ {
self::$verifyPeer = $enabled; return self::$verifyPeer = $enabled;
} }
/** /**
* Set a timeout * Set a timeout
*
* @param integer $seconds timeout value in seconds * @param integer $seconds timeout value in seconds
*/ */
public static function timeout($seconds) public static function timeout($seconds)
{ {
self::$socketTimeout = $seconds; return self::$socketTimeout = $seconds;
}
/**
* Set default headers to send on every request
*
* @param array $headers headers array
*/
public static function defaultHeaders($headers)
{
foreach ($headers as $name => $value) {
self::$defaultHeaders[$name] = $value;
}
return $headers;
} }
/** /**
* Set a new default header to send on every request * Set a new default header to send on every request
*
* @param string $name header name * @param string $name header name
* @param string $value header value * @param string $value header value
*/ */
public static function defaultHeader($name, $value) public static function defaultHeader($name, $value)
{ {
self::$defaultHeaders[$name] = $value; return self::$defaultHeaders[$name] = $value;
} }
/** /**
@@ -44,16 +92,62 @@ class Request
*/ */
public static function clearDefaultHeaders() public static function clearDefaultHeaders()
{ {
self::$defaultHeaders = array(); return self::$defaultHeaders = array();
}
/**
* Set authentication method to use
*
* @param string $username authentication username
* @param string $password authentication password
* @param string $method authentication method
*/
public static function auth($username = '', $password = '', $method = CURLAUTH_BASIC)
{
self::$auth['user'] = $username;
self::$auth['pass'] = $password;
self::$auth['method'] = $method;
}
/**
* Set proxy to use
*
* @param string $address proxy address
* @param string $port proxy port
* @param string $port proxy type (Available options for this are CURLPROXY_HTTP, CURLPROXY_HTTP_1_0 CURLPROXY_SOCKS4, CURLPROXY_SOCKS5, CURLPROXY_SOCKS4A and CURLPROXY_SOCKS5_HOSTNAME)
* @param string $tunnel enable/disable tunneling
*/
public static function proxy($address, $port = 1080, $type = CURLPROXY_HTTP, $tunnel = false)
{
self::$proxy['type'] = $type;
self::$proxy['port'] = $port;
self::$proxy['tunnel'] = $tunnel;
self::$proxy['address'] = $address;
}
/**
* Set proxy authentication method to use
*
* @param string $username authentication username
* @param string $password authentication password
* @param string $method authentication method
* @param string $tunnel enable/disable tunneling
*/
public static function proxyAuth($username = '', $password = '', $method = CURLAUTH_BASIC)
{
self::$proxy['auth']['user'] = $username;
self::$proxy['auth']['pass'] = $password;
self::$proxy['auth']['method'] = $method;
} }
/** /**
* Send a GET request to a URL * Send a GET request to a URL
*
* @param string $url URL to send the GET request to * @param string $url URL to send the GET request to
* @param array $headers additional headers to send * @param array $headers additional headers to send
* @param mixed $parameters parameters to send in the querystring * @param mixed $parameters parameters to send in the querystring
* @param string $username Basic Authentication username * @param string $username Authentication username (deprecated)
* @param string $password Basic Authentication password * @param string $password Authentication password (deprecated)
* @return string|stdObj response string or stdObj if response is json-decodable * @return string|stdObj response string or stdObj if response is json-decodable
*/ */
public static function get($url, $headers = array(), $parameters = null, $username = null, $password = null) public static function get($url, $headers = array(), $parameters = null, $username = null, $password = null)
@@ -66,8 +160,8 @@ class Request
* @param string $url URL to send the HEAD request to * @param string $url URL to send the HEAD request to
* @param array $headers additional headers to send * @param array $headers additional headers to send
* @param mixed $parameters parameters to send in the querystring * @param mixed $parameters parameters to send in the querystring
* @param string $username Basic Authentication username * @param string $username Basic Authentication username (deprecated)
* @param string $password Basic Authentication password * @param string $password Basic Authentication password (deprecated)
* @return string|stdObj response string or stdObj if response is json-decodable * @return string|stdObj response string or stdObj if response is json-decodable
*/ */
public static function head($url, $headers = array(), $parameters = null, $username = null, $password = null) public static function head($url, $headers = array(), $parameters = null, $username = null, $password = null)
@@ -94,8 +188,8 @@ class Request
* @param string $url URL to send the CONNECT request to * @param string $url URL to send the CONNECT request to
* @param array $headers additional headers to send * @param array $headers additional headers to send
* @param mixed $parameters parameters to send in the querystring * @param mixed $parameters parameters to send in the querystring
* @param string $username Basic Authentication username * @param string $username Basic Authentication username (deprecated)
* @param string $password Basic Authentication password * @param string $password Basic Authentication password (deprecated)
* @return string|stdObj response string or stdObj if response is json-decodable * @return string|stdObj response string or stdObj if response is json-decodable
*/ */
public static function connect($url, $headers = array(), $parameters = null, $username = null, $password = null) public static function connect($url, $headers = array(), $parameters = null, $username = null, $password = null)
@@ -108,8 +202,8 @@ class Request
* @param string $url URL to send the POST request to * @param string $url URL to send the POST request to
* @param array $headers additional headers to send * @param array $headers additional headers to send
* @param mixed $body POST body data * @param mixed $body POST body data
* @param string $username Basic Authentication username * @param string $username Basic Authentication username (deprecated)
* @param string $password Basic Authentication password * @param string $password Basic Authentication password (deprecated)
* @return string|stdObj response string or stdObj if response is json-decodable * @return string|stdObj response string or stdObj if response is json-decodable
*/ */
public static function post($url, $headers = array(), $body = null, $username = null, $password = null) public static function post($url, $headers = array(), $body = null, $username = null, $password = null)
@@ -122,8 +216,8 @@ class Request
* @param string $url URL to send the DELETE request to * @param string $url URL to send the DELETE request to
* @param array $headers additional headers to send * @param array $headers additional headers to send
* @param mixed $body DELETE body data * @param mixed $body DELETE body data
* @param string $username Basic Authentication username * @param string $username Basic Authentication username (deprecated)
* @param string $password Basic Authentication password * @param string $password Basic Authentication password (deprecated)
* @return string|stdObj response string or stdObj if response is json-decodable * @return string|stdObj response string or stdObj if response is json-decodable
*/ */
public static function delete($url, $headers = array(), $body = null, $username = null, $password = null) public static function delete($url, $headers = array(), $body = null, $username = null, $password = null)
@@ -136,8 +230,8 @@ class Request
* @param string $url URL to send the PUT request to * @param string $url URL to send the PUT request to
* @param array $headers additional headers to send * @param array $headers additional headers to send
* @param mixed $body PUT body data * @param mixed $body PUT body data
* @param string $username Basic Authentication username * @param string $username Basic Authentication username (deprecated)
* @param string $password Basic Authentication password * @param string $password Basic Authentication password (deprecated)
* @return string|stdObj response string or stdObj if response is json-decodable * @return string|stdObj response string or stdObj if response is json-decodable
*/ */
public static function put($url, $headers = array(), $body = null, $username = null, $password = null) public static function put($url, $headers = array(), $body = null, $username = null, $password = null)
@@ -150,8 +244,8 @@ class Request
* @param string $url URL to send the PATCH request to * @param string $url URL to send the PATCH request to
* @param array $headers additional headers to send * @param array $headers additional headers to send
* @param mixed $body PATCH body data * @param mixed $body PATCH body data
* @param string $username Basic Authentication username * @param string $username Basic Authentication username (deprecated)
* @param string $password Basic Authentication password * @param string $password Basic Authentication password (deprecated)
* @return string|stdObj response string or stdObj if response is json-decodable * @return string|stdObj response string or stdObj if response is json-decodable
*/ */
public static function patch($url, $headers = array(), $body = null, $username = null, $password = null) public static function patch($url, $headers = array(), $body = null, $username = null, $password = null)
@@ -164,8 +258,8 @@ class Request
* @param string $url URL to send the TRACE request to * @param string $url URL to send the TRACE request to
* @param array $headers additional headers to send * @param array $headers additional headers to send
* @param mixed $body TRACE body data * @param mixed $body TRACE body data
* @param string $username Basic Authentication username * @param string $username Basic Authentication username (deprecated)
* @param string $password Basic Authentication password * @param string $password Basic Authentication password (deprecated)
* @return string|stdObj response string or stdObj if response is json-decodable * @return string|stdObj response string or stdObj if response is json-decodable
*/ */
public static function trace($url, $headers = array(), $body = null, $username = null, $password = null) public static function trace($url, $headers = array(), $body = null, $username = null, $password = null)
@@ -208,36 +302,16 @@ class Request
* @param string $url URL to send the request to * @param string $url URL to send the request to
* @param mixed $body request body * @param mixed $body request body
* @param array $headers additional headers to send * @param array $headers additional headers to send
* @param string $username Basic Authentication username * @param string $username Authentication username (deprecated)
* @param string $password Basic Authentication password * @param string $password Authentication password (deprecated)
* @throws Exception if a cURL error occurs * @throws Exception if a cURL error occurs
* @return Unirest\Response * @return Unirest\Response
*/ */
private static function send($method, $url, $body = null, $headers = array(), $username = null, $password = null) public static function send($method, $url, $body = null, $headers = array(), $username = null, $password = null)
{ {
if ($headers == null) {
$headers = array();
}
$lowercaseHeaders = array();
$finalHeaders = array_merge($headers, self::$defaultHeaders);
foreach ($finalHeaders as $key => $val) {
$lowercaseHeaders[] = self::getHeader($key, $val);
}
$lowerCaseFinalHeaders = array_change_key_case($finalHeaders);
if (!array_key_exists('user-agent', $lowerCaseFinalHeaders)) {
$lowercaseHeaders[] = 'user-agent: unirest-php/2.0';
}
if (!array_key_exists('expect', $lowerCaseFinalHeaders)) {
$lowercaseHeaders[] = 'expect:';
}
$ch = curl_init(); $ch = curl_init();
if ($method != Method::GET) { if ($method !== Method::GET) {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
if (is_array($body) || $body instanceof \Traversable) { if (is_array($body) || $body instanceof \Traversable) {
@@ -259,17 +333,37 @@ class Request
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10); curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_HTTPHEADER, $lowercaseHeaders); curl_setopt($ch, CURLOPT_HTTPHEADER, self::getFormattedHeaders($headers));
curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, self::$verifyPeer); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, self::$verifyPeer);
curl_setopt($ch, CURLOPT_ENCODING, ''); // If an empty string, '', is set, a header containing all supported encoding types is sent. curl_setopt($ch, CURLOPT_ENCODING, ''); // If an empty string, '', is set, a header containing all supported encoding types is sent.
if (self::$socketTimeout != null) { if (self::$socketTimeout !== null) {
curl_setopt($ch, CURLOPT_TIMEOUT, self::$socketTimeout); curl_setopt($ch, CURLOPT_TIMEOUT, self::$socketTimeout);
} }
// supporting deprecated http auth method
if (!empty($username)) { if (!empty($username)) {
curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . ((empty($password)) ? '' : $password)); curl_setopt($ch, CURLOPT_USERNAME, $username);
curl_setopt($ch, CURLOPT_PASSWORD, $password);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
}
if (!empty(self::$auth['user'])) {
curl_setopt($ch, CURLOPT_USERNAME, self::$auth['user']);
curl_setopt($ch, CURLOPT_PASSWORD, self::$auth['pass']);
curl_setopt($ch, CURLOPT_HTTPAUTH, self::$auth['method']);
}
if (self::$proxy['address'] !== false) {
curl_setopt($ch, CURLOPT_PROXYTYPE, self::$proxy['type']);
curl_setopt($ch, CURLOPT_PROXY, self::$proxy['address']);
curl_setopt($ch, CURLOPT_PROXYPORT, self::$proxy['port']);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, self::$proxy['tunnel']);
curl_setopt($ch, CURLOPT_PROXYAUTH, self::$proxy['auth']['method']);
curl_setopt($ch, CURLOPT_PROXYUSERNAME, self::$proxy['auth']['user']);
curl_setopt($ch, CURLOPT_PROXYPASSWORD, self::$proxy['auth']['pass']);
} }
$response = curl_exec($ch); $response = curl_exec($ch);
@@ -286,7 +380,28 @@ class Request
$body = substr($response, $header_size); $body = substr($response, $header_size);
$httpCode = $curl_info['http_code']; $httpCode = $curl_info['http_code'];
return new Response($httpCode, $body, $header); return new Response($httpCode, $body, $header, self::$jsonOpts);
}
public static function getFormattedHeaders($headers)
{
$formattedHeaders = array();
$combinedHeaders = array_change_key_case(array_merge((array) $headers, self::$defaultHeaders));
foreach ($combinedHeaders as $key => $val) {
$formattedHeaders[] = self::getHeaderString($key, $val);
}
if (!array_key_exists('user-agent', $combinedHeaders)) {
$formattedHeaders[] = 'user-agent: unirest-php/2.0';
}
if (!array_key_exists('expect', $combinedHeaders)) {
$formattedHeaders[] = 'expect:';
}
return $formattedHeaders;
} }
private static function getArrayFromQuerystring($query) private static function getArrayFromQuerystring($query)
@@ -315,11 +430,11 @@ class Request
$path = (isset($url_parsed['path']) ? $url_parsed['path'] : null); $path = (isset($url_parsed['path']) ? $url_parsed['path'] : null);
$query = (isset($url_parsed['query']) ? $url_parsed['query'] : null); $query = (isset($url_parsed['query']) ? $url_parsed['query'] : null);
if ($query != null) { if ($query !== null) {
$query = '?' . http_build_query(self::getArrayFromQuerystring($query)); $query = '?' . http_build_query(self::getArrayFromQuerystring($query));
} }
if ($port && $port[0] != ':') { if ($port && $port[0] !== ':') {
$port = ':' . $port; $port = ':' . $port;
} }
@@ -327,7 +442,7 @@ class Request
return $result; return $result;
} }
private static function getHeader($key, $val) private static function getHeaderString($key, $val)
{ {
$key = trim(strtolower($key)); $key = trim(strtolower($key));
return $key . ': ' . $val; return $key . ': ' . $val;

View File

@@ -13,14 +13,19 @@ class Response
* @param int $code response code of the cURL request * @param int $code response code of the cURL request
* @param string $raw_body the raw body of the cURL response * @param string $raw_body the raw body of the cURL response
* @param string $headers raw header string from cURL response * @param string $headers raw header string from cURL response
* @param array $json_args arguments to pass to json_decode function
*/ */
public function __construct($code, $raw_body, $headers) public function __construct($code, $raw_body, $headers, $json_args = array())
{ {
$this->code = $code; $this->code = $code;
$this->headers = $this->parseHeaders($headers); $this->headers = $this->parseHeaders($headers);
$this->raw_body = $raw_body; $this->raw_body = $raw_body;
$this->body = $raw_body; $this->body = $raw_body;
$json = json_decode($raw_body);
// make sure raw_body is the first argument
array_unshift($json_args, $raw_body);
$json = call_user_func_array('json_decode', $json_args);
if (json_last_error() === JSON_ERROR_NONE) { if (json_last_error() === JSON_ERROR_NONE) {
$this->body = $json; $this->body = $json;

View File

@@ -171,7 +171,10 @@ class UnirestRequestTest extends \PHPUnit_Framework_TestCase
$args = $response->body->args; $args = $response->body->args;
$this->assertEquals('Mark=Hello', $args->name); $this->assertEquals('Mark=Hello', $args->name);
}
public function testGetWithEqualSignAlt()
{
$response = Unirest\Request::get('http://httpbin.org/get', array( $response = Unirest\Request::get('http://httpbin.org/get', array(
'Accept' => 'application/json' 'Accept' => 'application/json'
), array( ), array(
@@ -184,6 +187,17 @@ class UnirestRequestTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('Mark=Hello=John', $args->name); $this->assertEquals('Mark=Hello=John', $args->name);
} }
public function testGetWithComplexQuery()
{
$response = Unirest\Request::get('http://httpbin.org/get?query=[{"type":"/music/album","name":null,"artist":{"id":"/en/bob_dylan"},"limit":3}]&cursor');
$this->assertEquals(200, $response->code);
$args = $response->body->args;
$this->assertEquals('', $args->cursor);
$this->assertEquals('[{"type":"/music/album","name":null,"artist":{"id":"/en/bob_dylan"},"limit":3}]', $args->query);
}
public function testGetArray() public function testGetArray()
{ {
$response = Unirest\Request::get('http://httpbin.org/get', array(), array( $response = Unirest\Request::get('http://httpbin.org/get', array(), array(

View File

@@ -0,0 +1,28 @@
<?php
class UnirestResponseTest extends \PHPUnit_Framework_TestCase
{
public function testJSONAssociativeArrays()
{
$opts = Unirest\Request::jsonOpts(true);
$response = new Unirest\Response(200, '{"a":1,"b":2,"c":3,"d":4,"e":5}', '', $opts);
$this->assertEquals($response->body['a'], 1);
}
public function testJSONAObjects()
{
$opts = Unirest\Request::jsonOpts(false);
$response = new Unirest\Response(200, '{"a":1,"b":2,"c":3,"d":4,"e":5}', '', $opts);
$this->assertEquals($response->body->a, 1);
}
public function testJSONOpts()
{
$opts = Unirest\Request::jsonOpts(false, 512, JSON_NUMERIC_CHECK);
$response = new Unirest\Response(200, '{"number": 1234567890}', '', $opts);
$this->assertSame($response->body->number, 1234567890);
}
}