2013-05-08 29 views
12

Potrzebuję wdrożyć aplikację serwera proxy HTTP, która będzie obsługiwać żądania od wielu klientów do zdalnego serwera.Serwer proxy HTTP HTTP

Oto kroki:

  1. Client naprzód żądanie pełnomocnika
  2. Proxy naprzód żądanie do serwera
  3. powraca Server prośba o Proxy
  4. powraca Proxy prośba o Klienta.

Po prostu nie jestem pewien, jak powinienem wdrożyć to proxy. Moją pierwszą myślą było wdrożenie aplikacji tomcat, która używa jersey/apache httpclient do przekazania żądania do zdalnego serwera i zwrócenia odpowiedzi z powrotem do klienta?

Czy istnieje lepszy sposób na wdrożenie takiego serwera proxy?

Serwer proxy musiałby obsługiwać wiele wątków.

Odpowiedz

9

Nie można go wdrożyć jako serwletu i nie ma powodu, aby używać dowolnej formy klienta HTTP.

Serwer bezpłciowy proxy jest bardzo prosta rzecz:

  1. Zaakceptuj połączenie i uruchomić wątku dla niej.
  2. Przeczytaj żądanie od klienta do pustego wiersza.
  3. Wyodrębnij polecenie GET lub CONNECT lub cokolwiek to jest i połącz się z nazwanym hostem.
  4. Jeśli to się nie powiedzie, wyślij odpowiednią odpowiedź o błędzie HTTP, zamknij gniazdo i zapomnij o tym.
  5. W przeciwnym razie uruchom dwa wątki, aby skopiować bajty, po jednym w każdym kierunku. Nic nadzwyczajnego, po prostu

    while ((count = in.read(buffer)) > 0) 
    { 
        out.write(buffer, 0, count); 
    } 
    
  6. Gdy jeden z tych gniazd czyta EOS, zamknięcie drugiego gniazda wyjścia i zamknąć wątek, który dostał EOS.
  7. Jeśli gniazdo, które było źródłem EOS, jest już wyłączone dla wyjścia, zamknij je oba.

Lub użyj Apache SQUID.

8

Zapoznaj się z LittleProxy - ma wbudowane klasy dla żądań przychodzących i wychodzących; możesz po prostu napisać swój kod podobnie do obsługi żądania HTTP w aplecie.

+0

I tak, ma wbudowaną obsługę CONNECT, która w rzeczywistości nie jest wbudowana w interfejsy API serwletów –