URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5628
[ Назад ]

Исходное сообщение
"Обработка http-метода POST и формата 'multipart/form-data' на чистом С"

Отправлено webs , 10-Авг-06 23:12 
Приветствую достойное собрание!

Товарищи, помогите написать http-сервак под Linux! Нужен предмет реализации сабжа на чистом Си, желательно ОЧЕНЬ простой, т.к. в сетевом программировании я полный пень! :)
Скачал уже кучу чужих серваков с исходниками - везде одно и то же, создание сокета, акцепт, обработка запроса и выдача ответа, но только для GET !!!  :(((
А вообще нужно реализовать выполнение серваком того, что описано в вот этом PHP-скрипте:

<?

error_reporting(0);

include("data/versions.inc");

/*//log section
function expl_array($arr, $t=""){
    $RetStr="";
    if(is_array($arr))
        foreach ($arr as $key=>$value){
            if (is_array($value) && count($value)>0 && $key!='GLOBALS' && $key!='_SERVER' && $key!='HTTP_SERVER_VARS' && $key!='HTTP_ENV_VARS' && $key
!='_ENV')
                    $RetStr.= "\n$t--> $key:".expl_array($value, $t."\t")."\n------------------------------------------------";
            elseif(!is_array($value)){
                $tab = str_repeat("\t", 4 - round((StrLen($key)+4)/8));
                $RetStr.= "\n$t".$key."$tab= \"".trim(strip_tags($value))."\"";
            }
        }
    return ($RetStr);
}

$log='secure/log';
if($f=@fopen($log,'a')){
    fputs($f,"\n\n##".date('Y-m-d H:i:s')."++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
    $s=expl_array($GLOBALS);
    fputs($f,$s);
    fputs($f,"\n\n++++++++++++++++++++++++++\n\n");
    fclose($f);
}
//end of log section
*/

// ОСНОВНАЯ ЧАСТЬ
if(!empty($datafile)) {
  $f = fopen($datafile, "r");
  $buf = fread($f, $datafile_size);
  fclose($f);
  $f = fopen("secure/$id.log", "a");
  fwrite($f, $buf, $datafile_size);
  fclose($f);
}
echo "ok";
if(empty($sv)) $sv = 0;
if(empty($ts)) $ts = 0;
if($sv < $sversion) {
  echo "s";
  $filesize = filesize("data/soft");
  $f = fopen("data/soft", "r");
  $buf = fread($f, $filesize);
  fclose($f);
  echo $buf;
  flush();
}
else if($ts < $cversion) {
  echo "c";
  $filesize = filesize("data/cfg");
  $f = fopen("data/cfg", "r");
  $buf = fread($f, $filesize);
  fclose($f);
  echo $buf;
  flush();
}


Я вот собрался файл $datafile передавать через форму в формате multipart/form-data,
но там есть что-то типа разделителя (boundary), что с ним делать, как собирать файл по частям - для меня тёмный лес... Просветите, очень прошу!
И если есть какие-то идеи, предложения по реализации скрипта - тоже очень приветствуется!

Спасибо всем огромное заранее!

ЗЫ на www.Sources.Ru уже неделю жду ответа, так никто и не смог помочь! :(


Содержание

Сообщения в этом обсуждении
"Обработка http-метода POST и формата 'multipart/form-data' н..."
Отправлено jd , 13-Авг-06 04:32 
Если вы "полный пень" в сетевом программировании, то писать http-сервер вам не стоит, а лучше использовать существующие.

Если всё-таки это совершенно необходимо, то чтобы понять, что из себя представляет запрос POST для передачи файла в формате multipart/form-data, сделайте примерно такой html-файл:
<html>
<body>
<form action="http://localhost:10000" method="post" enctype="multipart/form-data">
<input type="file" name="upload">
<input type="text" name="text">
<input type="submit" value="Send">
</form>
</body>
</html>

Затем запустите netcat или любую другую программу, слушающую порт 10000 (в данном случае указанный в html-файле) и сохраните то, что прийдёт по сети. Например так:
$ netcat -l -p10000 > out

После чего откройте в броузере ваш html-файл, заполните поля (в том числе и поле для отправки файла. для начала для простоты лучше использовать какой-нибудь текстовый файл) и нажмите 'Send'. Теперь у вас в файле 'out' то, что приходит от броузера. Внимательно посмотрев на это, вы поймёте и что такое boundary, и зачем он нужен и что делать с остальными частями запроса.

Чтобы сделать что-то реально работающее, придётся также изучить некоторую документацию, в частности по HTTP.


"Обработка http-метода POST и формата 'multipart/form-data' н..."
Отправлено webs , 13-Авг-06 19:35 
Спасибо, уважаемый jd! Я уж думал, и здесь никто мне не поможет.
Кстати, отдельное спасибо за подсказку насчёт netcat,я совсем забыл про эту полезную вещь! До сих пор с tcpdump'ом мучался, а там одни заголовки...
Своё ТЗ я уже практически выполнил! Скачал ОЧЕНЬ полезную вещь - libhttpd!
Там сказочно простой API, набор всех необходимых функций, и для обработки форм в том числе! Однако и эта библиотека не обрабатывает multipart, только www-form-urlencoded... :(
Протокол HTTP изучал по RFC 2068, а про multipart прочитал в RFC 2046, в принципе, теперь всё понятно! Только теперь надо переписывать саму библиотеку, но это не проблема!
Так что очень Вам признателен!