package com.limegroup.gnutella.bugs; import java.io.IOException; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.limegroup.gnutella.http.HttpClientManager; import com.limegroup.gnutella.util.CommonUtils; /** * This class handles accessing the servlet, sending it data about the client * configuration, and obtaining information about the next time this or any * bug can be sent. */ //2345678|012345678|012345678|012345678|012345678|012345678|012345678|012345678| final class ServletAccessor { private static final Log LOG = LogFactory.getLog(ServletAccessor.class); /** * Constant number of milliseconds to wait before timing out the * connection to the servlet. */ private static final int CONNECT_TIMEOUT = 10 * 1000; // 10 seconds. /** * Constant for the servlet url. */ private static final String SERVLET_URL = "http://bugreports.limewire.com/bugs/servlet/BugHandler"; /** * Variable for the object that contains information retrieved from * the servlet. */ private volatile RemoteClientInfo _remoteInfo = null; /** * Package-access constructor */ ServletAccessor() {} /** * Contacts the application servlet and sends it the information * contained in the <tt>LocalClientInfo</tt> object. This method * also builds a <tt>RemoteClientInfo</tt> object from the information * obtained from the servlet. * * @return a <tt>RemoteClientInfo</tt> object that encapsulates the * data about when to next send a bug. * @param localInfo is an object encapsulating information about the * local machine to send to the remote server */ synchronized RemoteClientInfo getRemoteBugInfo(LocalClientInfo localInfo) { NameValuePair[] params = localInfo.getPostRequestParams(); RemoteClientInfo remoteInfo = null; PostMethod post = new PostMethod(SERVLET_URL); post.addRequestHeader("Cache-Control", "no-cache"); post.addRequestHeader("User-Agent", CommonUtils.getHttpServer()); post.addRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); post.setFollowRedirects(false); post.addParameters(params); HttpClient client = HttpClientManager.getNewClient(); client.setConnectionTimeout(CONNECT_TIMEOUT); // create the object to record the info _remoteInfo = new RemoteClientInfo(); try { //Execute the remote info. client.executeMethod(post); String response = post.getResponseBodyAsString(); if(LOG.isDebugEnabled()) LOG.debug("Got response: " + response); // process results if valid status code if(post.getStatusCode() == HttpStatus.SC_OK) _remoteInfo.addRemoteInfo(response); // otherwise mark as server down. else { if(LOG.isWarnEnabled()) LOG.warn("Servlet connect failed, code: " + post.getStatusCode()); _remoteInfo.connectFailed(); } } catch(IOException ioe) { LOG.error("Error connecting to bug servlet", ioe); _remoteInfo.connectFailed(); } finally { if(post != null) post.releaseConnection(); } return _remoteInfo; } }