This package provides a means for listening in one an HTTP connection and recieving commands after being authenticated. The primary use case is communication between Javascript running in a browser from the Lime Wire Store web site and the Lime Wire Client. In order to do this the core component, called the {@link Dispatcher}.will first authenticate who ever is talking on this connection, and then pass along the remaining commands. To create a {@link Dispatcher} one would call the following method:
{@link LWSDispatcherFactory.createInstance(SenderOfMessagesToServer, ReceivesCommandsFromDispatcher)}
In this instance, the {@link SenderOfMessagesToServer} would have to be able to encode a url and send it to a remote server; the {@link ReceivesCommandsFromDispatcher} would do some action when a command was receives on the HTTP connection.
{@link Dispatcher} is an instance of {@link org.limewire.http.AsyncHttpRequestHandler} so can listen on the local HTTP acceptor. So a typical use of this package would be the following
SenderOfMessagesToServer s = new SenderOfMessagesToServer() { public String sendMessageToServer(String msg, Mapargs) throws IOException { // send the message, msg, and arguments args to a remote server // ... // return the result } ReceivesCommandsFromDispatcher r = new ReceivesCommandsFromDispatcher() { private final List connectionListeners = new ArrayList (); private boolean isConnected; public String receiveCommand(String cmd, Map args) { // take some action } public final void setConnected(boolean isConnected) { this.isConnected = isConnected; connectionChanged(this.isConnected); if (!connectionListeners.isEmpty()) { for (ConnectionListener lis : connectionListeners) { lis.connectionChanged(isConnected); } } } public final boolean addConnectionListener(ConnectionListener lis) { return connectionListeners.contains(lis) ? false : connectionListeners.add(lis); } public final boolean removeConnectionListener(ConnectionListener lis) { return !connectionListeners.contains(lis) ? false : connectionListeners.remove(lis); } }; Dispatcher d = LWSDispatcherFactory.createInstance(s,r); // now attach d to the local HTTP connection using the 'registerHandler' command
The class {@link AbstractReceivesCommandsFromDispatcher} abstracts away the management of the {@link ConnectionListener}s. Next is the authentication scheme used in this package.
In order to do this securely (i.e. make sure the javascript sending messages is actually from limewire.com and not the ever-evil pelzer.com), we need a scheme to authenticate the the javascript, and in English it is:
More formally (but just barely) this scheme consists of the following participants:
and there are three pieces of data:
and the scheme is:
The life cycle of the local server can be represented using an FSA such as the following: