2016-12-01 21 views
0

私はプロキシサーバーに接続しようとしていますが、資格情報を提供しないため、407を捕まえて、ユーザーに信用を提供する必要があることを伝えます。javaプロキシ認証IOExceptionがスローされない

私の人生の間、このエラーをキャッチすることはできません。

Socket socket = null; 
    InetSocketAddress addr = new InetSocketAddress(host, port); 
    Proxy proxy = new Proxy(Proxy.Type.HTTP, addr); 
    try 
     { 
      socket = new Socket(proxy); 
      socket.connect(addr, getUrlConnectTimeout()); 
     } 
    catch (IOException ioe) 
     { 
     logger.info("IOE"); 
     } 

コードをステップすると、内部エラー「私には聞こえません」が表示されます。 HttpConnectionSocketImpl.class内

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

スタックトレースはIo例外を示し、authが必要であることを示します。

なぜ私のtry catchブロックが接続の試行が行われているときにこの例外をキャッチしていないのか分かりません。

原因:java.io.IOException:プロキシをトンネルできません。プロキシが返す "HTTP/1.1 407プロキシ認証が必要(Forefront TMGで要求を満たすための承認が必要です.Webプロキシフィルタへのアクセスが拒否されています)" at sun.net.www.protocol.http.HttpURLConnection.doTunneling(HttpURLConnection.java :2084) ... 19より

答えて

0

doTunneling.invokeはReflectiveOperationExceptionあるにInvocationTargetException()をスローし、そう

throw new InternalError 

が実行されます。

InternalErrorはエラーですので、あなたの

catch (IOException 

にはキャッチそれはしません。

回避策として、 catch(エラーe) を使用できますが、それは良い考えではありません。

私はそれが

署名はIOExceptionがスローし、

java.lang.reflect.InvocationTargetException.getTargetException() 

は、例えばjava.io.(それはIOExceptionを ある場合にスローされるべきで拡張されるべき

java.net.HttpConnectSocketImpl.doTunneling(HttpURLConnection) 

のバグだと思いますIOException:プロキシをトンネルできません。プロキシから「HTTP/1.0 407プロキシ認証が必要です」というメッセージが返されます。

単一行を置換

socket.connect(addr、getUrlConnectTimeout());

 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; 
     } 

は期待にIOExceptionを与える必要があります。

+0

私はそれのためのバグを提出しました。 "お客様のレポートをレビューし、内部レビューID:9047150を割り当てました。 – user2198875

関連する問題