/******************************************************************************* * 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.requests; import java.net.URI; import java.net.URISyntaxException; import org.apache.http.HttpEntity; import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpHost; import org.apache.http.HttpRequest; import org.apache.http.ProtocolVersion; import org.apache.http.RequestLine; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import com.subgraph.vega.api.http.requests.IHttpHeaderBuilder; import com.subgraph.vega.api.http.requests.IHttpMutableRequest; import com.subgraph.vega.api.http.requests.IHttpRequestBuilder; import com.subgraph.vega.api.model.requests.IRequestLogRecord; import com.subgraph.vega.http.requests.custom.HttpEntityEnclosingMutableRequest; import com.subgraph.vega.http.requests.custom.HttpMutableRequest; public class HttpRequestBuilder extends HttpMessageBuilder implements IHttpRequestBuilder { private String scheme = "http"; private String host = ""; private int hostPort = 80; private String method = ""; private String path = ""; @Override public synchronized void clear() { super.clear(); scheme = "http"; host = ""; hostPort = 80; method = ""; path = ""; } @Override public synchronized void setFromRequest(IRequestLogRecord record) throws URISyntaxException { setFromRequest(record.getRequest()); setFromHttpHost(record.getHttpHost()); } @Override public synchronized void setFromRequest(HttpRequest request) throws URISyntaxException { setParams(request.getParams().copy()); setFromRequestLine(request.getRequestLine()); setHeaders(request.getAllHeaders()); if (request instanceof HttpEntityEnclosingRequest) { setEntity(((HttpEntityEnclosingRequest) request).getEntity()); } else { setEntity(null); } } @Override public synchronized void setFromRequestLine(RequestLine requestLine) throws URISyntaxException { method = requestLine.getMethod(); final URI requestUri = new URI(requestLine.getUri()); scheme = requestUri.getScheme(); if (scheme == null) { scheme = "http"; } host = requestUri.getHost(); hostPort = requestUri.getPort(); if (hostPort == -1) { if (scheme.equals("https")) { hostPort = 443; } else { hostPort = 80; } } setPathFromUri(requestUri); setProtocolVersion(requestLine.getProtocolVersion()); } @Override public synchronized void setFromUri(URI uri) { if (uri.getScheme() != null) { scheme = uri.getScheme(); if (uri.getHost() != null) { host = uri.getHost(); hostPort = uri.getPort(); if (hostPort == -1) { hostPort = getSchemeDefaultPort(scheme); } } } setPathFromUri(uri); } private void setPathFromUri(URI uri) { path = uri.getRawPath(); if (path != null) { if (path.length() == 0 || path.charAt(0) != '/') { path = '/' + path; } } else { path = ""; } if (uri.getRawQuery() != null) { path += '?' + uri.getRawQuery(); } if (uri.getRawFragment() != null) { path += '#' + uri.getRawFragment(); } } @Override public synchronized void setFromHttpHost(HttpHost host) { scheme = host.getSchemeName(); if (scheme == null) { scheme = "http"; } this.host = host.getHostName(); hostPort = host.getPort(); if (hostPort == -1) { hostPort = getSchemeDefaultPort(scheme); } } private int getSchemeDefaultPort(final String scheme) { if (scheme.equals("https")) { return 443; } else { return 80; } } private boolean isSchemeDefaultPort(final String scheme, int port) { if (scheme.equals("https")) { if (port == 443) { return true; } } else { if (port == 80) { return true; } } return false; } @Override public synchronized void setScheme(String scheme) { if (scheme != null) { this.scheme = scheme.trim(); } else { this.scheme = "http"; } } @Override public synchronized String getScheme() { return scheme; } @Override public synchronized void setHost(String host) { if (host != null) { this.host = host.trim(); } else { this.host = null; } } @Override public synchronized String getHost() { return host; } @Override public synchronized void setHostPort(int port) { this.hostPort = port; } @Override public synchronized int getHostPort() { return hostPort; } @Override public synchronized void setMethod(String method) { if (method != null) { this.method = method.trim(); } else { this.method = null; } } @Override public synchronized String getMethod() { return method; } @Override public synchronized String getPath() { return path; } @Override public synchronized void setPath(String path) { if (path != null) { String tmp = path.trim(); if (tmp.length() == 0 || tmp.charAt(0) != '/') { tmp = '/' + tmp; } this.path = tmp; } else { this.path = null; } } @Override public synchronized String getRequestLine() { final StringBuilder buf = new StringBuilder(); if (method != null) { buf.append(method); } if (path != null) { if (buf.length() != 0) { buf.append(' '); } buf.append(path); } ProtocolVersion protocolVersion = getProtocolVersion(); if (protocolVersion != null) { if (buf.length() != 0) { buf.append(' '); } buf.append(protocolVersion.toString()); } return buf.toString(); } @Override public synchronized HttpUriRequest buildRequest() throws URISyntaxException { if (host == null || host.length() == 0) { throw new IllegalArgumentException("Invalid host"); } final StringBuilder buf = new StringBuilder(); buf.append(scheme); buf.append("://"); buf.append(host); if (isSchemeDefaultPort(scheme, hostPort) == false) { buf.append(":"); buf.append(Integer.toString(hostPort)); } if (path != null) { buf.append(path); } final URI requestUri = new URI(buf.toString()); IHttpMutableRequest request; HttpEntity entity = getEntity(); if (entity != null) { HttpEntityEnclosingMutableRequest entityRequest = new HttpEntityEnclosingMutableRequest(method, requestUri); entityRequest.setEntity(entity); request = entityRequest; } else { request = new HttpMutableRequest(method, requestUri); } HttpParams params = getParams(); if (params == null) { params = new BasicHttpParams(); } ProtocolVersion protocolVersion = getProtocolVersion(); if (protocolVersion != null) { HttpProtocolParams.setVersion(request.getParams(), protocolVersion); } request.setParams(params); setHeadersEntity(); IHttpHeaderBuilder[] headers = getHeaders(); for (IHttpHeaderBuilder h: headers) { request.addHeader(h.buildHeader()); } return request; } }