2016-12-01 3 views
0

Ich versuche, eine Verbindung zu einem Proxy-Server, aber keine Anmeldeinformationen zu liefern, damit ich die 407 abfangen kann und dem Benutzer sagen, dass sie Kredits liefern müssen.Java-Proxy-Authentifizierung IOException nicht geworfen

Ich kann diesen Fehler für das Leben von mir nicht fangen.

Wenn ich durch den Code gehe, bringt es mich zum internen Fehler "sollte nicht hören". Innerhalb HttpConnectionSocketImpl.class

private void doTunneling(HttpURLConnection conn) { 
    try { 
     doTunneling.invoke(conn); 
    } catch (ReflectiveOperationException x) { 
     throw new InternalError("Should not reach here", x); 
    } 
} 

Der Stack-Trace zeigt eine Io Ausnahme und zeigt an, dass Auth erforderlich ist.

Ich verstehe einfach nicht, warum mein Versuch catch Block diese Ausnahme nicht abfängt, wenn der Verbindungsversuch unternommen wird.

Verursacht von: java.io.IOException: Kann nicht durch Proxy tunneln. Der Proxy gibt "HTTP/1.1 407 Proxy-Authentifizierung erforderlich (Forefront TMG erfordert eine Autorisierung zur Erfüllung der Anforderung. Der Zugriff auf den Web-Proxy-Filter wird verweigert.") unter sun.net.www.protocol.http.HttpURLConnection.doTunneling (HttpURLConnection.java : 2084) ... 19 weitere

Antwort

0

doTunneling.invoke wirft ein InvocationTargetException (das ein ReflectiveOperationException ist) und so

throw new InternalError 

ausgeführt wird.

InternalError ist ein Fehler und Ihr so ​​

catch (IOException 

hat keinen Haken es.

Als Workaround können Sie catch (Fehler e) verwenden, aber das ist keine gute Idee.

Ich denke, es ist ein Fehler in

java.net.HttpConnectSocketImpl.doTunneling(HttpURLConnection) 

wo Signatur sollte mit throws IOException erweitert werden und

java.lang.reflect.InvocationTargetException.getTargetException() 

sollte im Falle geworfen werden, eine IOException ist (zB java.io. IOException: Tunnel kann nicht durch den Proxy laufen Proxy gibt "HTTP/1.0 407 Proxy Authentication Required" zurück

Ersetzen Sie die einzelne Zeile

socket.connect (addr, getUrlConnectTimeout());

mit

 try { 
      socket.connect(addr, getUrlConnectTimeout()); 
     } catch (Error e) { 
      if (e.getCause() instanceof InvocationTargetException) { 
       InvocationTargetException tempInvocationTargetException = (InvocationTargetException)e.getCause(); 
       if (tempInvocationTargetException.getTargetException() instanceof IOException) { 
        // Extract the original IOException, see 
        // http://stackoverflow.com/questions/40921296/java-proxy-authentication-ioexception-not-being-thrown/ 
        throw (IOException)tempInvocationTargetException.getTargetException(); 
       } 
      } 
      // rethrow the original error 
      throw e; 
     } 

sollte die erwartete IOException geben.

+0

Ich habe einen Bug dafür eingereicht. "Wir werden Ihren Bericht überprüfen und ihm eine interne Review-ID zuweisen: 9047150" – user2198875

Verwandte Themen