Example usage for java.net ProxySelector getDefault

List of usage examples for java.net ProxySelector getDefault

Introduction

In this page you can find the example usage for java.net ProxySelector getDefault.

Prototype

public static ProxySelector getDefault() 

Source Link

Document

Gets the system-wide proxy selector.

Usage

From source file:android.net.Proxy.java

/** @hide */
public static final HttpRoutePlanner getAndroidProxySelectorRoutePlanner(Context context) {
    AndroidProxySelectorRoutePlanner ret = new AndroidProxySelectorRoutePlanner(new SchemeRegistry(),
            ProxySelector.getDefault(), context);
    return ret;/*from   w w w. j ava 2 s  . c o  m*/
}

From source file:com.pmi.restlet.ext.httpclient.HttpClientHelper.java

/**
 * Configures the HTTP client. By default, it try to set the retry handler.
 *
 * @param httpClient//from   www  .j a  v a 2 s  .c  om
 *            The HTTP client to configure.
 */
protected void configure(DefaultHttpClient httpClient) {
    if (getRetryHandler() != null) {
        try {
            HttpRequestRetryHandler retryHandler = (HttpRequestRetryHandler) Engine.loadClass(getRetryHandler())
                    .newInstance();
            this.httpClient.setHttpRequestRetryHandler(retryHandler);
        } catch (Exception e) {
            getLogger().log(Level.WARNING, "An error occurred during the instantiation of the retry handler.",
                    e);
        }
    }
    ProxySelectorRoutePlanner routePlanner = new ProxySelectorRoutePlanner(
            httpClient.getConnectionManager().getSchemeRegistry(), ProxySelector.getDefault());
    httpClient.setRoutePlanner(routePlanner);
}

From source file:org.apache.shindig.gadgets.http.BasicHttpFetcher.java

/**
 * Creates a new fetcher for fetching HTTP objects.  Not really suitable
 * for production use. Use of an HTTP proxy for security is also necessary
 * for production deployment./*from ww  w .j  av a2  s  .  c o m*/
 *
 * @param maxObjSize          Maximum size, in bytes, of the object we will fetch, 0 if no limit..
 * @param connectionTimeoutMs timeout, in milliseconds, for connecting to hosts.
 * @param readTimeoutMs       timeout, in millseconds, for unresponsive connections
 * @param basicHttpFetcherProxy The http proxy to use.
 */
public BasicHttpFetcher(int maxObjSize, int connectionTimeoutMs, int readTimeoutMs,
        String basicHttpFetcherProxy) {
    // Create and initialize HTTP parameters
    setMaxObjectSizeBytes(maxObjSize);
    setSlowResponseWarning(DEFAULT_SLOW_RESPONSE_WARNING);

    HttpParams params = new BasicHttpParams();

    ConnManagerParams.setTimeout(params, connectionTimeoutMs);

    // These are probably overkill for most sites.
    ConnManagerParams.setMaxTotalConnections(params, 1152);
    ConnManagerParams.setMaxConnectionsPerRoute(params, new ConnPerRouteBean(256));

    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    HttpProtocolParams.setUserAgent(params, "Apache Shindig");
    HttpProtocolParams.setContentCharset(params, "UTF-8");

    HttpConnectionParams.setConnectionTimeout(params, connectionTimeoutMs);
    HttpConnectionParams.setSoTimeout(params, readTimeoutMs);
    HttpConnectionParams.setStaleCheckingEnabled(params, true);

    HttpClientParams.setRedirecting(params, true);
    HttpClientParams.setAuthenticating(params, false);

    // Create and initialize scheme registry
    SchemeRegistry schemeRegistry = new SchemeRegistry();
    schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

    ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
    DefaultHttpClient client = new DefaultHttpClient(cm, params);

    // Set proxy if set via guice.
    if (!StringUtils.isEmpty(basicHttpFetcherProxy)) {
        String[] splits = basicHttpFetcherProxy.split(":");
        ConnRouteParams.setDefaultProxy(client.getParams(),
                new HttpHost(splits[0], Integer.parseInt(splits[1]), "http"));
    }

    // try resending the request once
    client.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(1, true));

    // Add hooks for gzip/deflate
    client.addRequestInterceptor(new HttpRequestInterceptor() {
        public void process(final org.apache.http.HttpRequest request, final HttpContext context)
                throws HttpException, IOException {
            if (!request.containsHeader("Accept-Encoding")) {
                request.addHeader("Accept-Encoding", "gzip, deflate");
            }
        }
    });
    client.addResponseInterceptor(new HttpResponseInterceptor() {
        public void process(final org.apache.http.HttpResponse response, final HttpContext context)
                throws HttpException, IOException {
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                Header ceheader = entity.getContentEncoding();
                if (ceheader != null) {
                    for (HeaderElement codec : ceheader.getElements()) {
                        String codecname = codec.getName();
                        if ("gzip".equalsIgnoreCase(codecname)) {
                            response.setEntity(new GzipDecompressingEntity(response.getEntity()));
                            return;
                        } else if ("deflate".equals(codecname)) {
                            response.setEntity(new DeflateDecompressingEntity(response.getEntity()));
                            return;
                        }
                    }
                }
            }
        }
    });
    client.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler());

    // Disable automatic storage and sending of cookies (see SHINDIG-1382)
    client.removeRequestInterceptorByClass(RequestAddCookies.class);
    client.removeResponseInterceptorByClass(ResponseProcessCookies.class);

    // Use Java's built-in proxy logic in case no proxy set via guice.
    if (StringUtils.isEmpty(basicHttpFetcherProxy)) {
        ProxySelectorRoutePlanner routePlanner = new ProxySelectorRoutePlanner(
                client.getConnectionManager().getSchemeRegistry(), ProxySelector.getDefault());
        client.setRoutePlanner(routePlanner);
    }

    FETCHER = client;
}

From source file:io.github.tavernaextras.biocatalogue.integration.config.BioCataloguePluginConfigurationPanel.java

/**
 * Saves recent changes to the configuration parameter map.
 * Some input validation is performed as well.
 *///from w w w. j a  va  2 s .  c  om
private void applyChanges() {
    // --- BioCatalogue BASE URL ---

    String candidateBaseURL = tfBioCatalogueAPIBaseURL.getText();
    if (candidateBaseURL.length() == 0) {
        JOptionPane.showMessageDialog(this, "Service Catalogue base URL must not be blank",
                "Service Catalogue Configuration", JOptionPane.WARNING_MESSAGE);
        tfBioCatalogueAPIBaseURL.requestFocusInWindow();
        return;
    } else {
        try {
            new URL(candidateBaseURL);
        } catch (MalformedURLException e) {
            JOptionPane.showMessageDialog(this,
                    "Currently set Service Catalogue instance URL is not valid\n."
                            + "Please check the URL and try again.",
                    "Service Catalogue Configuration", JOptionPane.WARNING_MESSAGE);
            tfBioCatalogueAPIBaseURL.selectAll();
            tfBioCatalogueAPIBaseURL.requestFocusInWindow();
            return;
        }

        // check if the base URL has changed from the last saved state
        if (!candidateBaseURL.equals(
                configuration.getProperty(BioCataloguePluginConfiguration.SERVICE_CATALOGUE_BASE_URL))) {
            // Perform various checks on the new URL

            // Do a GET with "Accept" header set to "application/xml"
            // We are expecting a 200 OK and an XML doc in return that
            // contains the BioCataogue version number element.
            DefaultHttpClient httpClient = new DefaultHttpClient();

            // Set the proxy settings, if any
            if (System.getProperty(PROXY_HOST) != null && !System.getProperty(PROXY_HOST).equals("")) {
                // Instruct HttpClient to use the standard
                // JRE proxy selector to obtain proxy information
                ProxySelectorRoutePlanner routePlanner = new ProxySelectorRoutePlanner(
                        httpClient.getConnectionManager().getSchemeRegistry(), ProxySelector.getDefault());
                httpClient.setRoutePlanner(routePlanner);
                // Do we need to authenticate the user to the proxy?
                if (System.getProperty(PROXY_USERNAME) != null
                        && !System.getProperty(PROXY_USERNAME).equals("")) {
                    // Add the proxy username and password to the list of credentials
                    httpClient.getCredentialsProvider().setCredentials(
                            new AuthScope(System.getProperty(PROXY_HOST),
                                    Integer.parseInt(System.getProperty(PROXY_PORT))),
                            new UsernamePasswordCredentials(System.getProperty(PROXY_USERNAME),
                                    System.getProperty(PROXY_PASSWORD)));
                }
            }

            HttpGet httpGet = new HttpGet(candidateBaseURL);
            httpGet.setHeader("Accept", APPLICATION_XML_MIME_TYPE);

            // Execute the request
            HttpContext localContext = new BasicHttpContext();
            HttpResponse httpResponse;
            try {
                httpResponse = httpClient.execute(httpGet, localContext);
            } catch (Exception ex1) {
                logger.error(
                        "Service Catalogue preferences configuration: Failed to do " + httpGet.getRequestLine(),
                        ex1);
                // Warn the user
                JOptionPane.showMessageDialog(this,
                        "Failed to connect to the URL of the Service Catalogue instance.\n"
                                + "Please check the URL and try again.",
                        "Service Catalogue Configuration", JOptionPane.INFORMATION_MESSAGE);

                // Release resource
                httpClient.getConnectionManager().shutdown();

                tfBioCatalogueAPIBaseURL.requestFocusInWindow();
                return;
            }

            if (httpResponse.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_OK) { // HTTP/1.1 200 OK
                HttpEntity httpEntity = httpResponse.getEntity();
                String contentType = httpEntity.getContentType().getValue().toLowerCase().trim();
                logger.info(
                        "Service Catalogue preferences configuration: Got 200 OK when testing the Service Catalogue instance by doing "
                                + httpResponse.getStatusLine() + ". Content type of response " + contentType);
                if (contentType.startsWith(APPLICATION_XML_MIME_TYPE)) {
                    String value = null;
                    Document doc = null;
                    try {
                        value = readResponseBodyAsString(httpEntity).trim();
                        // Try to read this string into an XML document
                        SAXBuilder builder = new SAXBuilder();
                        byte[] bytes = value.getBytes("UTF-8");
                        doc = builder.build(new ByteArrayInputStream(bytes));
                    } catch (Exception ex2) {
                        logger.error(
                                "Service Catalogue preferences configuration: Failed to build an XML document from the response.",
                                ex2);
                        // Warn the user
                        JOptionPane.showMessageDialog(this,
                                "Failed to get the expected response body when testing the Service Catalogue instance.\n"
                                        + "The URL is probably wrong. Please check it and try again.",
                                "Service Catalogue Configuration", JOptionPane.INFORMATION_MESSAGE);
                        tfBioCatalogueAPIBaseURL.requestFocusInWindow();
                        return;
                    } finally {
                        // Release resource
                        httpClient.getConnectionManager().shutdown();
                    }
                    // Get the version element from the XML document
                    Attribute apiVersionAttribute = doc.getRootElement().getAttribute(API_VERSION);
                    if (apiVersionAttribute != null) {
                        String apiVersion = apiVersionAttribute.getValue();
                        String versions[] = apiVersion.split("[.]");
                        String majorVersion = versions[0];
                        String minorVersion = versions[1];
                        try {
                            //String patchVersion = versions[2]; // we are not comparing the patch versions
                            String supportedMajorVersion = MIN_SUPPORTED_BIOCATALOGUE_API_VERSION[0];
                            String supportedMinorVersion = MIN_SUPPORTED_BIOCATALOGUE_API_VERSION[1];
                            Integer iSupportedMajorVersion = Integer.parseInt(supportedMajorVersion);
                            Integer iMajorVersion = Integer.parseInt(majorVersion);
                            Integer iSupportedMinorVersion = Integer.parseInt(supportedMinorVersion);
                            Integer iMinorVersion = Integer.parseInt(minorVersion);
                            if (!(iSupportedMajorVersion == iMajorVersion
                                    && iSupportedMinorVersion <= iMinorVersion)) {
                                // Warn the user
                                JOptionPane.showMessageDialog(this,
                                        "The version of the Service Catalogue instance you are trying to connect to is not supported.\n"
                                                + "Please change the URL and try again.",
                                        "Service Catalogue Configuration", JOptionPane.INFORMATION_MESSAGE);
                                tfBioCatalogueAPIBaseURL.requestFocusInWindow();
                                return;
                            }
                        } catch (Exception e) {
                            logger.error(e);
                        }
                    } // if null - we'll try to do our best to connect to BioCatalogue anyway
                } else {
                    logger.error(
                            "Service Catalogue preferences configuration: Failed to get the expected response content type when testing the Service Catalogue instance. "
                                    + httpGet.getRequestLine() + " returned content type '" + contentType
                                    + "'; expected response content type is 'application/xml'.");
                    // Warn the user
                    JOptionPane.showMessageDialog(this,
                            "Failed to get the expected response content type when testing the Service Catalogue instance.\n"
                                    + "The URL is probably wrong. Please check it and try again.",
                            "Service Catalogue Plugin", JOptionPane.INFORMATION_MESSAGE);
                    tfBioCatalogueAPIBaseURL.requestFocusInWindow();
                    return;
                }
            } else {
                logger.error(
                        "Service Catalogue preferences configuration: Failed to get the expected response status code when testing the Service Catalogue instance. "
                                + httpGet.getRequestLine() + " returned the status code "
                                + httpResponse.getStatusLine().getStatusCode()
                                + "; expected status code is 200 OK.");
                // Warn the user
                JOptionPane.showMessageDialog(this,
                        "Failed to get the expected response status code when testing the Service Catalogue instance.\n"
                                + "The URL is probably wrong. Please check it and try again.",
                        "Service Catalogue Configuration", JOptionPane.INFORMATION_MESSAGE);
                tfBioCatalogueAPIBaseURL.requestFocusInWindow();
                return;
            }

            // Warn the user of the changes in the BioCatalogue base URL
            JOptionPane.showMessageDialog(this,
                    "You have updated the Service Catalogue base URL.\n"
                            + "This does not take effect until you restart Taverna.",
                    "Service catalogue Configuration", JOptionPane.INFORMATION_MESSAGE);

        }

        // the new base URL seems to be valid - can save it into config
        // settings
        configuration.setProperty(BioCataloguePluginConfiguration.SERVICE_CATALOGUE_BASE_URL, candidateBaseURL);

        /*         // also update the base URL in the BioCatalogueClient
                 BioCatalogueClient.getInstance()
                       .setBaseURL(candidateBaseURL);*/
    }

}

From source file:net.oddsoftware.android.feedscribe.data.Downloader.java

private HttpClient createHttpClient() {
    // use apache http client lib to set parameters from feedStatus
    DefaultHttpClient client = new DefaultHttpClient();

    // set up proxy handler
    ProxySelectorRoutePlanner routePlanner = new ProxySelectorRoutePlanner(
            client.getConnectionManager().getSchemeRegistry(), ProxySelector.getDefault());
    client.setRoutePlanner(routePlanner);

    return client;
}

From source file:de.wikilab.android.friendica01.TwAjax.java

public void updateProxySettings(Context ctx) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
    myProxyIp = prefs.getString("proxy_host", null);
    if (myProxyIp == null || myProxyIp.equals("")) {
        myProxyIp = null;//from ww  w .  ja  va 2 s  . c o  m

        ProxySelector defaultProxySelector = ProxySelector.getDefault();
        List<Proxy> proxyList = defaultProxySelector.select(URI.create("http://frnd.tk"));
        //Log.i("TwAjax", "proxyCount="+proxyList.size()+"|"+((InetSocketAddress)proxyList.get(0).address()).getHostName());
        if (proxyList.size() == 0 || proxyList.get(0).address() == null) {
            return;
        }
        myProxyIp = ((InetSocketAddress) proxyList.get(0).address()).getHostName();
        myProxyPort = ((InetSocketAddress) proxyList.get(0).address()).getPort();
    } else {
        myProxyPort = Integer.valueOf(prefs.getString("proxy_port", null));
    }

    //for(String key:prefs.getAll().keySet()) {
    //Log.w("PREF:",key+"="+prefs.getAll().get(key).toString());   
    //}
    myProxyUsername = prefs.getString("proxy_user", null);
    myProxyPassword = prefs.getString("proxy_password", null);
    Log.i("TwAjax", "PROXY SETTINGS:");
    Log.i("TwAjax", "Host=" + myProxyIp);
    Log.i("TwAjax", "Port=" + myProxyPort);
    Log.i("TwAjax", "User=" + myProxyUsername);

}

From source file:com.bigdata.rdf.sail.remoting.GraphRepositoryClient.java

private ProxyHost getProxyHost() {
    ProxyHost theProxyHost = null;/* w  ww . j  ava2  s.co m*/
    ProxySelector ps = ProxySelector.getDefault();
    List<Proxy> p = null;
    // select the proxy for the URI of this repository
    try {
        if (ps != null) {
            // log.info( "Getting Proxy List." );
            p = ps.select(new java.net.URI(this.servletURL));
        }
    } catch (Exception e) {
        // log.warn( "Exception getting proxy: " + e.toString() );
    }
    if (p == null) {
        // log.warn( "No proxy information available." );
    } else {
        // log.info( "Received proxy list: " + p.toString() );
        Iterator<Proxy> proxies = p.iterator();
        // just take the first for now
        if (proxies != null && proxies.hasNext()) {
            Proxy theProxy = (Proxy) proxies.next();
            // log.info( "Proxy set to: " + theProxy.toString() );
            if (!Proxy.NO_PROXY.equals(theProxy)) {
                InetSocketAddress theSock = (InetSocketAddress) theProxy.address();
                theProxyHost = new ProxyHost(theSock.getHostName(), theSock.getPort());
            }
        } else {
            // log.warn( "Proxy list has zero members." );
        }
    }
    return theProxyHost;
}

From source file:de.tudarmstadt.ukp.shibhttpclient.ShibHttpClient.java

/**
 * Create a new client (with an explicit proxy and possibly transparent authentication)
 * /*from  www. ja  v a  2 s . c o m*/
 * @param aIdpUrl
 *            the URL of the IdP. Should probably be something ending in "/SAML2/SOAP/ECP"
 * @param aUsername
 *            the user name to log into the IdP.
 * @param aPassword
 *            the password to log in to the IdP.
 * @param aProxy
 *            if not {@code null}, use this proxy instead of the default system proxy (if any)
 * @param anyCert
 *            if {@code true}, accept any certificate from any remote host. Otherwise,
 *            certificates need to be installed in the JRE.
 * @param transparentAuth
 *            if {@code true} (default), add a HttpRequestPostProcessor to transparently 
 *            authenticate. Otherwise, you must handle the authentication process yourself.
 */
public ShibHttpClient(String aIdpUrl, String aUsername, String aPassword, HttpHost aProxy, boolean anyCert,
        boolean transparentAuth) {

    setIdpUrl(aIdpUrl);
    setUsername(aUsername);
    setPassword(aPassword);

    // Use a pooling connection manager, because we'll have to do a call out to the IdP
    // while still being in a connection with the SP
    PoolingHttpClientConnectionManager connMgr;
    if (anyCert) {
        try {
            SSLContextBuilder builder = new SSLContextBuilder();
            builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder
                    .<ConnectionSocketFactory>create().register("http", new PlainConnectionSocketFactory())
                    .register("https", new SSLConnectionSocketFactory(builder.build(),
                            SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER))
                    .build();
            connMgr = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
        } catch (GeneralSecurityException e) {
            // There shouldn't be any of these exceptions, because we do not use an actual
            // keystore
            throw new IllegalStateException(e);
        }
    } else {
        connMgr = new PoolingHttpClientConnectionManager();
    }
    connMgr.setMaxTotal(10);
    connMgr.setDefaultMaxPerRoute(5);

    // The client needs to remember the auth cookie
    cookieStore = new BasicCookieStore();
    RequestConfig globalRequestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.BROWSER_COMPATIBILITY)
            .build();

    // Let's throw all common client elements into one builder object
    HttpClientBuilder customClient = HttpClients.custom().setConnectionManager(connMgr)
            // The client needs to remember the auth cookie
            .setDefaultRequestConfig(globalRequestConfig).setDefaultCookieStore(cookieStore)
            // Add the ECP/PAOS headers - needs to be added first so the cookie we get from
            // the authentication can be handled by the RequestAddCookies interceptor later
            .addInterceptorFirst(new HttpRequestPreprocessor());

    // Automatically log into IdP if transparent Shibboleth authentication handling is requested (default)
    if (transparentAuth) {
        customClient = customClient.addInterceptorFirst(new HttpRequestPostprocessor());
    }

    // Build the client with/without proxy settings 
    if (aProxy == null) {
        // use the proxy settings of the JVM, if specified 
        client = customClient.setRoutePlanner(new SystemDefaultRoutePlanner(ProxySelector.getDefault()))
                .build();
    } else {
        // use the explicit proxy
        client = customClient.setProxy(aProxy).build();
    }

    parserPool = new BasicParserPool();
    parserPool.setNamespaceAware(true);
}

From source file:com.github.sardine.FunctionalSardineTest.java

@Test
public void testProxyConfiguration() throws Exception {
    Sardine sardine = SardineFactory.begin(null, null, ProxySelector.getDefault());
    try {/*  w w w. j  av  a 2 s  .  c o  m*/
        final List<DavResource> resources = sardine.list("http://sardine.googlecode.com/svn/trunk/");
        assertNotNull(resources);
        assertFalse(resources.isEmpty());
    } catch (SardineException e) {
        fail(e.getMessage());
    }
}

From source file:com.xmlcalabash.library.HttpRequest.java

public void gorun() throws SaxonApiException {
    super.gorun();

    XdmNode requestDoc = source.read(stepContext);
    XdmNode start = S9apiUtils.getDocumentElement(requestDoc);

    if (!c_request.equals(start.getNodeName())) {
        throw XProcException.stepError(40);
    }/*from   www .  j  a  v  a2s.  c om*/

    // Check for valid attributes
    XdmSequenceIterator iter = start.axisIterator(Axis.ATTRIBUTE);
    boolean ok = true;
    while (iter.hasNext()) {
        XdmNode attr = (XdmNode) iter.next();
        QName name = attr.getNodeName();
        if (_method.equals(name) || _href.equals(name) || _detailed.equals(name) || _status_only.equals(name)
                || _username.equals(name) || _password.equals(name) || _auth_method.equals(name)
                || _send_authorization.equals(name) || _override_content_type.equals(name)) {
            // nop
        } else {
            if (XMLConstants.DEFAULT_NS_PREFIX.equals(name.getNamespaceURI())) {
                throw new XProcException(step.getNode(),
                        "Unsupported attribute on c:request for p:http-request: " + name);
            }
        }
    }

    String send = step.getExtensionAttribute(cx_send_binary);
    encodeBinary = !"true".equals(send);

    method = start.getAttributeValue(_method);
    statusOnly = "true".equals(start.getAttributeValue(_status_only));
    detailed = "true".equals(start.getAttributeValue(_detailed));
    overrideContentType = start.getAttributeValue(_override_content_type);

    if (method == null) {
        throw XProcException.stepError(6);
    }

    if (statusOnly && !detailed) {
        throw XProcException.stepError(4);
    }

    if (start.getAttributeValue(_href) == null) {
        throw new XProcException(step.getNode(),
                "The 'href' attribute must be specified on c:request for p:http-request");
    }

    requestURI = start.getBaseURI().resolve(start.getAttributeValue(_href));

    if ("file".equals(requestURI.getScheme())) {
        doFile();
        return;
    }

    // What about cookies
    String saveCookieKey = step.getExtensionAttribute(cx_save_cookies);
    String useCookieKeys = step.getExtensionAttribute(cx_use_cookies);
    String cookieKey = step.getExtensionAttribute(cx_cookies);

    if (saveCookieKey == null) {
        saveCookieKey = cookieKey;
    }

    if (useCookieKeys == null) {
        useCookieKeys = cookieKey;
    }

    client = new HttpClient();
    client.getParams().setCookiePolicy(CookiePolicy.RFC_2109);
    client.getParams().setParameter("http.protocol.single-cookie-header", true);

    HttpState state = client.getState();

    if (useCookieKeys != null) {
        for (String key : useCookieKeys.split("\\s+")) {
            for (Cookie cookie : runtime.getCookies(key)) {
                state.addCookie(cookie);
            }
        }
    }

    String timeOutStr = step.getExtensionAttribute(cx_timeout);
    if (timeOutStr != null) {
        HttpMethodParams params = client.getParams();
        params.setSoTimeout(Integer.parseInt(timeOutStr));
    }

    ProxySelector proxySelector = ProxySelector.getDefault();
    List<Proxy> plist = proxySelector.select(requestURI);
    // I have no idea what I'm expected to do if I get more than one...
    if (plist.size() > 0) {
        Proxy proxy = plist.get(0);
        switch (proxy.type()) {
        case DIRECT:
            // nop;
            break;
        case HTTP:
            // This can't cause a ClassCastException, right?
            InetSocketAddress addr = (InetSocketAddress) proxy.address();
            String host = addr.getHostName();
            int port = addr.getPort();
            client.getHostConfiguration().setProxy(host, port);
            break;
        default:
            // FIXME: send out a log message
            break;
        }
    }

    if (start.getAttributeValue(_username) != null) {
        String user = start.getAttributeValue(_username);
        String pass = start.getAttributeValue(_password);
        String meth = start.getAttributeValue(_auth_method);

        if (meth == null || !("basic".equals(meth.toLowerCase()) || "digest".equals(meth.toLowerCase()))) {
            throw XProcException.stepError(3, "Unsupported auth-method: " + meth);
        }

        String host = requestURI.getHost();
        int port = requestURI.getPort();
        AuthScope scope = new AuthScope(host, port);

        UsernamePasswordCredentials cred = new UsernamePasswordCredentials(user, pass);

        client.getState().setCredentials(scope, cred);

        if ("basic".equals(meth.toLowerCase())) {
            client.getParams().setAuthenticationPreemptive(true);
        }
    }

    iter = start.axisIterator(Axis.CHILD);
    XdmNode body = null;
    while (iter.hasNext()) {
        XdmNode event = (XdmNode) iter.next();
        // FIXME: What about non-whitespace text nodes?
        if (event.getNodeKind() == XdmNodeKind.ELEMENT) {
            if (body != null) {
                throw new UnsupportedOperationException("Elements follow c:multipart or c:body");
            }

            if (XProcConstants.c_header.equals(event.getNodeName())) {
                String name = event.getAttributeValue(_name);
                if (name == null) {
                    continue; // this can't happen, right?
                }
                if (name.toLowerCase().equals("content-type")) {
                    // We'll deal with the content-type header later
                    headerContentType = event.getAttributeValue(_value).toLowerCase();
                } else {
                    headers.add(new Header(event.getAttributeValue(_name), event.getAttributeValue(_value)));
                }
            } else if (XProcConstants.c_multipart.equals(event.getNodeName())
                    || XProcConstants.c_body.equals(event.getNodeName())) {
                body = event;
            } else {
                throw new UnsupportedOperationException("Unexpected request element: " + event.getNodeName());
            }
        }
    }

    String lcMethod = method.toLowerCase();

    // You can only have a body on PUT or POST
    if (body != null && !("put".equals(lcMethod) || "post".equals(lcMethod))) {
        throw XProcException.stepError(5);
    }

    HttpMethodBase httpResult;

    if ("get".equals(lcMethod)) {
        httpResult = doGet();
    } else if ("post".equals(lcMethod)) {
        httpResult = doPost(body);
    } else if ("put".equals(lcMethod)) {
        httpResult = doPut(body);
    } else if ("head".equals(lcMethod)) {
        httpResult = doHead();
    } else if ("delete".equals(lcMethod)) {
        httpResult = doDelete();
    } else {
        throw new UnsupportedOperationException("Unrecognized http method: " + method);
    }

    TreeWriter tree = new TreeWriter(runtime);
    tree.startDocument(requestURI);

    try {
        // Execute the method.
        int statusCode = client.executeMethod(httpResult);

        // Deal with cookies
        if (saveCookieKey != null) {
            runtime.clearCookies(saveCookieKey);

            state = client.getState();
            Cookie[] cookies = state.getCookies();
            for (Cookie cookie : cookies) {
                runtime.addCookie(saveCookieKey, cookie);
            }
        }

        String contentType = getContentType(httpResult);
        if (overrideContentType != null) {
            if ((xmlContentType(contentType) && overrideContentType.startsWith("image/"))
                    || (contentType.startsWith("text/") && overrideContentType.startsWith("image/"))
                    || (contentType.startsWith("image/") && xmlContentType(overrideContentType))
                    || (contentType.startsWith("image/") && overrideContentType.startsWith("text/"))
                    || (contentType.startsWith("multipart/") && !overrideContentType.startsWith("multipart/"))
                    || (!contentType.startsWith("multipart/")
                            && overrideContentType.startsWith("multipart/"))) {
                throw XProcException.stepError(30);
            }

            //System.err.println(overrideContentType + " overrides " + contentType);
            contentType = overrideContentType;
        }

        if (detailed) {
            tree.addStartElement(XProcConstants.c_response);
            tree.addAttribute(_status, "" + statusCode);
            tree.startContent();

            for (Header header : httpResult.getResponseHeaders()) {
                // I don't understand why/how HeaderElement parsing works. I get very weird results.
                // So I'm just going to go the long way around...
                String h = header.toString();
                int cp = h.indexOf(":");
                String name = header.getName();
                String value = h.substring(cp + 1).trim();

                tree.addStartElement(XProcConstants.c_header);
                tree.addAttribute(_name, name);
                tree.addAttribute(_value, value);
                tree.startContent();
                tree.addEndElement();
            }

            if (statusOnly) {
                // Skip reading the result
            } else {
                // Read the response body.
                InputStream bodyStream = httpResult.getResponseBodyAsStream();
                if (bodyStream != null) {
                    readBodyContent(tree, bodyStream, httpResult);
                }
            }

            tree.addEndElement();
        } else {
            if (statusOnly) {
                // Skip reading the result
            } else {
                // Read the response body.
                InputStream bodyStream = httpResult.getResponseBodyAsStream();
                if (bodyStream != null) {
                    readBodyContent(tree, bodyStream, httpResult);
                } else {
                    throw XProcException.dynamicError(6);
                }
            }
        }
    } catch (Exception e) {
        throw new XProcException(e);
    } finally {
        // Release the connection.
        httpResult.releaseConnection();
    }

    tree.endDocument();

    XdmNode resultNode = tree.getResult();

    result.write(stepContext, resultNode);
}