com.subgraph.vega.internal.http.proxy.VegaHttpServerConnection.java Source code

Java tutorial

Introduction

Here is the source code for com.subgraph.vega.internal.http.proxy.VegaHttpServerConnection.java

Source

/*******************************************************************************
 * Copyright (c) 2011 Subgraph.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Subgraph - initial API and implementation
 ******************************************************************************/
package com.subgraph.vega.internal.http.proxy;

import java.io.IOException;
import java.net.Socket;

import org.apache.http.HttpException;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestFactory;
import org.apache.http.impl.SocketHttpServerConnection;
import org.apache.http.io.HttpMessageParser;
import org.apache.http.io.SessionInputBuffer;
import org.apache.http.message.BasicLineParser;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

/**
 * Specialized HttpServerConnection which overrides createHttpRequestFactor() to return
 * an HttpRequestFactory instance which can process the 'CONNECT' method for supporting
 * SSL interception.
 */
public class VegaHttpServerConnection extends SocketHttpServerConnection {
    private HttpRequest cachedRequest;
    private final HttpParams params;
    private HttpHost sslHost;

    /** Information about SSL host */

    public VegaHttpServerConnection(HttpParams params) {
        this.params = params;
    }

    @Override
    protected HttpRequestFactory createHttpRequestFactory() {
        return new VegaHttpRequestFactory();
    }

    @Override
    protected HttpMessageParser createRequestParser(final SessionInputBuffer buffer,
            final HttpRequestFactory requestFactory, final HttpParams params) {
        return new VegaHttpRequestParser(this, buffer, new BasicLineParser(), requestFactory, params);
    }

    public boolean isSslConnection() {
        return (sslHost != null);
    }

    public HttpHost getSslHost() {
        return sslHost;
    }

    public void rebindWithSSL(Socket socket, HttpHost httpHost) throws IOException {
        sslHost = new HttpHost(httpHost);
        bind(socket, params);
    }

    public void bind(final Socket socket, final HttpParams params) throws IOException {
        if (socket == null) {
            throw new IllegalArgumentException("Socket may not be null");
        }
        if (params == null) {
            throw new IllegalArgumentException("HTTP parameters may not be null");
        }

        socket.setTcpNoDelay(HttpConnectionParams.getTcpNoDelay(params));
        socket.setSoTimeout(HttpConnectionParams.getSoTimeout(params));

        int linger = HttpConnectionParams.getLinger(params);
        if (linger >= 0) {
            socket.setSoLinger(linger > 0, linger);
        }

        super.bind(socket, params);
    }

    HttpRequest peekRequestHeader() throws HttpException, IOException {
        if (cachedRequest != null)
            throw new IllegalStateException("A cached peeked request already exists");
        cachedRequest = super.receiveRequestHeader();
        return cachedRequest;
    }

    void dropCachedPeekRequest() {
        if (cachedRequest == null)
            throw new IllegalStateException("Cannot drop cached peek request, because no request is cached.");
        cachedRequest = null;
    }

    @Override
    public HttpRequest receiveRequestHeader() throws HttpException, IOException {
        if (cachedRequest != null) {
            final HttpRequest result = cachedRequest;
            cachedRequest = null;
            return result;
        }
        return super.receiveRequestHeader();
    }

    public Socket getSocket() {
        return super.getSocket();
    }

    public String toString() {
        StringBuffer buffer = new StringBuffer();
        buffer.append("[");
        if (isOpen()) {
            buffer.append(getRemotePort());
        } else {
            buffer.append("closed");
        }
        buffer.append("]");
        return buffer.toString();
    }
}