Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];

Вниз

CGI на Delphi   Найти похожие ветки 

 
TButton ©   (2005-02-01 03:31) [0]

собсна вопрос по статье http://www.delphimaster.ru/articles/cgi.html
цитирую

В случае <FORM METHOD="GET" ...>... данные передаются через строку адреса браузера и записываются в переменную системного окружения QUERY_STRING, а размер строки данных в переменную CONTENT_LENGTH.

В случае <FORM METHOD="POST" ...>... передаваемые данные в строке адреса не отображаются, передаются через стандартный поток ввода консольной программы.

конец цитаты.

реализация того, о чём сказано во втором абзаце рассмотрена в статье. а вот про сабж первого абзаца ни слова.

подскажите, пожалуйста, как добраться до переменных системного окружения QUERY_STRING и CONTENT_LENGTH, а то я с этим сталкиваюсь впервые и даже не знаю куда копать.
tFM молчит.


 
Чапаев ©   (2005-02-01 09:41) [1]

Смотри GetEnvironmentVariable(). Получаешь нужные тебе переменные, потом разбираешь строку.

У тебя будет что-то вроде http://qwerty.ru/cgi.exe?param1=value1&param2=value2


 
TButton ©   (2005-02-01 12:34) [2]

спасибо, по пробую.


 
TButton ©   (2005-02-01 16:23) [3]

помогло, но не совсем.
procedure ReceiveGET;
var
 sss: String;
begin
 SetLength(sss, 256);
 GetEnvironmentVariable("QUERY_STRING",PChar(sss),Length(sss));
 requeststring:=sss;
end;

попытки получить аналогичным образом значение
переменной CONTENT_LENGHT не увенчались успехом
что не есть хорошо
или я просто что-то не так делаю?


 
Poirot ©   (2005-02-01 16:39) [4]

передавай array[0..255]of char, а не стринг. стринг это немного не то, что ты хочешь тут получить:)


 
TButton ©   (2005-02-01 16:50) [5]

кстати провел тест, что получлось:
SERVER_SOFTWARE: Apache/1.3.31 (Win32) PHP/4.3.9
SERVER_NAME: www.<cut>.ru
GATEWAY_INTERFACE: CGI/1.1
SERVER_PROTOCOL: HTTP/1.1
SERVER_PORT: 80
REQUEST_METHOD: GET
PATH_INFO:
PATH_TRANSLATED:
SCRIPT_NAME: /cgi-bin/test.cgi
QUERY_STRING: uID=31444146010758610142996489966225
REMOTE_HOST:
REMOTE_ADDR: 127.0.0.1
AUTH_TYPE:  
REMOTE_USER:  
REMOTE_IDENT:  
CONTENT_TYPE:  
CONTENT_LENGTH:  
HTTP_ACCEPT: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
HTTP_USER_AGENT: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)

т.е. на значительную часть вопросов ответов ненашлось вовсе =)

re [4]
попробую array of char, но не думаю, что станет легче =)


 
Alexander Panov ©   (2005-02-01 16:59) [6]

function GetMethod: String;
var
 buf: PChar;
begin
 GetMem(buf,BufSize);
 GetEnvironmentVariable(PChar("REQUEST_METHOD"),Buf,BufSize);
 Result := String(buf);
 FreeMem(buf);
end;

function GetPostEnv: String;
var
   StdIn,Size,Actual: Cardinal;
begin
 Result := "";
 StdIn := GetStdHandle(STD_INPUT_HANDLE);
 Size := SetFilePointer(StdIn,0,nil,FILE_END);
 SetFilePointer(StdIn,0,nil,FILE_BEGIN);
 SetLength(Result,Size);
 if Size>0 then
 begin
   ReadFile(StdIn,Result[1],Size,Actual,nil);
 end;

end;

function GetGetEnv: String;
var
 buf: PChar;

begin
 GetMem(buf,BufSize);
 GetEnvironmentVariable(PChar("QUERY_STRING"),Buf,BufSize);
 Result := String(buf);
 FreeMem(buf);
end;

function ParamByName(inParams: String;Name: String): String;
var
 ss,st: String;
 k: Integer;
begin
 Result := "";
 ss := InParams;
 while Length(ss)>0 do
 begin
   k := Pos("&",ss);
   if k>0 then
   begin
     st := Copy(ss,1,k-1);
     ss := Copy(ss,k+1,10000);
   end
   else
   begin
     st := ss;
     ss := "";
   end;
   k := Pos("=",st);
   if K>0 then
   begin
     if Name=Copy(st,1,k-1) then
     begin
       Result := Decode(Copy(st,k+1,6000));
     end;
   end;
 end;

end;


Использование:


 if GetMethod = "POST"
   then Str := GetPostEnv
   else Str := GetGetEnv;

 p1 := ParamByName(Str,"dateselect");


 
TButton ©   (2005-02-01 20:00) [7]

собсна конечный вариант (работающий)

function GetVariable(name: string): string;
var
 sss: array of char;
begin
 SetLength(sss, 256);
 GetEnvironmentVariable(PChar(name),PChar(sss),Length(sss));
 result:=String(Pchar(sss));
end;

procedure ReceivePOST;
var
 STR : string;
 StdIn, Size, Actual : cardinal;
const
 UserPassword : String = "MyPass";
begin
 StdIn:=GetStdHandle(STD_INPUT_HANDLE);
 Size:=SetFilePointer(StdIn, 0, nil, FILE_END);
 SetFilePointer(StdIn, 0, nil, FILE_BEGIN);
 SetLength(STR, Size+1);
 if Size<=0 then
   Exit;
 ReadFile(StdIn, STR[1], Size, Actual, nil);
 STR[Size+1]:=#0;
 requeststring:=PChar(@STR[1]);
end;

procedure ParseIncoming;
 ...
 if GetVariable("REQUEST_METHOD")="POST"
   then ReceivePOST
   else ReceiveGET;
 ...
end;


re [6]
большое спасибо перепишу GetVariable под ваш вариант
и летопись окончена моя =)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.035 c
4-1103712547
DelphiN!
2004-12-22 13:49
2005.02.20
Получить температуру процессора


14-1106919660
Околокомпьютерный
2005-01-28 16:41
2005.02.20
Про музычку


4-1104030864
Дмитрий В. Белькевич
2004-12-26 06:14
2005.02.20
Нехватка ресурсов в win98. Невозможно создать много битмапов.


1-1093323585
Vilux
2004-08-24 08:59
2005.02.20
TTree и цвет текста


1-1107811993
k@rt
2005-02-08 00:33
2005.02.20
Сохранение в TMemoryStream





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский