/** * */ package fr.cedrik.inotes; import java.io.IOException; import java.net.CookieHandler; import java.net.CookiePolicy; import java.net.CookieStore; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.URISyntaxException; import java.net.URL; import java.nio.charset.Charset; import java.util.Collections; import java.util.List; import java.util.Map; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpResponse; import fr.cedrik.inotes.util.CookieManager; import fr.cedrik.spring.http.client.HttpRequestExecutor; import fr.cedrik.spring.http.client.SSLSimpleClientHttpRequestFactory; import fr.cedrik.util.SSLSockets; /** * @author Cédrik LIME */ public class HttpContext { protected final INotesProperties iNotes; protected final HttpRequestExecutor httpRequestExecutor; protected final CookieManager cookieManager = new CookieManager(); protected final HttpHeaders httpHeaders = new HttpHeaders(); protected String proxyBaseURL; protected String folderBaseURL; protected String mailEditBaseURL; static { // cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); // Note: the following line means this application must be single-user only! /* * Non-Oracle JVM (i.e. OpenJDK 6) do not implement {@link java.net.CookieManager} correctly. * And anyway, having a JVM singleton ({@link CookieHandler#setDefault(java.net.CookieHandler)}) for cookies management sucks. * Thus we need to manage cookies manually... */ //CookieHandler.setDefault(cookieManager); } public HttpContext(INotesProperties iNotes) { this.iNotes = iNotes; cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); httpRequestExecutor = getHttpRequestExecutor(); } /** * Alternative: use Spring! :-) * @return */ private HttpRequestExecutor getHttpRequestExecutor() { HttpRequestExecutor http = new HttpRequestExecutor(); { SSLSimpleClientHttpRequestFactory httpRequestFactory = new SSLSimpleClientHttpRequestFactory(); Proxy proxy = iNotes.getProxy(); httpRequestFactory.setProxy(proxy); httpRequestFactory.setAllowUserInteraction(false); httpRequestFactory.setUseCaches(false); httpRequestFactory.setInstanceFollowRedirects(false); httpRequestFactory.setConnectTimeout(10000); httpRequestFactory.setReadTimeout(30000); // special handling for debugging: proxy running on same computer try { if (proxy.type() == Proxy.Type.HTTP && ((InetSocketAddress)proxy.address()).getAddress().equals(InetAddress.getLocalHost())) { httpRequestFactory.setSocketFactory(SSLSockets.trustingSSLSocketFactory); httpRequestFactory.setHostnameVerifier(SSLSockets.allHostsValid); } } catch (Exception ignore) { } http.setRequestFactory(httpRequestFactory); } return http; } public String getServerAddress() { return iNotes.getServerAddress(); } public String getUserName() { return iNotes.getUserName(); } public void setUserName(String userName) { iNotes.setUserName(userName); } public String getUserPassword() { return iNotes.getUserPassword(); } public void setUserPassword(String password) { iNotes.setUserPassword(password); } public String getCurrentFolderId() { return iNotes.getCurrentFolderId(); } public void setCurrentFolderId(String notesFolderID) { iNotes.setCurrentFolderId(notesFolderID); } public List<String> getExcludedFoldersIds() { return iNotes.getExcludedFoldersIds(); } public String getProxyBaseURL() { return proxyBaseURL; } public void setProxyBaseURL(String baseURL) { this.proxyBaseURL = baseURL; } public String getFolderBaseURL() { return folderBaseURL + getCurrentFolderId() + '/'; } public void setFolderBaseURL(String baseURL) { this.folderBaseURL = baseURL; } public String getMailEditBaseURL() { return mailEditBaseURL; } public void setMailEditBaseURL(String baseURL) { this.mailEditBaseURL = baseURL; } public boolean isFixLotusNotesDateMIMEHeader() { return iNotes.isFixLotusNotesDateMIMEHeader(); } /** * @see HttpRequestExecutor#createRequest(URL, HttpMethod, Map, Map) */ public ClientHttpRequest createRequest(URL url, HttpMethod method, Map<String, ?> extraParameters) throws IOException { // put back cookies in httpHeaders try { Map<String, List<String>> cookies = cookieManager.get(url.toURI(), Collections.<String,List<String>>emptyMap()); httpHeaders.putAll(cookies); } catch (URISyntaxException e) { throw new RuntimeException(e); } // create http request return httpRequestExecutor.createRequest(url, method, extraParameters, httpHeaders); } /** * @see HttpRequestExecutor#getCharset(ClientHttpResponse) */ public Charset getCharset(ClientHttpResponse httpResponse) { return httpRequestExecutor.getCharset(httpResponse); } public CookieStore getCookieStore() { return cookieManager.getCookieStore(); } public HttpHeaders getHttpHeaders() { return httpHeaders; } /** * Non-Oracle JVM (i.e. OpenJDK 6) do not implement {@link java.net.CookieManager} correctly. * And anyway, having a JVM singleton ({@link CookieHandler#setDefault(java.net.CookieHandler)}) for cookies management sucks. * Thus we need to manage cookies manually... * @param httpResponse */ public void rememberCookies(ClientHttpRequest httpRequest, ClientHttpResponse httpResponse) throws IOException { cookieManager.put(httpRequest.getURI(), httpResponse.getHeaders()); } }