Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.20;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
1-1107339172
Imp
2005-02-02 13:12
2005.02.20
статья: Написание оптимального кода под Delphi


3-1106304368
Grab3
2005-01-21 13:46
2005.02.20
Mysql и Delphi


3-1105706839
ora_user
2005-01-14 15:47
2005.02.20
Подключение к Oracle.


4-1105189456
Ded Moroz
2005-01-08 16:04
2005.02.20
Настройки модема в реестре


1-1107772136
Raider
2005-02-07 13:28
2005.02.20
Как сделаь так чтоб