2012-06-05 3 views
3

В настоящее время я хочу перенаправить определенные Post-запросы с использованием Indy10 TIdHTTPProxyServer. Я последовал за страницуКак перенаправить почтовые запросы с использованием TIdHTTPProxyServer

http://embarcadero.newsgroups.archived.at/public.delphi.internet.winsock/200904/0904301714.html

и написал простой образец, как следовать.

oid __fastcall TForm3::MyProxyHTTPBeforeCommand(TIdHTTPProxyServerContext *AContext) 
{ 

    if (AContext->Target == "http://example.com/need_redirect_url") { 

     TIdIOHandler* io = AContext->Connection->IOHandler; 

     io->WriteLn("HTTP/1.0 302 Moved Temporarily"); 
     io->WriteLn("Location: http://exampledomain.com/target_url"); 
     io->WriteLn("Connection: close");  
    } 
} 

Это работает, если я нажимаю «http://sample.com/need_redirect_url» в адресной строке браузера. Но ничего не возвращайте (независимо от того, Post или Get), если это XMLHttpRequest, который нацелен на тот же URL.

Должен признать, что я действительно не знаком с тем, как работает HTTP. И я также задаюсь вопросом, есть ли лучший способ сделать то, что я хочу.

Хотя я использую C++ Builder XE2. Delphi образцы также ценятся как есть меньше примеров использования Indy компонентов с использованием C++

ответ

3

Вашего кода не пишет пустую строку, которая завершает HTTP-заголовки, которые вы отправляете. Вам также нужно будет выбросить исключение, чтобы предотвратить отправку TIdHTTPProxyServer с адреса URL-адреса клиента после выхода обработчика события OnBeforeCommand.

Попробуйте это:

void __fastcall TForm3::MyProxyHTTPBeforeCommand(TIdHTTPProxyServerContext *AContext) 
{ 
    if (AContext->Target == "http://xxx.com/need_redirect_url") 
    { 
     TIdIOHandler* io = AContext->Connection->IOHandler; 

     io->WriteLn("HTTP/1.0 302 Moved Temporarily"); 
     io->WriteLn("Location: http://mydomain.com/target_url"); 
     io->WriteLn("Connection: close");  
     io->WriteLn("");  

     Abort(); 
    } 
} 
+0

Большое спасибо. В настоящее время я могу успешно получить ожидаемый ответ в прокси. Однако есть и другая проблема. Запрос на отправку становится Get request после перенаправления. Должен ли я делать какие-либо другие вещи, когда это запрос на отправку? – Willy

+0

Изменение запроса 'POST' на запрос' GET' - это просто то, что делают некоторые HTTP-клиенты (ошибочно) при получении ответа «302». Такое поведение описано в [RFC 2616, раздел 10.3.3] (http://tools.ietf.org/html/rfc2616#section.10.3.3). Для запроса HTTP 1.1 используйте '303' вместо этого для сохранения' POST'. –

+0

Спасибо, хотя после использования «HTTP/1.1 303 See Other» вместо этого он все еще не работает. Я не уверен, что это проблема с прокси-сервером или проблема с пользовательским агентом. По этому вопросу, я думаю, вы уже дали мне прекрасный ответ. (Тем не менее, я все еще хочу знать, почему 303 тоже не работает.) – Willy

0

Похоже, проблемы политики в XMLHttpRequest междоменной, потому что example.com = mydomain.com - см http://en.wikipedia.org/wiki/XMLHttpRequest#Cross-domain_requests для получения справочной информации и возможных решений

+0

Спасибо за ответ. Я не уверен, что это проблема между доменами, поскольку я также не получал ожидаемых ответов в прокси. Кроме того, я уже использовал XMLDomainRequest в IE8, и он отлично работал, когда целью запроса является http://mydomain.com/target_url – Willy