Форум » [x]Harbour » Harbour CGI » Ответить

Harbour CGI

Dazzler: Помогите разобраться. Пишу простое CGI приложение. Читаю переменные окружения, которые передает сервер приложению - getenv(). Вывожу результат в outstd(). Если форма запроса по "GET" ( getenv("REQUEST_METHOD")=="GET" ) то все переменные читаю из getenv("QUERY_STRING"). А если по "POST", как прочитать переданные переменные? Спасибо.

Ответов - 15

PSP: Dazzler пишет: А если по "POST", как прочитать переданные переменные? Умные дядьки говорят, что через stdin, через клавиатуру типа... http://dayte2.com/get-post-methods

Dazzler: Как это сделать? Какими функциями можно прочитать?

PSP: Буфер клавиатуры читается функцией Inkey()


Dazzler: Понял как читается. fread() - возвращает данные. Главное чтобы первый параметр был 0 - ноль n_buff= fread(0,@buff,len(buff)) возвратила в buff строку, длинной n_buff Спасибо

PSP: Ну да... Стандартные потоки: http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D1%8B%D0%B5_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B8

Dazzler: Я просто не знал как эти стандартные потоки можно было использовать.....

PSP: Dazzler пишет: Я просто не знал как эти стандартные потоки можно было использовать. Я тоже...

Gosha: Пробую передать файл на сервер, принимающий скрипт на сервере: [pre2]function main() LOCAL nLen, cTemp, nRead OUTSTD("Content-type: text/html" + hb_eol() + hb_eol()) IF "POST" $ UPPER( hb_GetEnv( "REQUEST_METHOD" ) ) nLen := VAL(hb_getenv("CONTENT_LENGTH")) cTemp := SPACE( nLen ) IF ( nRead := FRead( 0, @cTemp, nLen )) != nLen OUTSTD("<p>Post error read " + hb_ntos( nRead ) + " instead of " + hb_ntos( nLen ) + hb_eol() ) ELSE OUTSTD("<p>Post string is: " , cTemp + hb_eol()) ENDIF ENDIF OUTSTD("</body></html>" + hb_eol()) RETURN NIL[/pre2] Но из stdin почему-то читается ~70кб и все, т.е. если передавать больше, то получаю к примеру: Post error read 71443 instead of 103746 Может кто подскажет куда копать.

Andrey: Gosha пишет: Пробую передать файл на сервер, принимающий скрипт на сервере: Это как ? Более подробней можно написать ?

PSP: Andrey пишет: Это как ? Более подробней можно написать ? http://lectureswww.readthedocs.io/5.web.server/cgi.html

Gosha: Имеется html: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>File Upload</title> </head> <body> <form action="/cgi-bin/upload_file.exe" method="post" enctype="multipart/form-data"> <p>Photo to Upload: <input type="file" name="photo" /></p> <p><input type="submit" name="Submit" value="Submit Form" /></p> </form> </body> </html> Выбираем файл, загружаем на сервер методом POST. Скрипт на стороне сервера из stdin читает содержимое. Если файл небольшой то все ОК, а если большой то из stdin читается только 70кб. При использовании TIPCgi - та же ерунда получается.

PSP: Gosha пишет: При использовании TIPCgi - та же ерунда получается Так может дело в настройках сервера?

Gosha: PSP пишет: Так может дело в настройках сервера? В начале тоже так подумал, но скрипт на Perl отрабатывает нормально. Хочу еще уточнить: переменная cTemp на выходе имеет длину нормальную, равную "CONTENT_LENGTH", но вот ее содержимое заполнено данными только первые 70кб, переменная nRead также равна 70кб.

Pasha: Чтение из stdin выполняется с помощью winapi-функции ReadFile. Возможно, там есть какие-то особенности или ограничения, например, реакция на символ eof. Попробуйте опростить FError/DosError, может быть там что-то будет. Кстати, попробуйте выдавать fread в цикле, пока прочитанная длина строки не равна нулю, с конкатенацией прочитанных строк.

Gosha: Pasha пишет: Кстати, попробуйте выдавать fread в цикле, пока прочитанная длина строки не равна нулю, с конкатенацией прочитанных строк. Да, помогло, последовательное чтение 1кб блоками. Странно однако. Благодарю.



полная версия страницы