![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте.
Хочу написать своё CGI приложение и вставить его между страницей сайта и родным CGI, т.к. его исходников нет, а надо изменить вывод. В общем, пытаюсь переадресовать "как есть" параметры, передаваемые методом POST, но процесс зависает. Подскажите, пожалуйста, в чём может быть проблема, или как можно проще передать POST от страницы ко второму CGI? Код:
IdHTTp1:=TIdHTTP.Create(nil); IdHTTp1.Request.UserAgent:='Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.12'; IdHTTp1.Request.Host:=sname; readln(s); //пытаюсь получить POST параметры writeln(IdHTTp1.Post(sname+'/MarcWeb/Exe/OPACServletBody.exe',s)); Через какое-то время вылезает ошибка 502.2 Цитата:
|
|
#2
|
|||
|
|||
|
Осознал, что для моей цели нужно использовать WebModule. Параметры теперь получаю, но проблема с их отправкой.
Код:
data := TIdMultiPartFormDataStream.Create;
for i := 0 to Request.ContentFields.Count-1 do
begin
p:=pos('=',Request.ContentFields[i]);
sl:=Copy(Request.ContentFields[i],1,p-1);//левая часть, название параметра
sr:=Copy(Request.ContentFields[i],p+1,length(Request.ContentFields[i])-p); //правая часть, значение параметра
data.AddFormField(sl,sr);
end;
IdHTTp1:=TIdHTTP.Create(nil);
IdHTTp1.Request.UserAgent:='Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.12';
IdHTTp1.Request.Host:=sname;
Response.Content:=Response.Content+IdHTTp1.Post('http://'+sname+'/MarcWeb/Exe/OPACServletBody.exe',data);В общем, приходит ответ от исходного EXE файла, "Ошибка параметров HTML-формы!" (генерируется им). Как сделать так, чтобы переслать без каких-то искажений все входящие POST параметры? Или в чем сейчас может быть разница между тем, как параметры пришли в мой CGI и как были переданы. Исходя из того, что при получении параметров через моего посредника, исходное CGI сообщает об ошибке, какая-то разница существует. |
|
#3
|
|||
|
|||
|
В общем, разобрался. Попутно всплыла проблема с тем, что ответ приходил в Windows-1251, а должен был отображаться как utf-8. В результате жестокого и беспощадного перебора был рожден этот, так сказать, код, работающий в моём случае. Возможно, кому-то пригодится.
Код:
function StrAnsiToUtf(aStr: string): string;
var
Encoding, aEncoding: TEncoding;
Buffer: TBytes;
begin
Encoding := TEncoding.UTF8;
aEncoding := TEncoding.Default;
Buffer := Encoding.GetBytes(aStr);
TEncoding.Convert(aEncoding, Encoding, Buffer);
Result := aEncoding.GetString(Buffer);
end;
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
IdHTTp1:=TIdHTTP.Create(nil);
IdHTTp1.Request.UserAgent:='Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.12';
IdHTTp1.Request.Host:=sname;
IdHTTp1.Request.ContentType := 'text/plain; charset=windows-1251'; st:=StrAnsiToUtf(IdHTTp1.Post('http://'+sname+'/MarcWeb/Exe/OPACServletBody.exe',Request.ContentFields));
Response.Content:=Response.Content+ st;
end; |