<?php
class
HttpRequest{
private
$_ip
=
''
;
private
$_host
=
''
;
private
$_url
=
''
;
private
$_port
=
''
;
private
$_errno
=
''
;
private
$_errstr
=
''
;
private
$_timeout
= 15;
private
$_fp
= null;
private
$_formdata
=
array
();
private
$_filedata
=
array
();
public
function
setConfig(
$config
){
$this
->_ip = isset(
$config
[
'ip'
])?
$config
[
'ip'
] :
''
;
$this
->_host = isset(
$config
[
'host'
])?
$config
[
'host'
] :
''
;
$this
->_url = isset(
$config
[
'url'
])?
$config
[
'url'
] :
''
;
$this
->_port = isset(
$config
[
'port'
])?
$config
[
'port'
] :
''
;
$this
->_errno = isset(
$config
[
'errno'
])?
$config
[
'errno'
] :
''
;
$this
->_errstr = isset(
$config
[
'errstr'
])?
$config
[
'errstr'
] :
''
;
$this
->_timeout = isset(
$confg
[
'timeout'
])?
$confg
[
'timeout'
] : 15;
if
(
$this
->_ip==
''
){
$this
->_ip =
$this
->_host;
}
}
public
function
setFormData(
$formdata
=
array
()){
$this
->_formdata =
$formdata
;
}
public
function
setFileData(
$filedata
=
array
()){
$this
->_filedata =
$filedata
;
}
public
function
send(
$type
=
'get'
){
$type
=
strtolower
(
$type
);
if
(!in_array(
$type
,
array
(
'get'
,
'post'
,
'multipart'
))){
return
false;
}
if
(
$this
->connect()){
switch
(
$type
){
case
'get'
:
$out
=
$this
->sendGet();
break
;
case
'post'
:
$out
=
$this
->sendPost();
break
;
case
'multipart'
:
$out
=
$this
->sendMultipart();
break
;
}
if
(!
$out
){
return
false;
}
fputs
(
$this
->_fp,
$out
);
$response
=
''
;
while
(
$row
=
fread
(
$this
->_fp, 4096)){
$response
.=
$row
;
}
$this
->disconnect();
$pos
=
strpos
(
$response
,
"\r\n\r\n"
);
$response
=
substr
(
$response
,
$pos
+4);
return
$response
;
}
else
{
return
false;
}
}
private
function
connect(){
$this
->_fp =
fsockopen
(
$this
->_ip,
$this
->_port,
$this
->_errno,
$this
->_errstr,
$this
->_timeout);
if
(!
$this
->_fp){
return
false;
}
return
true;
}
private
function
disconnect(){
if
(
$this
->_fp!=null){
fclose(
$this
->_fp);
$this
->_fp = null;
}
}
private
function
sendGet(){
if
(!
$this
->_formdata){
return
false;
}
$url
=
$this
->_url.
'?'
.http_build_query(
$this
->_formdata);
$out
=
"GET "
.
$url
.
" http/1.1\r\n"
;
$out
.=
"host: "
.
$this
->_host.
"\r\n"
;
$out
.=
"connection: close\r\n\r\n"
;
return
$out
;
}
private
function
sendPost(){
if
(!
$this
->_formdata && !
$this
->_filedata){
return
false;
}
$data
=
$this
->_formdata?
$this
->_formdata :
array
();
if
(
$this
->_filedata){
foreach
(
$this
->_filedata
as
$filedata
){
if
(
file_exists
(
$filedata
[
'path'
])){
$data
[
$filedata
[
'name'
]] =
file_get_contents
(
$filedata
[
'path'
]);
}
}
}
if
(!
$data
){
return
false;
}
$data
= http_build_query(
$data
);
$out
=
"POST "
.
$this
->_url.
" http/1.1\r\n"
;
$out
.=
"host: "
.
$this
->_host.
"\r\n"
;
$out
.=
"content-type: application/x-www-form-urlencoded\r\n"
;
$out
.=
"content-length: "
.
strlen
(
$data
).
"\r\n"
;
$out
.=
"connection: close\r\n\r\n"
;
$out
.=
$data
;
return
$out
;
}
private
function
sendMultipart(){
if
(!
$this
->_formdata && !
$this
->_filedata){
return
false;
}
srand((double)microtime()*1000000);
$boundary
=
'---------------------------'
.
substr
(md5(rand(0,32000)),0,10);
$data
=
'--'
.
$boundary
.
"\r\n"
;
$formdata
=
''
;
foreach
(
$this
->_formdata
as
$key
=>
$val
){
$formdata
.=
"content-disposition: form-data; name=\""
.
$key
.
"\"\r\n"
;
$formdata
.=
"content-type: text/plain\r\n\r\n"
;
if
(
is_array
(
$val
)){
$formdata
.= json_encode(
$val
).
"\r\n"
;
}
else
{
$formdata
.= rawurlencode(
$val
).
"\r\n"
;
}
$formdata
.=
'--'
.
$boundary
.
"\r\n"
;
}
$filedata
=
''
;
foreach
(
$this
->_filedata
as
$val
){
if
(
file_exists
(
$val
[
'path'
])){
$filedata
.=
"content-disposition: form-data; name=\""
.
$val
[
'name'
].
"\"; filename=\""
.
$val
[
'filename'
].
"\"\r\n"
;
$filedata
.=
"content-type: "
.mime_content_type(
$val
[
'path'
]).
"\r\n\r\n"
;
$filedata
.= implode(
''
, file(
$val
[
'path'
])).
"\r\n"
;
$filedata
.=
'--'
.
$boundary
.
"\r\n"
;
}
}
if
(!
$formdata
&& !
$filedata
){
return
false;
}
$data
.=
$formdata
.
$filedata
.
"--\r\n\r\n"
;
$out
=
"POST "
.
$this
->_url.
" http/1.1\r\n"
;
$out
.=
"host: "
.
$this
->_host.
"\r\n"
;
$out
.=
"content-type: multipart/form-data; boundary="
.
$boundary
.
"\r\n"
;
$out
.=
"content-length: "
.
strlen
(
$data
).
"\r\n"
;
$out
.=
"connection: close\r\n\r\n"
;
$out
.=
$data
;
return
$out
;
}
}
?>