ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование_OLD > PHP, PERL, MySQL, JavaScript
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #21  
Старый 20.05.2010, 14:40
roxblnfk
Познающий
Регистрация: 07.02.2010
Сообщений: 70
Провел на форуме:
217996

Репутация: 56
Отправить сообщение для roxblnfk с помощью ICQ
Wink

^_WhitE_DeMoN_^, ошибка есть, тут: $str{4}="\n";
надо $str{3}="\n";
А где возвращает 1?

я тут RFC протокола перечитал, увидел следующее на счёт Content-Length:
Длина тела объекта (entity-body) - это длина тела сообщения (message-body), полученного после декодирования всех кодирований передачи.
Т.е., как я понял, сюда надо вписывать не длину закодированного контента, а длину контента до кодирования. В нэте в примерах показывают обратное, т.е. указывают длину закодированного контента.
Вобщем немного переделал функцию (тут длина до кодирования):

PHP код:
function HTTP_request($serv='127.0.0.1'$port=80$timeout=30$host='localhost'$addr='/'$post=null$cookies=null){
    
$str='';$heads='';
    if(
is_array($post))if(count($post)>0){
        
$method='POST';
        
$str.="\r\n\r";
        
$Len=0;
        foreach(
$post as $k=>$v){
            
$str.='&'.$k.'='.urlencode($v);
            
$Len+=2+strlen($k)+strlen($v);
        }
        
$Len-=1;
        
$str{3}="\n";
        
$heads.="\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: ".$Len;
    }
    if(!isset(
$method)){
        
$method='GET';
        
//$heads.="\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        
$str="\r\n\r\n";
    }
    if(
is_array($cookies))if(count($cookies)>0){
        
$cook="\r\nCookie: ";
        foreach(
$cookies as $k=>$v){$cook.=$k.'='.urlencode($v).'; ';}
        
$heads.=substr($cook,0,-2);unset($cook);
    }
    if(
false!=($f=@fsockopen($serv$port$errno$errstr$timeout))){
        
$ss='';
        
fputs ($f"$method $addr HTTP/1.1".$heads."\r\nHost: $host\r\nConnection: close".$str);
        while(!
feof($f)){$ss.=fread($f512);}
        
fclose($f);
    }else return array(
false$errstr);
    return array(
true$ss); 

надеюсь в Content-Length учитываются разделители и названия переменных

Кстати, чтобы передавать бинарные данные, лучше использовать MIME без всякого кодирования. Этим же способом передают фотки с текстом за 1 раз. С момента прошлого поста я успел написать функцию, реализующую MIME в POST, только не закончил. В функции нет возможности аутентификации (Digest Authentication), но эти заголовки несложно дописать вручную. Если надо, могу поделиться.

Последний раз редактировалось roxblnfk; 20.05.2010 в 22:42.. Причина: винарные > бинарные :)
 
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ