-
смысл такой: требуется парсер параметров, что передаются веб-серверу через Get или Post методы. Желательно на паскале, хотя можно и на С или PHP. Ну или ссылку, где эти правила детально описаны (сам "с ходу" не нашёл :( ). В принципе, там после нескольких экспериментов более-менее понятно, как строки передаются, и самому написать не сильно сложно, но поскольку в веб-программировании я новичок, то тупо могу каких-то нюансов не учесть.
-
в каком смысле парсер? print_r($_POST); выведет все элементы, перебор их: foreach ($_POST as $key => $content){ //$key - ключ echo($_POST[$key]);// выведет $content }
-
-
get запросы хранятся в массиве $_GET, post в $_POST. не пойму вопроса :)
-
> смысл такой: требуется парсер параметров, что передаются > веб-серверу через Get или Post методы.
только текстовых параметров? Там и файлы ведь могут быть.
-
> принимаешь > $id= > $n=
неправильно, нафиг regystry_globals :) для http://pda.delphimaster.net/?id=1208264263&n=3$_GET['id'] будет равен 1208264263 $_GET['n'] будет равен 3 проверка на существование - isset($_GET['n']), присутсвует регистрозависимость :)
-
на PHP это делается очень просто (без проверки на ошибки) $params1 = explode('&', $param_string);
$params2 = array();
foreach($params1 as $line) (не учитывая, что за тебя это уже сделал веб-сервер) но вряд ли тебе это поможет - в делфи нету explode а ежели с проверкой на ошибки - то лучше юзать автоматы (КА) и перебирать по символу
-
> на PHP это делается очень просто (без проверки на ошибки)
ужась :) на php есть уже готовые пропарсенные массивы :)
-
> > ужась :) на php есть уже готовые пропарсенные массивы :)
ужась у вас, поскольку вы не читаете, чего хочет автор...
а автор хочет парсер гетов-постов на паскале.... я и привел принцип разбора, но на пхп
зато теперь я знаю, по какому принципу набирают в супорт хостерам }:->
-
> где эти правила детально описаны (сам "с ходу" не нашёл > :( ).
Google+regexp + Delphi. Или сам конечноый автомат катай, но я думаю будет лень.
-
antonn © (15.04.08 17:04) [5]
> неправильно, нафиг regystry_globals :) Я уже догадался :)
-
> wicked © (15.04.08 17:12) [8]
я просто не понял, зачем показывать аналог парсера на языке, где уже все сделано %)
-
const
CR = CHR(13)+CHR(10);
BufSize = 4096;
function GetMethod: String;
var
buf: PChar;
begin
GetMem(buf,BufSize);
GetEnvironmentVariable(PChar('REQUEST_METHOD'),Buf,BufSize);
Result := String(buf);
FreeMem(buf);
end;
...
if GetMethod = 'POST'
then Str := GetPostEnv
else Str := GetGetEnv;
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;
function Decode(Value: String):String;
var
i,L: Integer;
begin
Result := '';
L := 0;
for i := 1 to Length(Value) do
begin
if (Value[i]<>'%') and (Value[i]<>'+') and (L<1) then
begin
Result := Result + Value[i];
end
else
begin
if Value[i]='+' then Result := Result+' '
else if Value[i]='%' then
begin
L := 2;
if (i<Length(Value)-1) then
begin
Result := Result + Chr(StrToInt('$'+Copy(Value,i+1,2))); end;
end
else Dec(L);
end;
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 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;
-
> я просто не понял, зачем показывать аналог парсера на языке, > где уже все сделано
Чтобы понять как сделать на делфи или как вообще это делается очевидно. Хотя [6] на делфи все одно не портируешь в лоб.
-
Вдогонку пример получения значения параметра: for i := Low(tCommand) to High(tCommand) do
begin
if ParamByName(Str,'typedocau')= tCommand[i] then isTrue := True;
end;
-
Сорри, тут разговор был. поясняю: парсер нужен для FastCGI-программы. всё, что приходит через GET - имеем в QUERY_STRING. Всё, что приходит через POST - в fastcgi-аналоге stdin. Понятно, что всё суть 'parameter1=value1¶meter2=value2' и т.д. Просто там ещё всякие спец-символы и т.п. Вот технологию передачи спец-символов я так до конца и не понял. Если есть где описание - ткните носом, сам парсер напишу. Просто в OpenSource-коды лезть крайне не хочется... :)
-
> > Google+regexp + Delphi. Или сам конечноый автомат катай, > но я думаю будет лень.
Я тоже хотел сначала написать, но, имхо, Ega и так про это знает. Он само выражения написать незнает как правильно.
-
> Если есть где описание - ткните носом, сам парсер напишу
RFC 1945 сам просил :)
-
Опытным путём вижу следующее: есть строка Input Buffer: auth=1&login=%25%25%25&pwd=%25%3D%25%3D Сначала пройти по строке разбить на пары по '&'. Потом каждую пару разбить на сочетания параметр-значение по '=' Потом найти все сочетания '%__', заменить их на символ Chr(__) с учётом того, что они в Hex.
-
> Опытным путём вижу следующее:
Ну в общем так и есть. Изредка возможно коррективы.
-
> Ega23 © (15.04.08 17:28) [15] > Сорри, тут разговор был. > поясняю: парсер нужен для FastCGI-программы. всё, что приходит > через GET - имеем в QUERY_STRING. Всё, что приходит через > POST - в fastcgi-аналоге stdin. > Понятно, что всё суть 'parameter1=value1¶meter2=value2' > и т.д. > Просто там ещё всякие спец-символы и т.п. > Вот технологию передачи спец-символов я так до конца и не > понял. > Если есть где описание - ткните носом, сам парсер напишу. > Просто в OpenSource-коды лезть крайне не хочется... :)
А какая разница - CGI или FASTCGI при передаче параметров клиентом? Получение типа запроса: function GetMethod: String; Получение строки с запросом в зависимости от типа запроса(GET,POST): function GetGetEnv: String;
function GetPostGetEnv: String; Получение значения параметра из строки с запросом: function ParamByName(inParams: String;Name: String): String; Декодирование значения параметра в запросе: function Decode(Value: String):String;
-
> Оригинал (15.04.08 17:43) [20]
Я как раз сейчас твой код смотрю, правильно ли я всё понял.
-
> Ну в общем так и есть. Изредка возможно коррективы.
Вот не хотелось бы, чтобы "коррективы" всплыли в самый ненужный момент.. :)
-
> > Вот не хотелось бы, чтобы «коррективы» всплыли в самый ненужный > момент
:)
Надо прочитать стандарт на эту строку и полностью его реализовать.
-
> > Вот не хотелось бы, чтобы "коррективы" всплыли в самый ненужный > момент.. :) >
Плюсик заменяется на пробел. Может быть, это не относится к FastCGI, не в курсе, что это такое.
-
> Надо прочитать стандарт на эту строку и полностью его реализовать.
5 баллов. А то я не понимаю... :) Покажи стандарт, я ещё в [0] просил. Желательно оригинал, а не перевод.
|