|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Промежуточное CGI, проблема с передачей POST
Здравствуйте.
Хочу написать своё 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; |