2016-12-01 7 views
0

프록시 서버에 연결하려고하지만 자격 증명을 제공하지 않으므로 407을 포착하여 사용자에게 creds를 제공해야한다고 알립니다.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); 
    } 
} 

내에서 스택 추적은 이오 예외를 표시하고 인증이 필요하다는 것을 나타냅니다.

왜 내 try catch 블록이 연결 시도가 이루어질 때이 예외를 포착하지 못하고 있는지 이해할 수 없습니다.

발생 원인 : java.io.IOException : 프록시를 통해 터널링 할 수 없습니다. 프록시에서 "HTTP/1.1 407 프록시 인증이 필요합니다 (Forefront TMG에서 요청을 수행 할 수있는 권한이 필요합니다. 웹 프록시 필터에 대한 액세스가 거부되었습니다.)" at sun.net.www.protocol.http.HttpURLConnection.doTunneling (HttpURLConnection.java : 2,084) 19 ... 는 더

답변

0

doTunneling.invoke는이다있는 InvocationTargetException (a ReflectiveOperationException) 등

throw new InternalError 

실행을 던진다.

않고 ​​InternalError은 오류이며, 그래서 당신의

catch (IOException 

는 더 캐치는하지 않습니다.

해결 방법으로 catch (오류 e) 사용할 수 있지만 좋은 생각이 아닙니다.

나는 (그것을 서명이 IOException가 슬로우로 확장되어야하며

java.lang.reflect.InvocationTargetException.getTargetException() 

그것이 IOException가 인 경우에 발생한다

java.net.HttpConnectSocketImpl.doTunneling(HttpURLConnection) 

의 버그 예는 java.io 생각 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