Java tutorial
/* * Copyright (c) 2012 Jeremy Goetsch * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.jgoetsch.eventtrader.source; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.http.HttpException; import org.apache.http.HttpHost; import org.apache.http.HttpRequest; import org.apache.http.HttpRequestInterceptor; import org.apache.http.NameValuePair; import org.apache.http.auth.AuthScope; import org.apache.http.auth.AuthState; import org.apache.http.auth.Credentials; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.protocol.ClientContext; import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.scheme.SocketFactory; import org.apache.http.impl.auth.BasicScheme; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.SingleClientConnManager; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParamBean; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParamBean; import org.apache.http.protocol.ExecutionContext; import org.apache.http.protocol.HttpContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public abstract class AbstractHttpMsgSource extends UrlBasedMsgSource { private Logger log = LoggerFactory.getLogger(getClass()); private String username; private String password; private boolean preemtiveAuth = false; private HttpClient httpClient; private String method = "GET"; private HttpActionFilter loginAction; static class PreemptiveAuth implements HttpRequestInterceptor { public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException { AuthState authState = (AuthState) context.getAttribute(ClientContext.TARGET_AUTH_STATE); // If no auth scheme avaialble yet, try to initialize it preemptively if (authState.getAuthScheme() == null) { CredentialsProvider credsProvider = (CredentialsProvider) context .getAttribute(ClientContext.CREDS_PROVIDER); HttpHost targetHost = (HttpHost) context.getAttribute(ExecutionContext.HTTP_TARGET_HOST); Credentials creds = credsProvider .getCredentials(new AuthScope(targetHost.getHostName(), targetHost.getPort())); if (creds == null) { throw new HttpException("No credentials for preemptive authentication"); } authState.setAuthScheme(new BasicScheme()); authState.setCredentials(creds); } } } protected HttpUriRequest createRequest() { List<NameValuePair> params = null; if (getRequestParameters() != null) { params = new ArrayList<NameValuePair>(); for (Map.Entry<String, Object> p : getRequestParameters().entrySet()) params.add(new BasicNameValuePair(p.getKey(), (String) p.getValue())); } HttpRequestBase req; if ("POST".equalsIgnoreCase(getMethod())) { req = new HttpPost(getUrl()); if (params != null) { try { UrlEncodedFormEntity reqEntity = new UrlEncodedFormEntity(params, "UTF-8"); ((HttpPost) req).setEntity(reqEntity); } catch (UnsupportedEncodingException e) { log.error("Error encoding request entity", e); } } } else if (params != null) { req = new HttpGet( getUrl() + (getUrl().contains("?") ? "&" : "?") + URLEncodedUtils.format(params, "UTF-8")); } else { req = new HttpGet(getUrl()); } return req; } @Override protected final void receiveMsgs() { /*SchemeRegistry supportedSchemes = new SchemeRegistry(); SocketFactory sf = PlainSocketFactory.getSocketFactory(); supportedSchemes.register(new Scheme("http", sf, 80)); ClientConnectionManager ccm = new SingleClientConnManager(httpParams, supportedSchemes); DefaultHttpClient client = new DefaultHttpClient(httpParams); if (getUsername() != null) { client.getCredentialsProvider().setCredentials( AuthScope.ANY, new UsernamePasswordCredentials(getUsername(), getPassword())); if (isPreemtiveAuth()) { client.addRequestInterceptor(new PreemptiveAuth(), 0); } if (loginAction != null) loginAction.doAction(client, this); }*/ if (httpClient == null) httpClient = new DefaultHttpClient(); if (getUsername() != null) { ((DefaultHttpClient) httpClient).getCredentialsProvider().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(getUsername(), getPassword())); } receiveMsgs(httpClient); } protected abstract void receiveMsgs(HttpClient client); public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public boolean isPreemtiveAuth() { return preemtiveAuth; } public void setPreemtiveAuth(boolean preemtiveAuth) { this.preemtiveAuth = preemtiveAuth; } public void setMethod(String method) { this.method = method; } public String getMethod() { return method; } public void setLoginAction(HttpActionFilter loginAction) { this.loginAction = loginAction; } public HttpActionFilter getLoginAction() { return loginAction; } public HttpClient getHttpClient() { return httpClient; } public void setHttpClient(HttpClient httpClient) { this.httpClient = httpClient; } }