From 0e27208586ab3c716fa5b90b42148e1bec27b389 Mon Sep 17 00:00:00 2001 From: Ben Jeavons Date: Fri, 28 Jan 2011 10:51:28 -0600 Subject: [PATCH 01/10] Support multipart form POST requests. --- lib/curl.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/curl.php b/lib/curl.php index 9d9497f..c8fee50 100644 --- a/lib/curl.php +++ b/lib/curl.php @@ -138,8 +138,8 @@ function head($url, $vars = array()) { * @param array|string $vars * @return CurlResponse|boolean **/ - function post($url, $vars = array()) { - return $this->request('POST', $url, $vars); + function post($url, $vars = array(), $enctype = NULL) { + return $this->request('POST', $url, $vars, $enctype); } /** @@ -165,10 +165,10 @@ function put($url, $vars = array()) { * @param array|string $vars * @return CurlResponse|boolean **/ - function request($method, $url, $vars = array()) { + function request($method, $url, $vars = array(), $enctype = NULL) { $this->error = ''; $this->request = curl_init(); - if (is_array($vars)) $vars = http_build_query($vars, '', '&'); + if (is_array($vars) && $encytype != 'multipart/form-data') $vars = http_build_query($vars, '', '&'); $this->set_request_method($method); $this->set_request_options($url, $vars); From 88938a03b14208f20977ad158f997b9946a0a253 Mon Sep 17 00:00:00 2001 From: Date: Sat, 19 Feb 2011 03:25:44 -0800 Subject: [PATCH 02/10] Added get_request_options() to allow checking the options set in curl --- lib/curl.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/curl.php b/lib/curl.php index 9d9497f..9880e7c 100644 --- a/lib/curl.php +++ b/lib/curl.php @@ -252,5 +252,15 @@ protected function set_request_options($url, $vars) { curl_setopt($this->request, constant('CURLOPT_'.str_replace('CURLOPT_', '', strtoupper($option))), $value); } } + + /** + * Returns an associative array of curl options + * currently configured. + * + * @return array Associative array of curl options + */ + function get_request_options() { + return curl_getinfo( $this->request ); + } } \ No newline at end of file From 03fab04a7e6d1e9e3a618beed99bd2f80691895d Mon Sep 17 00:00:00 2001 From: Kendall Hopkins Date: Tue, 21 Jun 2011 12:04:49 -0400 Subject: [PATCH 03/10] Use exceptions for the error handling. --- curl.php | 3 +- lib/curl.php | 25 +----------- lib/curl_exception.php | 93 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 24 deletions(-) create mode 100644 lib/curl_exception.php diff --git a/curl.php b/curl.php index e452354..a41c113 100644 --- a/curl.php +++ b/curl.php @@ -1,4 +1,5 @@ request('DELETE', $url, $vars); } - /** - * Returns the error string of the current request if one occurred - * - * @return string - **/ - function error() { - return $this->error; - } - /** * Makes an HTTP GET request to the specified $url with an optional array or string of $vars * @@ -166,7 +149,6 @@ function put($url, $vars = array()) { * @return CurlResponse|boolean **/ function request($method, $url, $vars = array()) { - $this->error = ''; $this->request = curl_init(); if (is_array($vars)) $vars = http_build_query($vars, '', '&'); @@ -175,12 +157,9 @@ function request($method, $url, $vars = array()) { $this->set_request_headers(); $response = curl_exec($this->request); + if (!$response) throw new CurlException(curl_errno($this->request)); - if ($response) { - $response = new CurlResponse($response); - } else { - $this->error = curl_errno($this->request).' - '.curl_error($this->request); - } + $response = new CurlResponse($response); curl_close($this->request); diff --git a/lib/curl_exception.php b/lib/curl_exception.php new file mode 100644 index 0000000..a38f64e --- /dev/null +++ b/lib/curl_exception.php @@ -0,0 +1,93 @@ + 'CURLE_UNSUPPORTED_PROTOCOL', + CURLE_FAILED_INIT => 'CURLE_FAILED_INIT', + CURLE_URL_MALFORMAT => 'CURLE_URL_MALFORMAT', + CURLE_URL_MALFORMAT_USER => 'CURLE_URL_MALFORMAT_USER', + CURLE_COULDNT_RESOLVE_PROXY => 'CURLE_COULDNT_RESOLVE_PROXY', + CURLE_COULDNT_RESOLVE_HOST => 'CURLE_COULDNT_RESOLVE_HOST', + CURLE_COULDNT_CONNECT => 'CURLE_COULDNT_CONNECT', + CURLE_FTP_WEIRD_SERVER_REPLY => 'CURLE_FTP_WEIRD_SERVER_REPLY', + CURLE_REMOTE_ACCESS_DENIED => 'CURLE_REMOTE_ACCESS_DENIED', + CURLE_FTP_WEIRD_PASS_REPLY => 'CURLE_FTP_WEIRD_PASS_REPLY', + CURLE_FTP_WEIRD_PASV_REPLY => 'CURLE_FTP_WEIRD_PASV_REPLY', + CURLE_FTP_WEIRD_227_FORMAT => 'CURLE_FTP_WEIRD_227_FORMAT', + CURLE_FTP_CANT_GET_HOST => 'CURLE_FTP_CANT_GET_HOST', + CURLE_FTP_COULDNT_SET_TYPE => 'CURLE_FTP_COULDNT_SET_TYPE', + CURLE_PARTIAL_FILE => 'CURLE_PARTIAL_FILE', + CURLE_FTP_COULDNT_RETR_FILE => 'CURLE_FTP_COULDNT_RETR_FILE', + CURLE_QUOTE_ERROR => 'CURLE_QUOTE_ERROR', + CURLE_HTTP_RETURNED_ERROR => 'CURLE_HTTP_RETURNED_ERROR', + CURLE_WRITE_ERROR => 'CURLE_WRITE_ERROR', + CURLE_UPLOAD_FAILED => 'CURLE_UPLOAD_FAILED', + CURLE_READ_ERROR => 'CURLE_READ_ERROR', + CURLE_OUT_OF_MEMORY => 'CURLE_OUT_OF_MEMORY', + CURLE_OPERATION_TIMEDOUT => 'CURLE_OPERATION_TIMEDOUT', + CURLE_FTP_PORT_FAILED => 'CURLE_FTP_PORT_FAILED', + CURLE_FTP_COULDNT_USE_REST => 'CURLE_FTP_COULDNT_USE_REST', + CURLE_RANGE_ERROR => 'CURLE_RANGE_ERROR', + CURLE_HTTP_POST_ERROR => 'CURLE_HTTP_POST_ERROR', + CURLE_SSL_CONNECT_ERROR => 'CURLE_SSL_CONNECT_ERROR', + CURLE_BAD_DOWNLOAD_RESUME => 'CURLE_BAD_DOWNLOAD_RESUME', + CURLE_FILE_COULDNT_READ_FILE => 'CURLE_FILE_COULDNT_READ_FILE', + CURLE_LDAP_CANNOT_BIND => 'CURLE_LDAP_CANNOT_BIND', + CURLE_LDAP_SEARCH_FAILED => 'CURLE_LDAP_SEARCH_FAILED', + CURLE_FUNCTION_NOT_FOUND => 'CURLE_FUNCTION_NOT_FOUND', + CURLE_ABORTED_BY_CALLBACK => 'CURLE_ABORTED_BY_CALLBACK', + CURLE_BAD_FUNCTION_ARGUMENT => 'CURLE_BAD_FUNCTION_ARGUMENT', + CURLE_INTERFACE_FAILED => 'CURLE_INTERFACE_FAILED', + CURLE_TOO_MANY_REDIRECTS => 'CURLE_TOO_MANY_REDIRECTS', + CURLE_UNKNOWN_TELNET_OPTION => 'CURLE_UNKNOWN_TELNET_OPTION', + CURLE_TELNET_OPTION_SYNTAX => 'CURLE_TELNET_OPTION_SYNTAX', + CURLE_PEER_FAILED_VERIFICATION => 'CURLE_PEER_FAILED_VERIFICATION', + CURLE_GOT_NOTHING => 'CURLE_GOT_NOTHING', + CURLE_SSL_ENGINE_NOTFOUND => 'CURLE_SSL_ENGINE_NOTFOUND', + CURLE_SSL_ENGINE_SETFAILED => 'CURLE_SSL_ENGINE_SETFAILED', + CURLE_SEND_ERROR => 'CURLE_SEND_ERROR', + CURLE_RECV_ERROR => 'CURLE_RECV_ERROR', + CURLE_SSL_CERTPROBLEM => 'CURLE_SSL_CERTPROBLEM', + CURLE_SSL_CIPHER => 'CURLE_SSL_CIPHER', + CURLE_SSL_CACERT => 'CURLE_SSL_CACERT', + CURLE_BAD_CONTENT_ENCODING => 'CURLE_BAD_CONTENT_ENCODING', + CURLE_LDAP_INVALID_URL => 'CURLE_LDAP_INVALID_URL', + CURLE_FILESIZE_EXCEEDED => 'CURLE_FILESIZE_EXCEEDED', + CURLE_USE_SSL_FAILED => 'CURLE_USE_SSL_FAILED', + CURLE_SEND_FAIL_REWIND => 'CURLE_SEND_FAIL_REWIND', + CURLE_SSL_ENGINE_INITFAILED => 'CURLE_SSL_ENGINE_INITFAILED', + CURLE_LOGIN_DENIED => 'CURLE_LOGIN_DENIED', + CURLE_TFTP_NOTFOUND => 'CURLE_TFTP_NOTFOUND', + CURLE_TFTP_PERM => 'CURLE_TFTP_PERM', + CURLE_REMOTE_DISK_FULL => 'CURLE_REMOTE_DISK_FULL', + CURLE_TFTP_ILLEGAL => 'CURLE_TFTP_ILLEGAL', + CURLE_TFTP_UNKNOWNID => 'CURLE_TFTP_UNKNOWNID', + CURLE_REMOTE_FILE_EXISTS => 'CURLE_REMOTE_FILE_EXISTS', + CURLE_TFTP_NOSUCHUSER => 'CURLE_TFTP_NOSUCHUSER', + CURLE_CONV_FAILED => 'CURLE_CONV_FAILED', + CURLE_CONV_REQD => 'CURLE_CONV_REQD', + CURLE_SSL_CACERT_BADFILE => 'CURLE_SSL_CACERT_BADFILE', + CURLE_REMOTE_FILE_NOT_FOUND => 'CURLE_REMOTE_FILE_NOT_FOUND', + CURLE_SSH => 'CURLE_SSH', + CURLE_SSL_SHUTDOWN_FAILED => 'CURLE_SSL_SHUTDOWN_FAILED', + CURLE_AGAIN => 'CURLE_AGAIN', + CURLE_SSL_CRL_BADFILE => 'CURLE_SSL_CRL_BADFILE', + CURLE_SSL_ISSUER_ERROR => 'CURLE_SSL_ISSUER_ERROR', + CURLE_FTP_PRET_FAILED => 'CURLE_FTP_PRET_FAILED', + CURLE_RTSP_CSEQ_ERROR => 'CURLE_RTSP_CSEQ_ERROR', + CURLE_RTSP_SESSION_ERROR => 'CURLE_RTSP_SESSION_ERROR', + CURLE_FTP_BAD_FILE_LIST => 'CURLE_FTP_BAD_FILE_LIST', + CURLE_CHUNK_FAILED => 'CURLE_CHUNK_FAILED' + ); + + function __construct( $curl_error_code ) + { + if( array_key_exists( $curl_error_code, self::$curl_errors ) ) + throw new Exception( "Unknown \$curl_error_code: $curl_error_code" ); + + parent::__construct( self::$curl_errors[$curl_error_code], $curl_error_code ); + } + +} \ No newline at end of file From 3a0cc7db427ae439f3b1c604a36c8f5dcbc03bdd Mon Sep 17 00:00:00 2001 From: Kendall Hopkins Date: Tue, 21 Jun 2011 20:32:24 -0400 Subject: [PATCH 04/10] Use a better and sorted list of exception. --- lib/curl_exception.php | 123 +++++++++++++++++++---------------------- 1 file changed, 56 insertions(+), 67 deletions(-) diff --git a/lib/curl_exception.php b/lib/curl_exception.php index a38f64e..b410904 100644 --- a/lib/curl_exception.php +++ b/lib/curl_exception.php @@ -4,87 +4,76 @@ class CurlException extends Exception { static public $curl_errors = array( - CURLE_UNSUPPORTED_PROTOCOL => 'CURLE_UNSUPPORTED_PROTOCOL', - CURLE_FAILED_INIT => 'CURLE_FAILED_INIT', - CURLE_URL_MALFORMAT => 'CURLE_URL_MALFORMAT', - CURLE_URL_MALFORMAT_USER => 'CURLE_URL_MALFORMAT_USER', - CURLE_COULDNT_RESOLVE_PROXY => 'CURLE_COULDNT_RESOLVE_PROXY', - CURLE_COULDNT_RESOLVE_HOST => 'CURLE_COULDNT_RESOLVE_HOST', + CURLE_ABORTED_BY_CALLBACK => 'CURLE_ABORTED_BY_CALLBACK', + CURLE_BAD_CALLING_ORDER => 'CURLE_BAD_CALLING_ORDER', + CURLE_BAD_CONTENT_ENCODING => 'CURLE_BAD_CONTENT_ENCODING', + CURLE_BAD_FUNCTION_ARGUMENT => 'CURLE_BAD_FUNCTION_ARGUMENT', + CURLE_BAD_PASSWORD_ENTERED => 'CURLE_BAD_PASSWORD_ENTERED', CURLE_COULDNT_CONNECT => 'CURLE_COULDNT_CONNECT', - CURLE_FTP_WEIRD_SERVER_REPLY => 'CURLE_FTP_WEIRD_SERVER_REPLY', - CURLE_REMOTE_ACCESS_DENIED => 'CURLE_REMOTE_ACCESS_DENIED', - CURLE_FTP_WEIRD_PASS_REPLY => 'CURLE_FTP_WEIRD_PASS_REPLY', - CURLE_FTP_WEIRD_PASV_REPLY => 'CURLE_FTP_WEIRD_PASV_REPLY', - CURLE_FTP_WEIRD_227_FORMAT => 'CURLE_FTP_WEIRD_227_FORMAT', + CURLE_COULDNT_RESOLVE_HOST => 'CURLE_COULDNT_RESOLVE_HOST', + CURLE_COULDNT_RESOLVE_PROXY => 'CURLE_COULDNT_RESOLVE_PROXY', + CURLE_FAILED_INIT => 'CURLE_FAILED_INIT', + CURLE_FILE_COULDNT_READ_FILE => 'CURLE_FILE_COULDNT_READ_FILE', + CURLE_FILESIZE_EXCEEDED => 'CURLE_FILESIZE_EXCEEDED', + CURLE_FTP_ACCESS_DENIED => 'CURLE_FTP_ACCESS_DENIED', + CURLE_FTP_BAD_DOWNLOAD_RESUME => 'CURLE_FTP_BAD_DOWNLOAD_RESUME', CURLE_FTP_CANT_GET_HOST => 'CURLE_FTP_CANT_GET_HOST', - CURLE_FTP_COULDNT_SET_TYPE => 'CURLE_FTP_COULDNT_SET_TYPE', - CURLE_PARTIAL_FILE => 'CURLE_PARTIAL_FILE', + CURLE_FTP_CANT_RECONNECT => 'CURLE_FTP_CANT_RECONNECT', + CURLE_FTP_COULDNT_GET_SIZE => 'CURLE_FTP_COULDNT_GET_SIZE', CURLE_FTP_COULDNT_RETR_FILE => 'CURLE_FTP_COULDNT_RETR_FILE', - CURLE_QUOTE_ERROR => 'CURLE_QUOTE_ERROR', - CURLE_HTTP_RETURNED_ERROR => 'CURLE_HTTP_RETURNED_ERROR', - CURLE_WRITE_ERROR => 'CURLE_WRITE_ERROR', - CURLE_UPLOAD_FAILED => 'CURLE_UPLOAD_FAILED', - CURLE_READ_ERROR => 'CURLE_READ_ERROR', - CURLE_OUT_OF_MEMORY => 'CURLE_OUT_OF_MEMORY', - CURLE_OPERATION_TIMEDOUT => 'CURLE_OPERATION_TIMEDOUT', - CURLE_FTP_PORT_FAILED => 'CURLE_FTP_PORT_FAILED', + CURLE_FTP_COULDNT_SET_ASCII => 'CURLE_FTP_COULDNT_SET_ASCII', + CURLE_FTP_COULDNT_SET_BINARY => 'CURLE_FTP_COULDNT_SET_BINARY', + CURLE_FTP_COULDNT_STOR_FILE => 'CURLE_FTP_COULDNT_STOR_FILE', CURLE_FTP_COULDNT_USE_REST => 'CURLE_FTP_COULDNT_USE_REST', - CURLE_RANGE_ERROR => 'CURLE_RANGE_ERROR', + CURLE_FTP_PORT_FAILED => 'CURLE_FTP_PORT_FAILED', + CURLE_FTP_QUOTE_ERROR => 'CURLE_FTP_QUOTE_ERROR', + CURLE_FTP_SSL_FAILED => 'CURLE_FTP_SSL_FAILED', + CURLE_FTP_USER_PASSWORD_INCORRECT => 'CURLE_FTP_USER_PASSWORD_INCORRECT', + CURLE_FTP_WEIRD_227_FORMAT => 'CURLE_FTP_WEIRD_227_FORMAT', + CURLE_FTP_WEIRD_PASS_REPLY => 'CURLE_FTP_WEIRD_PASS_REPLY', + CURLE_FTP_WEIRD_PASV_REPLY => 'CURLE_FTP_WEIRD_PASV_REPLY', + CURLE_FTP_WEIRD_SERVER_REPLY => 'CURLE_FTP_WEIRD_SERVER_REPLY', + CURLE_FTP_WEIRD_USER_REPLY => 'CURLE_FTP_WEIRD_USER_REPLY', + CURLE_FTP_WRITE_ERROR => 'CURLE_FTP_WRITE_ERROR', + CURLE_FUNCTION_NOT_FOUND => 'CURLE_FUNCTION_NOT_FOUND', + CURLE_GOT_NOTHING => 'CURLE_GOT_NOTHING', + CURLE_HTTP_NOT_FOUND => 'CURLE_HTTP_NOT_FOUND', + CURLE_HTTP_PORT_FAILED => 'CURLE_HTTP_PORT_FAILED', CURLE_HTTP_POST_ERROR => 'CURLE_HTTP_POST_ERROR', - CURLE_SSL_CONNECT_ERROR => 'CURLE_SSL_CONNECT_ERROR', - CURLE_BAD_DOWNLOAD_RESUME => 'CURLE_BAD_DOWNLOAD_RESUME', - CURLE_FILE_COULDNT_READ_FILE => 'CURLE_FILE_COULDNT_READ_FILE', + CURLE_HTTP_RANGE_ERROR => 'CURLE_HTTP_RANGE_ERROR', CURLE_LDAP_CANNOT_BIND => 'CURLE_LDAP_CANNOT_BIND', + CURLE_LDAP_INVALID_URL => 'CURLE_LDAP_INVALID_URL', CURLE_LDAP_SEARCH_FAILED => 'CURLE_LDAP_SEARCH_FAILED', - CURLE_FUNCTION_NOT_FOUND => 'CURLE_FUNCTION_NOT_FOUND', - CURLE_ABORTED_BY_CALLBACK => 'CURLE_ABORTED_BY_CALLBACK', - CURLE_BAD_FUNCTION_ARGUMENT => 'CURLE_BAD_FUNCTION_ARGUMENT', - CURLE_INTERFACE_FAILED => 'CURLE_INTERFACE_FAILED', - CURLE_TOO_MANY_REDIRECTS => 'CURLE_TOO_MANY_REDIRECTS', - CURLE_UNKNOWN_TELNET_OPTION => 'CURLE_UNKNOWN_TELNET_OPTION', - CURLE_TELNET_OPTION_SYNTAX => 'CURLE_TELNET_OPTION_SYNTAX', - CURLE_PEER_FAILED_VERIFICATION => 'CURLE_PEER_FAILED_VERIFICATION', - CURLE_GOT_NOTHING => 'CURLE_GOT_NOTHING', - CURLE_SSL_ENGINE_NOTFOUND => 'CURLE_SSL_ENGINE_NOTFOUND', - CURLE_SSL_ENGINE_SETFAILED => 'CURLE_SSL_ENGINE_SETFAILED', - CURLE_SEND_ERROR => 'CURLE_SEND_ERROR', + CURLE_LIBRARY_NOT_FOUND => 'CURLE_LIBRARY_NOT_FOUND', + CURLE_MALFORMAT_USER => 'CURLE_MALFORMAT_USER', + CURLE_OBSOLETE => 'CURLE_OBSOLETE', + CURLE_OPERATION_TIMEOUTED => 'CURLE_OPERATION_TIMEOUTED', + CURLE_OUT_OF_MEMORY => 'CURLE_OUT_OF_MEMORY', + CURLE_PARTIAL_FILE => 'CURLE_PARTIAL_FILE', + CURLE_READ_ERROR => 'CURLE_READ_ERROR', CURLE_RECV_ERROR => 'CURLE_RECV_ERROR', + CURLE_SEND_ERROR => 'CURLE_SEND_ERROR', + CURLE_SHARE_IN_USE => 'CURLE_SHARE_IN_USE', + CURLE_SSH => 'CURLE_SSH', + CURLE_SSL_CACERT => 'CURLE_SSL_CACERT', CURLE_SSL_CERTPROBLEM => 'CURLE_SSL_CERTPROBLEM', CURLE_SSL_CIPHER => 'CURLE_SSL_CIPHER', - CURLE_SSL_CACERT => 'CURLE_SSL_CACERT', - CURLE_BAD_CONTENT_ENCODING => 'CURLE_BAD_CONTENT_ENCODING', - CURLE_LDAP_INVALID_URL => 'CURLE_LDAP_INVALID_URL', - CURLE_FILESIZE_EXCEEDED => 'CURLE_FILESIZE_EXCEEDED', - CURLE_USE_SSL_FAILED => 'CURLE_USE_SSL_FAILED', - CURLE_SEND_FAIL_REWIND => 'CURLE_SEND_FAIL_REWIND', - CURLE_SSL_ENGINE_INITFAILED => 'CURLE_SSL_ENGINE_INITFAILED', - CURLE_LOGIN_DENIED => 'CURLE_LOGIN_DENIED', - CURLE_TFTP_NOTFOUND => 'CURLE_TFTP_NOTFOUND', - CURLE_TFTP_PERM => 'CURLE_TFTP_PERM', - CURLE_REMOTE_DISK_FULL => 'CURLE_REMOTE_DISK_FULL', - CURLE_TFTP_ILLEGAL => 'CURLE_TFTP_ILLEGAL', - CURLE_TFTP_UNKNOWNID => 'CURLE_TFTP_UNKNOWNID', - CURLE_REMOTE_FILE_EXISTS => 'CURLE_REMOTE_FILE_EXISTS', - CURLE_TFTP_NOSUCHUSER => 'CURLE_TFTP_NOSUCHUSER', - CURLE_CONV_FAILED => 'CURLE_CONV_FAILED', - CURLE_CONV_REQD => 'CURLE_CONV_REQD', - CURLE_SSL_CACERT_BADFILE => 'CURLE_SSL_CACERT_BADFILE', - CURLE_REMOTE_FILE_NOT_FOUND => 'CURLE_REMOTE_FILE_NOT_FOUND', - CURLE_SSH => 'CURLE_SSH', - CURLE_SSL_SHUTDOWN_FAILED => 'CURLE_SSL_SHUTDOWN_FAILED', - CURLE_AGAIN => 'CURLE_AGAIN', - CURLE_SSL_CRL_BADFILE => 'CURLE_SSL_CRL_BADFILE', - CURLE_SSL_ISSUER_ERROR => 'CURLE_SSL_ISSUER_ERROR', - CURLE_FTP_PRET_FAILED => 'CURLE_FTP_PRET_FAILED', - CURLE_RTSP_CSEQ_ERROR => 'CURLE_RTSP_CSEQ_ERROR', - CURLE_RTSP_SESSION_ERROR => 'CURLE_RTSP_SESSION_ERROR', - CURLE_FTP_BAD_FILE_LIST => 'CURLE_FTP_BAD_FILE_LIST', - CURLE_CHUNK_FAILED => 'CURLE_CHUNK_FAILED' + CURLE_SSL_CONNECT_ERROR => 'CURLE_SSL_CONNECT_ERROR', + CURLE_SSL_ENGINE_NOTFOUND => 'CURLE_SSL_ENGINE_NOTFOUND', + CURLE_SSL_ENGINE_SETFAILED => 'CURLE_SSL_ENGINE_SETFAILED', + CURLE_SSL_PEER_CERTIFICATE => 'CURLE_SSL_PEER_CERTIFICATE', + CURLE_TELNET_OPTION_SYNTAX => 'CURLE_TELNET_OPTION_SYNTAX', + CURLE_TOO_MANY_REDIRECTS => 'CURLE_TOO_MANY_REDIRECTS', + CURLE_UNKNOWN_TELNET_OPTION => 'CURLE_UNKNOWN_TELNET_OPTION', + CURLE_UNSUPPORTED_PROTOCOL => 'CURLE_UNSUPPORTED_PROTOCOL', + CURLE_URL_MALFORMAT => 'CURLE_URL_MALFORMAT', + CURLE_URL_MALFORMAT_USER => 'CURLE_URL_MALFORMAT_USER', + CURLE_WRITE_ERROR => 'CURLE_WRITE_ERROR' ); function __construct( $curl_error_code ) { - if( array_key_exists( $curl_error_code, self::$curl_errors ) ) + if( ! array_key_exists( $curl_error_code, self::$curl_errors ) ) throw new Exception( "Unknown \$curl_error_code: $curl_error_code" ); parent::__construct( self::$curl_errors[$curl_error_code], $curl_error_code ); From 9f6d38edbc09c1fa43da2b5bc71c4a1c6d070244 Mon Sep 17 00:00:00 2001 From: Kendall Hopkins Date: Fri, 2 Sep 2011 14:43:47 -0400 Subject: [PATCH 05/10] Include error message in throw exception. --- lib/curl.php | 2 +- lib/curl_exception.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/curl.php b/lib/curl.php index 7083144..5be834b 100644 --- a/lib/curl.php +++ b/lib/curl.php @@ -157,7 +157,7 @@ function request($method, $url, $vars = array()) { $this->set_request_headers(); $response = curl_exec($this->request); - if (!$response) throw new CurlException(curl_errno($this->request)); + if (!$response) throw new CurlException(curl_error($this->request), curl_errno($this->request)); $response = new CurlResponse($response); diff --git a/lib/curl_exception.php b/lib/curl_exception.php index b410904..9313fc0 100644 --- a/lib/curl_exception.php +++ b/lib/curl_exception.php @@ -71,12 +71,12 @@ class CurlException extends Exception CURLE_WRITE_ERROR => 'CURLE_WRITE_ERROR' ); - function __construct( $curl_error_code ) + function __construct( $curl_error_message, $curl_error_code ) { if( ! array_key_exists( $curl_error_code, self::$curl_errors ) ) throw new Exception( "Unknown \$curl_error_code: $curl_error_code" ); - parent::__construct( self::$curl_errors[$curl_error_code], $curl_error_code ); + parent::__construct( self::$curl_errors[$curl_error_code].": $curl_error_message", $curl_error_code ); } } \ No newline at end of file From 786905d1785866dc3a35e9a84a47efc7309e72f8 Mon Sep 17 00:00:00 2001 From: Hugo Chinchilla Carbonell Date: Tue, 20 Dec 2011 12:18:27 +0100 Subject: [PATCH 06/10] Handle multiple response headers when following a redirection --- lib/curl_response.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/curl_response.php b/lib/curl_response.php index 324bafd..063fac8 100644 --- a/lib/curl_response.php +++ b/lib/curl_response.php @@ -43,7 +43,12 @@ function __construct($response) { $headers_string = array_pop($matches[0]); $headers = explode("\r\n", str_replace("\r\n\r\n", '', $headers_string)); - # Remove headers from the response body + # Inlude all received headers in the $headers_string + while (count($matches[0])) { + $headers_string = array_pop($matches[0]).$headers_string; + } + + # Remove all headers from the response body $this->body = str_replace($headers_string, '', $response); # Extract the version and status from the first header From 9cefbb5a6b4ffa0ac35b06e2596eed438df9fa47 Mon Sep 17 00:00:00 2001 From: Hugo Chinchilla Carbonell Date: Tue, 20 Dec 2011 13:08:08 +0100 Subject: [PATCH 07/10] Fixed errors caused from the merge of https://github.com/SimpleUpdates/curl.git --- lib/curl.php | 11 ++++++----- test/unit/curl_test.php | 6 ++++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/curl.php b/lib/curl.php index 08eedac..fac4e9e 100644 --- a/lib/curl.php +++ b/lib/curl.php @@ -59,7 +59,7 @@ class Curl { * @access protected **/ protected $request; - + /** * Initializes a Curl object * @@ -148,17 +148,18 @@ function put($url, $vars = array()) { * @param array|string $vars * @return CurlResponse|boolean **/ - function request($method, $url, $vars = array(), $enctype = NULL) { - $this->error = ''; + function request($method, $url, $vars = array(), $enctype = null) { $this->request = curl_init(); - if (is_array($vars) && $encytype != 'multipart/form-data') $vars = http_build_query($vars, '', '&'); + if (is_array($vars) && $enctype != 'multipart/form-data') $vars = http_build_query($vars, '', '&'); $this->set_request_method($method); $this->set_request_options($url, $vars); $this->set_request_headers(); $response = curl_exec($this->request); - if (!$response) throw new CurlException(curl_error($this->request), curl_errno($this->request)); + if (!$response) { + throw new CurlException(curl_error($this->request), curl_errno($this->request)); + } $response = new CurlResponse($response); diff --git a/test/unit/curl_test.php b/test/unit/curl_test.php index 2324947..3591e20 100644 --- a/test/unit/curl_test.php +++ b/test/unit/curl_test.php @@ -13,8 +13,10 @@ function test_get() { } function test_error() { - $this->curl->get('diaewkaksdljf-invalid-url-dot-com.com'); - assert_not_empty($this->curl->error()); + assert_throws('CurlException', function() { + $curl = new Curl(); + $curl->get('diaewkaksdljf-invalid-url-dot-com.com'); + }); } } \ No newline at end of file From 67caeda853b49dd1433bb2ca4feff12eb03b81d0 Mon Sep 17 00:00:00 2001 From: Hugo Chinchilla Carbonell Date: Tue, 20 Dec 2011 15:06:56 +0100 Subject: [PATCH 08/10] Added support for HTTP basic authentication --- lib/curl.php | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/lib/curl.php b/lib/curl.php index fac4e9e..b5d0991 100644 --- a/lib/curl.php +++ b/lib/curl.php @@ -59,6 +59,14 @@ class Curl { * @access protected **/ protected $request; + + /** + * Stores the HTTP auth credentials + * + * @var $userpwd + * @access protected + **/ + protected $userpwd; /** * Initializes a Curl object @@ -168,6 +176,24 @@ function request($method, $url, $vars = array(), $enctype = null) { return $response; } + /** + * Sets the user and password for HTTP auth basic authentication method. + * + * @param string|null $username + * @param string|null $password + * @return Curl + */ + function setAuth($username, $password=null) + { + if (null === $username) { + $this->userpwd = null; + return $this; + } + + $this->userpwd = $username.':'.$password; + return $this; + } + /** * Formats and adds custom headers to the current request * @@ -227,6 +253,12 @@ protected function set_request_options($url, $vars) { } if ($this->follow_redirects) curl_setopt($this->request, CURLOPT_FOLLOWLOCATION, true); if ($this->referer) curl_setopt($this->request, CURLOPT_REFERER, $this->referer); + if ($this->userpwd) { + curl_setopt($this->request, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); + curl_setopt($this->request, CURLOPT_USERPWD, $this->userpwd); + } else { + curl_setopt($this->request, CURLOPT_HTTPAUTH, false); + } # Set any custom CURL options foreach ($this->options as $option => $value) { From f70be617288429e9e4e2229515e3c189c2f978d3 Mon Sep 17 00:00:00 2001 From: Hugo Chinchilla Carbonell Date: Wed, 21 Dec 2011 18:33:20 +0100 Subject: [PATCH 09/10] Added ztest as submodule --- .gitmodules | 3 +++ test/ztest | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 test/ztest diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..c782e85 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "test/ztest"] + path = test/ztest + url = git://github.com/jaz303/ztest.git diff --git a/test/ztest b/test/ztest new file mode 160000 index 0000000..0a31703 --- /dev/null +++ b/test/ztest @@ -0,0 +1 @@ +Subproject commit 0a31703d3c5f80c17ff1ce755893e5ba79a863ea From 5962b52b8cde52dbae87ed3901a0de88c757cb0e Mon Sep 17 00:00:00 2001 From: ide user ide_hamstar Date: Sat, 2 Jun 2012 20:57:42 +0000 Subject: [PATCH 10/10] added composer spec with the name shuber/curl --- composer.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 composer.json diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..1cd90dc --- /dev/null +++ b/composer.json @@ -0,0 +1,7 @@ +{ + "name": "shuber/curl", + "license": "MIT", + "keywords": ["curl","spider", "bot", "scraper"], + "type": "library", + "description": "PHP Wrapper for Curl" +} \ No newline at end of file