|
Познающий
Регистрация: 07.02.2010
Сообщений: 70
Провел на форуме: 217996
Репутация:
56
|
|
считай, готовое решение
^_WhitE_DeMoN_^,
написал передачу файла по посту по кускам (ограничение размера файла - 2 гига ровно минус 1 байт)
Да и пост у меня по кускам  собирай..
PHP код:
function pro_HTTP_($SOCKET, $HEAD, &$CONTENT){
$SOCKETs=array(
'Socket-Address'=>'localhost',
'Socket-Port'=>80,
'Socket-Timeout'=>10,
'Socket-DownLimit'=>null // null-без лимита
);
$HEADs=array(
// САМЫЕ ОСНОВНЫЕ :)
'Method'=>null, // если не указано, устанавливается автоматически GET или POST [GET POST PUT OPTIONS HEAD DELETE PATCH TRACE LINK UNLINK]
'URI'=>'/',
'HTTP'=>'HTTP/1.1',
// ОСНОВНЫЕ // Знак ? означает, что заголовок не фильтруется и всё, что вы через него передадите, выведется в чистом виде
// Формат даты (пример): Sun, 06 Nov 1994 08:49:37 GMT
'Cache-Control'=>null, //? Основные директивы для управления кэшированием.
'Connection'=>false, // Сведения о проведении соединения // false=Close;true=Keep-Alive;если число, то добавляется Keep-Alive: с этим числом
'Date'=>null, //? Дата генерации отклика.
'MIME-Version'=>null, //? Версия протокола MIME по которому было сформировано сообщение.
'Pragma'=>null, //? Особенные опции выполнения операции.
'Trailer'=>null, //? Список полей, имеющих отношение к кодированию сообщения при передаче.
'Transfer-Encoding'=>null, //? Список способов кодирования, которые были применены к сообщению для передачи.
'Upgrade'=>null, //? Список предлагаемых клиентом протоколов. Сервер указывает один протокол.
'Via'=>null, //? Список версий протокола, названий и версий прокси-серверов через которых прошло сообщение.
'Warning'=>null, //? Код, агент, сообщение и дата если возникла критическая ситуация.
// ЗАПРОС
'Accept'=>null, // Список допустимых форматов ресурса.
'Accept-Charset'=>null, //? Перечень поддерживаемых кодировок для предоставления пользователю
'Accept-Encoding'=>null, //? Перечень поддерживаемых способов кодирования содержимого сущности при передаче.[gzip,deflate],compress,x-gzip,x-compress
'Accept-Language'=>null, // Список поддерживаемых естественных языков.
/* */ 'Authorization'=>null, //! Данные для авторизации.
'Expect'=>null, //? HTTP/1.1v2 Указывает серверу что клиент ожидает от него дополнительного действия.
'From'=>null, // Адрес электронной почты ответственного лица со стороны клиента.
'Host'=>true, // Доменное имя и порт хоста запрашиваемого ресурса. Необходимо для поддержки виртуального хостинга на серверах.// Если true, то заполняется из сокета
'If-Match'=>null, //? Список тегов версий сущности. Выполнять метод если они существуют.
'If-Modified-Since'=>null, //? Дата. Выполнять метод если сущность изменилась с указанного момента. Используется только для метода обработки GET
'If-None-Match'=>null, //? Список тегов версий сущности. Выполнять метод если ни одного из них не существует.
'If-Range'=>null, //? Список тегов версий сущности или дата для определённого фрагмента сущности.
'If-Unmodified-Since'=>null, //? Дата. Выполнять метод если сущность не изменилась с указанной даты.
'Max-Forwards'=>null, //? Максимально допустимое количество переходов через прокси.
/* */ 'Proxy-Authorization'=>null, //! Информация для авторизации на прокси-сервере.
'Range'=>null, // Байтовые диапазоны для запроса фрагментов ресурса. Подробности: Частичные GET. [bytes=64397516-80496894]
'Referer'=>null, // URI ресурса, после которого клиент сделал текущий запрос.// если true, то берётся из адреса
'TE'=>null, //? HTTP/1.1v2 Список расширенных способов кодирования при передаче.
'User-Agent'=>null, //? Список названий и версий клиента и его компонентов с комментариями.
// СОДЕРЖИМОЕ (СУЩНОСТИ) CONTENT
'Content-Disposition'=>null, //? Способ распределения сущностей в сообщении при передачи нескольких фрагментов.
'Content-Encoding'=>null, //? Способ кодирования содержимого сущности при передаче.
'Content-Language'=>null, // Один или несколько естественных языков содержимого сущности
'Content-Length'=>null, // Размер содержимого сущности в байтах. // если передаётся в $CONTENT, то будет заполнено автоматически, лучше не трогать
'Content-Location'=>null, //? Альтернативное расположение содержимого сущности.
'Content-MD5'=>null, //?!MD5-хэш сущности для проверки целостности. // для автоматического заполнения перевести в ture
'Content-Range'=>null, //? Байтовые диапазоны передаваемой сущности если возвращается фрагмент. Подробности: Частичные GET.
'Content-Type'=>null, // Формат и способ представления сущности.
'Content-Version'=>null, //? Информация о текущей версии сущности.
'Derived-From'=>null, //? Информация о текущей версии сущности.
'Last-Modified'=>null, //? Дата последней модификации сущности.
'Link'=>null, //? Указывает на логически связный с сущностью ресурс аналогично тегу <LINK> в HTML.
'Title'=>null //? Заголовок сущности.
);
foreach($SOCKETs as $k=>$v){ if(isset($SOCKET[$k])) $SOCKETs[$k]=$SOCKET[$k]; }
$keys=array_keys($HEADs);
$lim=count($keys);
for($i=0;$i<$lim;$i++){
$Head=$keys[$i];
$Value=$HEADs[$Head];
if(isset($HEAD[$Head])){ if($HEAD[$Head]!=='') $HEADs[$Head]=$HEAD[$Head]; }
elseif(is_null($Value)) unset($HEADs[$Head]);
}
if((string)$HEADs['URI']=='') $HEADs['URI'] ='/'; else $HEADs['URI'] =(string)$HEADs['URI'];
if((string)$HEADs['HTTP']=='') $HEADs['HTTP']='HTTP/1.1'; else $HEADs['HTTP']=(string)$HEADs['HTTP'];
if($HEADs['Connection']){
if(is_numeric($HEADs['Connection'])) $HEADs['Keep-Alive']=intval($HEADs['Connection']);
$HEADs['Connection']='Keep-Alive';
}else $HEADs['Connection']='Close';
if(isset($HEADs['Host'])){ if($HEADs['Host']===true || strlen($HEADs['Host'])==0)$HEADs['Host']=$SOCKETs['Socket-Address']; }
if(isset($HEADs['Referer'])) if($HEADs['Referer']===true) $HEADs['Referer']=$HEADs['URI'];
$Content='';
if(isset($CONTENT)) if(is_array($CONTENT)){
if(isset($CONTENT)) if(isset($CONTENT['POST'])) if(is_array($CONTENT['POST'])) if(count($CONTENT['POST'])>0){
$HEADs['Method']='POST';$MIME=false;
$keys=array_keys($CONTENT['POST']);$lim=count($keys);
for($i=0;$i<$lim;$i++){ if(is_array($CONTENT['POST'][$keys[$i]])){ $MIME=true; break; } }
$Length=0;
if($MIME){
$boundary= substr(sha1(md5(mktime())), 4, -4);
$boundary= $boundary.strtoupper(md5($boundary)); $boundary{10}='+'; $boundary{12}='_'; //получение более-менее уникальной границы
$HEADs['Content-Type']='multipart/form-data; boundary="'.$boundary.'"';
foreach($CONTENT['POST'] as $Keyko=>$Postec){
if(is_array($Postec)){
$Content.="--$boundary\r\nContent-Disposition: form-data";
if(isset($Postec['name'])) $Content.='; name="'.$Postec['name'].'"'; else $Content.='; name="'.$Keyko.'"';
if(isset($Postec['filename']))$Content.='; filename="'.$Postec['name'].'"';
$Content.="\r\n";
foreach($Postec as $K=>$V){ if($K!='' && $K!='name' && $K!='Content-Disposition') $Content.="$K: $V\r\n"; }
$Content.="\r\n".@$Postec['']."\r\n";
}else $Content.="--$boundary\r\nContent-Disposition: form-data; name=\"$Keyko\"\r\n\r\n$Postec\r\n";
}
$Content.="--$boundary--";
$Length=strlen($Content);
}else{
foreach($CONTENT['POST'] as $k=>$v){
$Content.=trim($k).'='.urlencode($v).'&';
$Length+=2+strlen(trim($k))+strlen($v);
}
$Length-=1;
$Content=substr($Content,0,-1);
$HEADs['Content-Type']='application/x-www-form-urlencoded';
}
if(isset($HEADs['Content-Length'])) if($HEADs['Content-Length']===true) $HEADs['Content-Length']=$Length;
if(isset($HEADs['Content-MD5'])) if($HEADs['Content-MD5']===true) $HEADs['Content-MD5']=md5($Content);
}
// cookie
if(isset($CONTENT)) if(isset($CONTENT['Cookie'])) if(is_array($CONTENT['Cookie'])) if(count($CONTENT['Cookie'])>0){
$HEADs['Cookie']='';
foreach($CONTENT['Cookie'] as $k=>$v){ $HEADs['Cookie'].=(string)$k.'='.urlencode($v).'; '; }
$HEADs['Cookie']=substr($HEADs['Cookie'],0,-2);
}
if(isset($CONTENT)) if(isset($CONTENT['Authorization'])) if(is_array($CONTENT['Authorization'])){
if(isset($CONTENT['Authorization']['userid']) && isset($CONTENT['Authorization']['password']))
$HEADs['Authorization'] = 'Basic '.base64_encode(str_replace(':', '', $CONTENT['Authorization']['userid']).':'.$CONTENT['Authorization']['password']);
}
}
if(isset($HEADs['Content-MD5'])) if($HEADs['Content-MD5']===true) unset($HEADs['Content-MD5']);
if(!in_array(@$HEADs['Method'],array('GET', 'POST', 'PUT', 'OPTIONS', 'HEAD', 'DELETE', 'PATCH', 'TRACE', 'LINK', 'UNLINK')))$HEADs['Method']='GET';
$Send=$HEADs['Method'].' '.$HEADs['URI'].' '.$HEADs['HTTP'];unset($HEADs['Method'], $HEADs['URI'], $HEADs['HTTP']);
$keys=array_keys($HEADs);$lim=count($keys);
for($i=0;$i<$lim;$i++){
$Head=$keys[$i];
$Value=$HEADs[$Head];
$Send.="\r\n$Head: $Value";
}
$Send.="\r\n\r\n".$Content;
if(false!=($f=@fsockopen($SOCKETs['Socket-Address'], $SOCKETs['Socket-Port'], $errno, $errstr, $SOCKETs['Socket-Timeout']))){
if(!isset($SOCKETs['Socket-DownLimit'])) $ByteLimit=-1;
elseif (intval($SOCKETs['Socket-DownLimit'])>=0) $ByteLimit=intval($SOCKETs['Socket-DownLimit']);
else $ByteLimit=-1;
fputs ($f, $Send);
$Str='';
if($ByteLimit>0){
$Downed=0;
set_time_limit(5);
while(!feof($f) && $Downed<$ByteLimit){
$Str.=fread($f, $ByteLimit-$Downed);
$Downed=strlen($Str);
}
}elseif($ByteLimit<0){ while(!feof($f)){ $Str.=fgets($f, 512); } }
fclose($f);
}else return array(false, $errstr, $Send);
return array(true, $Str, $Send);
}
Вот функция, её добавить в ниже указанный код
|