Changeset d5cc1d8


Ignore:
Timestamp:
Nov 17, 2017 8:49:00 PM (3 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
33aac1b
Parents:
92a26f6
Message:

SSLEepGet: Refactor proxy code to new method, in prep for adding more

File:
1 edited

Legend:

Unmodified
Added
Removed
  • core/java/src/net/i2p/util/SSLEepGet.java

    r92a26f6 rd5cc1d8  
    670670                    if (_proxyType != ProxyType.HTTP)
    671671                        throw new IOException("Unsupported proxy type " + _proxyType);
    672 
    673                     // connect to the proxy
    674                     // _proxyPort validated in superconstrutor, no need to set default here
    675                     if (_fetchHeaderTimeout > 0) {
    676                         _proxy = new Socket();
    677                         _proxy.setSoTimeout(_fetchHeaderTimeout);
    678                         _proxy.connect(new InetSocketAddress(_proxyHost, _proxyPort), _fetchHeaderTimeout);
    679                     } else {
    680                         _proxy = new Socket(_proxyHost, _proxyPort);
    681                     }
    682                     _proxyIn = _proxy.getInputStream();
    683                     _proxyOut = _proxy.getOutputStream();
    684                     StringBuilder buf = new StringBuilder(64);
    685                     buf.append("CONNECT ").append(host).append(':').append(port).append(" HTTP/1.1\r\n");
    686                     // TODO if we need extra headers to the proxy, add a new method and list.
    687                     // Standard extra headers go the server, not the proxy
    688                     //if (_extraPHeaders != null) {
    689                     //    for (String hdr : _extraPHeaders) {
    690                     //        buf.append(hdr).append("\r\n");
    691                     //}
    692                     if (_authState != null && _authState.authMode != AUTH_MODE.NONE) {
    693                         // TODO untested, is this right?
    694                         buf.append("Proxy-Authorization: ");
    695                         buf.append(_authState.getAuthHeader("CONNECT", host));
    696                         buf.append("\r\n");
    697                     }
    698                     buf.append("\r\n");
    699                     _proxyOut.write(DataHelper.getUTF8(buf.toString()));
    700                     _proxyOut.flush();
    701 
    702                     // read the proxy response
    703                     _aborted = false;
    704                     readHeaders();
    705                     if (_aborted)
    706                         throw new IOException("Timed out reading the proxy headers");
    707                     if (_responseCode == 407) {
    708                         // TODO
    709                         throw new IOException("Proxy auth unsupported");
    710                     } else if (_responseCode != 200) {
    711                         // readHeaders() will throw on most errors, but here we ensure it is 200
    712                         throw new IOException("Invalid proxy response: " + _responseCode + ' ' + _responseText);
    713                     }
    714                     if (_redirectLocation != null)
    715                         throw new IOException("Proxy redirect not allowed");
    716                     if (_log.shouldLog(Log.DEBUG))
    717                         _log.debug("proxy headers read completely");
    718 
    719                     // wrap the socket in an SSLSocket
    720                     if (_sslContext != null)
    721                         _proxy = _sslContext.getSocketFactory().createSocket(_proxy, host, port, true);
    722                     else
    723                         _proxy = ((SSLSocketFactory) SSLSocketFactory.getDefault()).createSocket(_proxy, host, port, true);
     672                    httpProxyConnect(host, port);
    724673                } else {
    725674                    // Warning, createSocket() followed by connect(InetSocketAddress)
     
    784733            _log.debug("Request flushed");
    785734    }
     735
     736    /**
     737     *  Connect to a HTTP proxy.
     738     *  Side effects: Sets _proxy, _proxyIn, _proxyOut,
     739     *  and other globals via readHeaders()
     740     *
     741     *  @since 0.9.33
     742     */
     743    private void httpProxyConnect(String host, int port) throws IOException {
     744        // connect to the proxy
     745        // _proxyPort validated in superconstrutor, no need to set default here
     746        if (_fetchHeaderTimeout > 0) {
     747            _proxy = new Socket();
     748            _proxy.setSoTimeout(_fetchHeaderTimeout);
     749            _proxy.connect(new InetSocketAddress(_proxyHost, _proxyPort), _fetchHeaderTimeout);
     750        } else {
     751            _proxy = new Socket(_proxyHost, _proxyPort);
     752        }
     753        _proxyIn = _proxy.getInputStream();
     754        _proxyOut = _proxy.getOutputStream();
     755        StringBuilder buf = new StringBuilder(64);
     756        buf.append("CONNECT ").append(host).append(':').append(port).append(" HTTP/1.1\r\n");
     757        // TODO if we need extra headers to the proxy, add a new method and list.
     758        // Standard extra headers go the server, not the proxy
     759        //if (_extraPHeaders != null) {
     760        //    for (String hdr : _extraPHeaders) {
     761        //        buf.append(hdr).append("\r\n");
     762        //}
     763        if (_authState != null && _authState.authMode != AUTH_MODE.NONE) {
     764            // TODO untested, is this right?
     765            buf.append("Proxy-Authorization: ");
     766            buf.append(_authState.getAuthHeader("CONNECT", host));
     767            buf.append("\r\n");
     768        }
     769        buf.append("\r\n");
     770        _proxyOut.write(DataHelper.getUTF8(buf.toString()));
     771        _proxyOut.flush();
     772
     773        // read the proxy response
     774        _aborted = false;
     775        readHeaders();
     776        if (_aborted)
     777            throw new IOException("Timed out reading the proxy headers");
     778        if (_responseCode == 407) {
     779            // TODO
     780            throw new IOException("Proxy auth unsupported");
     781        } else if (_responseCode != 200) {
     782            // readHeaders() will throw on most errors, but here we ensure it is 200
     783            throw new IOException("Invalid proxy response: " + _responseCode + ' ' + _responseText);
     784        }
     785        if (_redirectLocation != null)
     786            throw new IOException("Proxy redirect not allowed");
     787        if (_log.shouldLog(Log.DEBUG))
     788            _log.debug("proxy headers read completely");
     789
     790        // wrap the socket in an SSLSocket
     791        if (_sslContext != null)
     792            _proxy = _sslContext.getSocketFactory().createSocket(_proxy, host, port, true);
     793        else
     794            _proxy = ((SSLSocketFactory) SSLSocketFactory.getDefault()).createSocket(_proxy, host, port, true);
     795    }
    786796}
Note: See TracChangeset for help on using the changeset viewer.