php-curlパッケージ[ファイルの二義性Bugをアップロードしない]

8652 ワード

phpのcurlはcurl_にあるのでsetopt($curl,CURLOPT_POSTIELDS,xxx)の場合、xxxが配列である場合、値の最初の文字が@である場合はファイルアップロードとみなし、同時にファイルアップロードが必要である場合は、先頭文字が@である可能性のある他の一般的なデータを提出する必要がある場合に衝突する.そこでapi_common.phpにおけるpostデータの設定をカプセル化
<?php
/**
 * php-curl   
 * author: selfimpr
 * blog: http://blog.csdn.net/lgg201
 * mail: [email protected]
 */

define('API_CURL_UPLOAD_FILE',							'__file');

#       
define('REQUEST_METHOD_GET',							'GET');
define('REQUEST_METHOD_POST',							'POST');
define('REQUEST_METHOD_HEAD',							'HEAD');

#    
define('REQUEST_BEHAVIOR_ALLOW_REDIRECT',				'allow_redirect');
define('REQUEST_BEHAVIOR_MAX_REDIRECT',					'max_redirect');
define('REQUEST_BEHAVIOR_USER_AGENT',					'user_agent');
define('REQUEST_BEHAVIOR_AUTOREFERER',					'autoreferer');
define('REQUEST_BEHAVIOR_UPLOAD',						'upload');
define('REQUEST_BEHAVIOR_CONNECTTIMEOUT',				'connecttimeout');
define('REQUEST_BEHAVIOR_DNS_CACHE_TIMEOUT',			'dns_cache_timeout');
define('REQUEST_BEHAVIOR_TIMEOUT',						'timeout');
define('REQUEST_BEHAVIOR_ENCODING',						'encoding');
define('REQUEST_BEHAVIOR_ERROR_HANDLER',				'error_handler');
define('REQUEST_BEHAVIORS',								'behaviors');
$GLOBALS[REQUEST_BEHAVIORS]	= array(
	REQUEST_BEHAVIOR_ALLOW_REDIRECT				=> TRUE, 
	REQUEST_BEHAVIOR_MAX_REDIRECT				=> 5, 
	REQUEST_BEHAVIOR_USER_AGENT					=> 'curl-lib', 
	REQUEST_BEHAVIOR_AUTOREFERER				=> TRUE, 
	REQUEST_BEHAVIOR_UPLOAD						=> FALSE, 
	REQUEST_BEHAVIOR_CONNECTTIMEOUT				=> 3, 
	REQUEST_BEHAVIOR_DNS_CACHE_TIMEOUT			=> 3600, 
	REQUEST_BEHAVIOR_TIMEOUT					=> 3, 
	REQUEST_BEHAVIOR_ENCODING					=> 'gzip', 
	REQUEST_BEHAVIOR_ERROR_HANDLER				=> '__default_curl_error_handler', 
);

define('MULTIPART_FORM_DATA_HEAD_FMT',				'Content-Type: multipart/form-data; boundary=----------------------------%s');
define('MULTIPART_FORM_DATA_BODY_STRING',			"------------------------------%s\r
Content-Disposition: form-data; name=\"%s\"\r
\r
%s\r
"); define('MULTIPART_FORM_DATA_BODY_FILE', "------------------------------%s\r
Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r
Content-Type: application/octet-stream\r
\r
%s\r
"); define('MULTIPART_FORM_DATA_BODY_END', "------------------------------%s--\r
\r
"); # define('RESP_CODE', 'resp_code'); define('RESP_BODY', 'resp_body'); define('RESP_HEADER', 'resp_header'); #HTTP 1xx define('HTTP_1XX_RESP', '/^HTTP\/1.[01] 1\d{2} \w+/'); # define('E_CURL_ERROR_FMT', 'curl "%s" error[%d]: %s'); # curl function __default_curl_error_handler($curl, $url, $errno, $errstr) { trigger_error(sprintf(E_CURL_ERROR_FMT, $url, $errno, $errstr), E_USER_ERROR); } # CURL function __method_switch($curl, $method) { switch ( $method) { case REQUEST_METHOD_POST: __curl_setopt($curl, CURLOPT_POST, TRUE); break; case REQUEST_METHOD_HEAD: __curl_setopt($curl, CURLOPT_NOBODY, TRUE); break; case REQUEST_METHOD_GET: __curl_setopt($curl, CURLOPT_HTTPGET, TRUE); break; default: break; } } # function __default_header_set($curl) { __curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); __curl_setopt($curl, CURLOPT_HEADER, TRUE); __curl_setopt($curl, CURLOPT_FOLLOWLOCATION, (bool)curl_behavior(REQUEST_BEHAVIOR_ALLOW_REDIRECT)); __curl_setopt($curl, CURLOPT_MAXREDIRS, (int)curl_behavior(REQUEST_BEHAVIOR_MAX_REDIRECT)); __curl_setopt($curl, CURLOPT_USERAGENT, (string)curl_behavior(REQUEST_BEHAVIOR_USER_AGENT)); __curl_setopt($curl, CURLOPT_AUTOREFERER, (bool)curl_behavior(REQUEST_BEHAVIOR_AUTOREFERER)); __curl_setopt($curl, CURLOPT_UPLOAD, (bool)curl_behavior(REQUEST_BEHAVIOR_UPLOAD)); __curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, (int)curl_behavior(REQUEST_BEHAVIOR_CONNECTTIMEOUT)); __curl_setopt($curl, CURLOPT_DNS_CACHE_TIMEOUT, (int)curl_behavior(REQUEST_BEHAVIOR_DNS_CACHE_TIMEOUT)); __curl_setopt($curl, CURLOPT_TIMEOUT, (int)curl_behavior(REQUEST_BEHAVIOR_TIMEOUT)); __curl_setopt($curl, CURLOPT_ENCODING, (string)curl_behavior(REQUEST_BEHAVIOR_ENCODING)); } # function __custom_header_set($curl, $headers = NULL) { if ( empty($headers) ) return ; if ( is_string($headers) ) $headers = explode("\r
", $headers); # foreach ( $headers as &$header ) if ( is_array($header) ) $header = sprintf('%s: %s', $header[0], $header[1]); __curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); } # body function __datas_set($curl, $datas = NULL) { if ( empty($datas) ) return ; if ( is_array($datas) ) { $custom_body = FALSE; $uniqid = uniqid(); $custom_body_str = ''; foreach ( $datas as $name => $data ) { if ( is_array($data) && array_key_exists(API_CURL_UPLOAD_FILE, $data) ) { $file = $data[API_CURL_UPLOAD_FILE]; if ( file_exists($file) ) { $custom_body = TRUE; $custom_body_str .= sprintf(MULTIPART_FORM_DATA_BODY_FILE, $uniqid, $name, $file, file_get_contents($file)); } } else { $custom_body_str .= sprintf(MULTIPART_FORM_DATA_BODY_STRING, $uniqid, $name, $data); } } if ( $custom_body ) { curl_setopt($curl, CURLOPT_HTTPHEADER, array(sprintf(MULTIPART_FORM_DATA_HEAD_FMT, $uniqid))); $datas = $custom_body_str . sprintf(MULTIPART_FORM_DATA_BODY_END, $uniqid); } } __curl_setopt($curl, CURLOPT_POSTFIELDS, $datas); } # curl_setopt function __curl_setopt($curl, $optname, $optval) { curl_setopt($curl, $optname, $optval); __curl_error($curl); } #curl function __curl_error($curl) { if ( curl_errno($curl) ) { $url = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL); $errno = curl_errno($curl); $errstr = curl_error($curl); $errh = curl_behavior(REQUEST_BEHAVIOR_ERROR_HANDLER); if ( function_exists($errh) ) $errh($curl, $url, $errno, $errstr); } } #api function curl_behavior($names, $values = NULL) { if ( !is_string($names) && !is_array($names) ) return ; if ( !is_null($values) ) { if ( is_string($names) ) $GLOBALS[REQUEST_BEHAVIORS][$names] = $values; else if ( is_array($names) && !is_array($values) ) foreach ( $names as $name ) $GLOBALS[REQUEST_BEHAVIORS][$name] = $values; else if ( is_array($names) && is_array($values) ) foreach ( $names as $k => $name ) $GLOBALS[REQUEST_BEHAVIORS][$name] = $values[$k]; } if ( is_string($names) ) { $return = $GLOBALS[REQUEST_BEHAVIORS][$names]; } else if ( is_array($names) ) { $return = array(); foreach ( $names as $name ) $return[$name] = array_key_exists($name, $GLOBALS[REQUEST_BEHAVIORS]) ? $GLOBALS[REQUEST_BEHAVIORS][$name] : NULL; } return $return; } # function curl_request($url, $method, $datas = NULL, $headers = NULL) { $curl = curl_init($url); __method_switch($curl, $method); __default_header_set($curl); __custom_header_set($curl, $headers); __datas_set($curl, $datas); $response = curl_exec($curl); __curl_error($curl); $status_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); $components = explode("\r
\r
", $response); $i = -1; while ( ++ $i < count($components) ) if ( !preg_match(HTTP_1XX_RESP, $components[$i]) ) break; $headers = $components[$i]; $body = implode("\r
\r
", array_slice($components, $i + 1)); return array( RESP_CODE => $status_code, RESP_HEADER => $headers, RESP_BODY => $body, ); } #GET function curl_get($url, $headers = NULL) { return curl_request($url, REQUEST_METHOD_GET, NULL, $headers); } #POST function curl_post($url, $datas = NULL, $headers = NULL) { return curl_request($url, REQUEST_METHOD_POST, $datas, $headers); } #HEAD function curl_head($url, $headers = NULL) { return curl_request($url, REQUEST_METHOD_HEAD, NULL, $headers); } # function curl_post_file($file) { return array( API_CURL_UPLOAD_FILE => $file, ); } # function curl_resp_code($resp) { return $resp[RESP_CODE]; } # function curl_resp_header($resp) { return $resp[RESP_HEADER]; } # function curl_resp_body($resp) { return $resp[RESP_BODY]; }