2017-12-26 5 views
0

프록시를 통해 특정 URL의 HTTP 호출을 전달하고 나머지를 직접 처리해야한다는 요구 사항이 있습니다. java.net의 ProxySelector를 사용하여 사용자 정의 프록시 구현을 작성했습니다. HTTP 호출 (이 경우 프록시 액세스 로그에서 볼 수 있습니다.)에서 제대로 작동하지만 HTTPS 호출의 경우 프록시를 사용하지 않는 것처럼 보입니다. 여기에 뭔가 빠졌습니다. 프록시 서버가 제대로 구성되어 있고 프록시가있는 브라우저에서 일부 HTTPS 호출이 전달되면 액세스 로그가 업데이트됩니다.java에서 특정 HTTPS 요청에 프록시 사용

package com.blabla.proxy; 

import java.io.IOException; 
import java.net.InetSocketAddress; 
import java.net.Proxy; 
import java.net.ProxySelector; 
import java.net.SocketAddress; 
import java.net.URI; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 

import com.vuclip.pubsub.logging.PubSubUtil; 
import com.vuclip.pubsub.logging.client.GooglePubSubClient; 

public class CustomProxySelector extends ProxySelector { 

    private static final Logger LOGGER = LogManager.getLogger(PubSubUtil.class); 
    private final ProxySelector def; 
    private final String PUB_SUB_URL = "pubsub.googleapis.com"; 
    List<Proxy> proxyList = new ArrayList<Proxy>(); 
    private Proxy proxy=null; 

    public CustomProxySelector(ProxySelector aDefault) { 
     this.def = aDefault; 
    } 

    @Override 
    public void connectFailed(URI arg0, SocketAddress soc, IOException ex) { 
     LOGGER.error("Error in connecting to proxcy "+soc +" for pubsub :"+ ex); 
    } 

    @Override 
    public List<Proxy> select(URI uri) { 

     if ("https".equalsIgnoreCase(uri.getScheme()) && uri.getHost().startsWith(PUB_SUB_URL) 
       && GooglePubSubClient.isProxyEnabled()) { 

      synchronized (this) { 
       if (proxy == null) { 
        proxy = new Proxy(Proxy.Type.SOCKS, 
          new InetSocketAddress(GooglePubSubClient.getProxyHost(), GooglePubSubClient.getProxyPort())); 
       } 
      } 

      proxyList.add(proxy); 
      LOGGER.debug("ProxyList:" + proxyList); 
      return proxyList; 
     } 
     proxyList = def.select(uri); 
     LOGGER.debug("Default proxy list : " + proxyList); 
     return proxyList; 
    } 
} 
+0

GooglePubSubClient.isProxyEnabled()가 true를 반환합니까? – StephaneM

+0

예. 나는 디버그 모드에서 체크했다. 사실 가치가 있습니다. –

답변

0

Proxy.Type.SOCKS가 Proxy.Type.HTTP로 변경되어 저에게 효과적입니다.

관련 문제