📄 request.php
字号:
// set '/' instead of empty path rather than check later (see bug #8662)
if (empty($this->_url->path)) {
$this->_url->path = '/';
}
}
/**
* Returns the current request URL
*
* @return string Current request URL
* @access public
*/
function getUrl($url)
{
return empty($this->_url)? '': $this->_url->getUrl();
}
/**
* Sets a proxy to be used
*
* @param string Proxy host
* @param int Proxy port
* @param string Proxy username
* @param string Proxy password
* @access public
*/
function setProxy($host, $port = 8080, $user = null, $pass = null)
{
$this->_proxy_host = $host;
$this->_proxy_port = $port;
$this->_proxy_user = $user;
$this->_proxy_pass = $pass;
if (!empty($user)) {
$this->addHeader('Proxy-Authorization', 'Basic ' . base64_encode($user . ':' . $pass));
}
}
/**
* Sets basic authentication parameters
*
* @param string Username
* @param string Password
*/
function setBasicAuth($user, $pass)
{
$this->_user = $user;
$this->_pass = $pass;
$this->addHeader('Authorization', 'Basic ' . base64_encode($user . ':' . $pass));
}
/**
* Sets the method to be used, GET, POST etc.
*
* @param string Method to use. Use the defined constants for this
* @access public
*/
function setMethod($method)
{
$this->_method = $method;
}
/**
* Sets the HTTP version to use, 1.0 or 1.1
*
* @param string Version to use. Use the defined constants for this
* @access public
*/
function setHttpVer($http)
{
$this->_http = $http;
}
/**
* Adds a request header
*
* @param string Header name
* @param string Header value
* @access public
*/
function addHeader($name, $value)
{
$this->_requestHeaders[strtolower($name)] = $value;
}
/**
* Removes a request header
*
* @param string Header name to remove
* @access public
*/
function removeHeader($name)
{
if (isset($this->_requestHeaders[strtolower($name)])) {
unset($this->_requestHeaders[strtolower($name)]);
}
}
/**
* Adds a querystring parameter
*
* @param string Querystring parameter name
* @param string Querystring parameter value
* @param bool Whether the value is already urlencoded or not, default = not
* @access public
*/
function addQueryString($name, $value, $preencoded = false)
{
$this->_url->addQueryString($name, $value, $preencoded);
}
/**
* Sets the querystring to literally what you supply
*
* @param string The querystring data. Should be of the format foo=bar&x=y etc
* @param bool Whether data is already urlencoded or not, default = already encoded
* @access public
*/
function addRawQueryString($querystring, $preencoded = true)
{
$this->_url->addRawQueryString($querystring, $preencoded);
}
/**
* Adds postdata items
*
* @param string Post data name
* @param string Post data value
* @param bool Whether data is already urlencoded or not, default = not
* @access public
*/
function addPostData($name, $value, $preencoded = false)
{
if ($preencoded) {
$this->_postData[$name] = $value;
} else {
$this->_postData[$name] = $this->_arrayMapRecursive('urlencode', $value);
}
}
/**
* Recursively applies the callback function to the value
*
* @param mixed Callback function
* @param mixed Value to process
* @access private
* @return mixed Processed value
*/
function _arrayMapRecursive($callback, $value)
{
if (!is_array($value)) {
return call_user_func($callback, $value);
} else {
$map = array();
foreach ($value as $k => $v) {
$map[$k] = $this->_arrayMapRecursive($callback, $v);
}
return $map;
}
}
/**
* Adds a file to upload
*
* This also changes content-type to 'multipart/form-data' for proper upload
*
* @access public
* @param string name of file-upload field
* @param mixed file name(s)
* @param mixed content-type(s) of file(s) being uploaded
* @return bool true on success
* @throws PEAR_Error
*/
function addFile($inputName, $fileName, $contentType = 'application/octet-stream')
{
if (!is_array($fileName) && !is_readable($fileName)) {
return PEAR::raiseError("File '{$fileName}' is not readable");
} elseif (is_array($fileName)) {
foreach ($fileName as $name) {
if (!is_readable($name)) {
return PEAR::raiseError("File '{$name}' is not readable");
}
}
}
$this->addHeader('Content-Type', 'multipart/form-data');
$this->_postFiles[$inputName] = array(
'name' => $fileName,
'type' => $contentType
);
return true;
}
/**
* Adds raw postdata (DEPRECATED)
*
* @param string The data
* @param bool Whether data is preencoded or not, default = already encoded
* @access public
* @deprecated deprecated since 1.3.0, method setBody() should be used instead
*/
function addRawPostData($postdata, $preencoded = true)
{
$this->_body = $preencoded ? $postdata : urlencode($postdata);
}
/**
* Sets the request body (for POST, PUT and similar requests)
*
* @param string Request body
* @access public
*/
function setBody($body)
{
$this->_body = $body;
}
/**
* Clears any postdata that has been added (DEPRECATED).
*
* Useful for multiple request scenarios.
*
* @access public
* @deprecated deprecated since 1.2
*/
function clearPostData()
{
$this->_postData = null;
}
/**
* Appends a cookie to "Cookie:" header
*
* @param string $name cookie name
* @param string $value cookie value
* @access public
*/
function addCookie($name, $value)
{
$cookies = isset($this->_requestHeaders['cookie']) ? $this->_requestHeaders['cookie']. '; ' : '';
$this->addHeader('Cookie', $cookies . $name . '=' . $value);
}
/**
* Clears any cookies that have been added (DEPRECATED).
*
* Useful for multiple request scenarios
*
* @access public
* @deprecated deprecated since 1.2
*/
function clearCookies()
{
$this->removeHeader('Cookie');
}
/**
* Sends the request
*
* @access public
* @param bool Whether to store response body in Response object property,
* set this to false if downloading a LARGE file and using a Listener
* @return mixed PEAR error on error, true otherwise
*/
function sendRequest($saveBody = true)
{
if (!is_a($this->_url, 'Net_URL')) {
return PEAR::raiseError('No URL given.');
}
$host = isset($this->_proxy_host) ? $this->_proxy_host : $this->_url->host;
$port = isset($this->_proxy_port) ? $this->_proxy_port : $this->_url->port;
// 4.3.0 supports SSL connections using OpenSSL. The function test determines
// we running on at least 4.3.0
if (strcasecmp($this->_url->protocol, 'https') == 0 AND function_exists('file_get_contents') AND extension_loaded('openssl')) {
if (isset($this->_proxy_host)) {
return PEAR::raiseError('HTTPS proxies are not supported.');
}
$host = 'ssl://' . $host;
}
// magic quotes may fuck up file uploads and chunked response processing
$magicQuotes = ini_get('magic_quotes_runtime');
ini_set('magic_quotes_runtime', false);
// RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive
// connection token to a proxy server...
if (isset($this->_proxy_host) && !empty($this->_requestHeaders['connection']) &&
'Keep-Alive' == $this->_requestHeaders['connection'])
{
$this->removeHeader('connection');
}
$keepAlive = (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http && empty($this->_requestHeaders['connection'])) ||
(!empty($this->_requestHeaders['connection']) && 'Keep-Alive' == $this->_requestHeaders['connection']);
$sockets = &PEAR::getStaticProperty('HTTP_Request', 'sockets');
$sockKey = $host . ':' . $port;
unset($this->_sock);
// There is a connected socket in the "static" property?
if ($keepAlive && !empty($sockets[$sockKey]) &&
!empty($sockets[$sockKey]->fp))
{
$this->_sock =& $sockets[$sockKey];
$err = null;
} else {
$this->_notify('connect');
$this->_sock =& new Net_Socket();
$err = $this->_sock->connect($host, $port, null, $this->_timeout, $this->_socketOptions);
}
PEAR::isError($err) or $err = $this->_sock->write($this->_buildRequest());
if (!PEAR::isError($err)) {
if (!empty($this->_readTimeout)) {
$this->_sock->setTimeout($this->_readTimeout[0], $this->_readTimeout[1]);
}
$this->_notify('sentRequest');
// Read the response
$this->_response = &new HTTP_Response($this->_sock, $this->_listeners);
$err = $this->_response->process(
$this->_saveBody && $saveBody,
HTTP_REQUEST_METHOD_HEAD != $this->_method
);
if ($keepAlive) {
$keepAlive = (isset($this->_response->_headers['content-length'])
|| (isset($this->_response->_headers['transfer-encoding'])
&& strtolower($this->_response->_headers['transfer-encoding']) == 'chunked'));
if ($keepAlive) {
if (isset($this->_response->_headers['connection'])) {
$keepAlive = strtolower($this->_response->_headers['connection']) == 'keep-alive';
} else {
$keepAlive = 'HTTP/'.HTTP_REQUEST_HTTP_VER_1_1 == $this->_response->_protocol;
}
}
}
}
ini_set('magic_quotes_runtime', $magicQuotes);
if (PEAR::isError($err)) {
return $err;
}
if (!$keepAlive) {
$this->disconnect();
// Store the connected socket in "static" property
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -