Форум: "Основная";
Текущий архив: 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¶m2=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.036 c