2016-05-31 4 views
0

Ich verwende BrowserMob Proxy und möchte den Datenverkehr von meinem Produktionsserver zu einem Testserver umleiten. Dafür verwende ich ein rewriteUrl in der followin Weise:Browsermob Proxy (Java): Fehler beim Umschreiben einer URL

public class Main { 

    public static void main(String[] args) { 

     BrowserMobProxyServer server = new BrowserMobProxyServer(); 
     server.setTrustAllServers(true); 

     server.start(8888); 
     server.rewriteUrl("(https?://)init.mycompany.com(.*)","$1platform-sandbox.mycompany.com$2//"); 

     if (server.isStarted()) { 
      System.out.println("Server started on " + server.getClientBindAddress() + ":" + server.getPort()); 
     } 

     server.addRequestFilter(new RequestFilter() { 
      @Override 
      public HttpResponse filterRequest(io.netty.handler.codec.http.HttpRequest httpRequest, HttpMessageContents httpMessageContents, HttpMessageInfo httpMessageInfo) { 
       System.out.println("REQUEST"); 
       System.out.println("Original: " + httpMessageInfo.getOriginalUrl()); 
       System.out.println("Current: " + httpMessageInfo.getUrl()); 
       return null; 
      } 
     }); 

     server.addResponseFilter(new ResponseFilter() { 
      @Override 
      public void filterResponse(HttpResponse httpResponse, HttpMessageContents httpMessageContents, HttpMessageInfo httpMessageInfo) { 
       System.out.println("RESPONSE"); 
       System.out.println("Original: " + httpMessageInfo.getOriginalUrl()); 
       System.out.println("Current: " + httpMessageInfo.getUrl()); 
       if (httpMessageInfo.getOriginalUrl() != httpMessageInfo.getUrl()) { 
        System.out.printf("DIFFERENT!!!!"); 
       } 
      } 
     }); 

     server.newHar("test"); 
     while (true) { 
      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

Sie werden bemerken, dass ich einen Teilerfolg:

  1. Die beiden // Symbole werden am Ende hinzugefügt (tat, für testen).
  2. ist jedoch init nicht ersetzt durch platform-sandbox

REQUEST

Original: https://init.mycompany.com

Aktuell: https://init.mycompany.com

REQUEST

Original: https://init.mycompany.com/sdk/v6.4.6?applicationKey=42a8c1f5

Aktuell: https://init.mycompany.com/sdk/v6.4.6?applicationKey=42a8c1f5

RESPONSE

Original: https://init.mycompany.com/sdk/v6.4.6?applicationKey=42a8c1f5

Aktuell: https://init.mycompany.com/sdk/v6.4.6?applicationKey=42a8c1f5//

Antwort

1

ich Ihren Code mit HTTP-Anfragen getestet und es funktioniert gut (init wird ersetzt mit platform-sandbox).

Das Problem tritt nur bei HTTPS-Anfragen auf. Wenn Sie https URL anfordern, wird die Anfrage-Methode CONNECT verwendet, um eine Tunnelverbindung herzustellen. Momentan unterstützt der Browsermob Proxy das Umschreiben von URLs nicht, wenn die Request-Methode CONNECT ist.

Es gibt weitere Details im Quellcode. Sie können den Haltepunkt unter this line in the code festlegen und den HTTP- und HTTPS-Verkehr über diesen Punkt debuggen, um den Unterschied zu erkennen. Im Fall von https-Verkehr, wenn die Anforderungsmethode CONNECT verwendet wird, gibt der RewriteUrlFilter null zurück und die Regeln zum Umschreiben werden nicht auf solche Anfragen angewendet.