package com.limegroup.gnutella.handshaking; import java.util.Properties; import com.limegroup.gnutella.ConnectionManager; import com.limegroup.gnutella.RouterService; import com.limegroup.gnutella.settings.ApplicationSettings; import com.limegroup.gnutella.settings.ConnectionSettings; import com.limegroup.gnutella.updates.UpdateManager; import com.limegroup.gnutella.util.CommonUtils; import com.limegroup.gnutella.util.NetworkUtils; /** * This class contains the headers that all LimeWires pass in connection * handshakes. */ public abstract class DefaultHeaders extends Properties { /** * Constant for the version of query routing we use. */ private static final String QUERY_ROUTING_VERSION = "0.1"; protected DefaultHeaders(String remoteIP) { byte[] addr = RouterService.getAddress(); int port = RouterService.getPort(); if(NetworkUtils.isValidAddress(addr) && NetworkUtils.isValidPort(port)) { put(HeaderNames.LISTEN_IP, NetworkUtils.ip2string(addr) + ":" + port); } if (remoteIP!=null) { put(HeaderNames.REMOTE_IP, remoteIP); } addCommonHeaders(this); } /** * Writes the common headers -- headers that all LimeWires should * send, like Query-Routing and User-Agent. */ private static void addCommonHeaders(Properties props) { props.put(HeaderNames.X_QUERY_ROUTING, QUERY_ROUTING_VERSION); props.put(HeaderNames.USER_AGENT, CommonUtils.getHttpServer()); props.put(HeaderNames.GGEP, "0.5"); props.put(HeaderNames.X_GUESS, "0.1"); props.put(HeaderNames.X_VENDOR_MESSAGE, "0.2"); props.put(HeaderNames.X_REQUERIES, "false"); // even though these are only really used by Ultrapeers, we // include them with leaves to as an indication that they // understand these protocols props.put(HeaderNames.X_DEGREE, Integer.toString(ConnectionSettings.NUM_CONNECTIONS.getValue())); props.put(HeaderNames.X_ULTRAPEER_QUERY_ROUTING, QUERY_ROUTING_VERSION); props.put(HeaderNames.X_MAX_TTL, "3"); props.put(HeaderNames.X_DYNAMIC_QUERY, "0.1"); props.put(HeaderNames.X_LOCALE_PREF, ApplicationSettings.LANGUAGE.getValue()); if ( ConnectionSettings.ACCEPT_DEFLATE.getValue() ) props.put(HeaderNames.ACCEPT_ENCODING, HeaderNames.DEFLATE_VALUE); props.put(HeaderNames.X_PONG_CACHING, "0.1"); UpdateManager updateManager = UpdateManager.instance(); String latestVersion = updateManager.getVersion(); // only send if we had a valid file on disk & its not @version@. if(updateManager.isValid() && !latestVersion.equals("@version@")) props.put(HeaderNames.X_VERSION, latestVersion); } }