15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package org.chromium;
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.io.BufferedReader;
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.io.IOException;
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.io.InputStreamReader;
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.io.OutputStreamWriter;
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.net.Socket;
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.net.UnknownHostException;
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.Set;
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.concurrent.CopyOnWriteArraySet;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import javax.net.SocketFactory;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import javax.servlet.ServletException;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import javax.servlet.http.HttpServletRequest;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import javax.servlet.http.HttpServletResponse;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.eclipse.jetty.websocket.WebSocket;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.eclipse.jetty.websocket.WebSocketServlet;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public class IRCProxyWebSocket extends WebSocketServlet {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  private static final long serialVersionUID = 1L;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  private final Set<ChatWebSocket> members_ =
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new CopyOnWriteArraySet<ChatWebSocket>();
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protected void doGet(HttpServletRequest request, HttpServletResponse response)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      throws ServletException ,IOException {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    getServletContext().getNamedDispatcher("default").forward(request,response);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protected WebSocket doWebSocketConnect(HttpServletRequest request,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         String protocol) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new ChatWebSocket();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class ChatWebSocket implements WebSocket, Runnable {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Outbound outbound_;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Socket socket_ = null;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OutputStreamWriter out_;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BufferedReader in_;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Thread thread_;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    byte frame_ = 0;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void onConnect(Outbound outbound) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      outbound_= outbound;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void onMessage(byte frame, byte[] data,int offset, int length) {}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void onMessage(byte frame, String data) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      try {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (socket_ == null) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          try {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // We assume the client is going to connect and initiate a
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // connection with the message "server:port".
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            String tokens[] = data.split(":");
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            socket_ = SocketFactory.getDefault().createSocket(tokens[0],
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Integer.parseInt(tokens[1]));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            out_ = new OutputStreamWriter(socket_.getOutputStream());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            InputStreamReader in = new InputStreamReader(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                socket_.getInputStream());
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            in_ = new BufferedReader(in);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            members_.add(this);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            thread_ = new Thread(this);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            thread_.start();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } catch (UnknownHostException e) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // TODO Auto-generated catch block
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            e.printStackTrace();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } catch (IOException e) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // TODO Auto-generated catch block
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            e.printStackTrace();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          System.out.print(">> " + data);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          out_.write(data);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          out_.flush();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } catch (IOException e) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // TODO Auto-generated catch block
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        e.printStackTrace();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void onDisconnect() {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      try {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        socket_.close();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        thread_.stop();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } catch (IOException e) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // TODO Auto-generated catch block
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        e.printStackTrace();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      members_.remove(this);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void run() {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while(true) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        try {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           if (in_.ready()) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            String line = in_.readLine();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            System.out.println("<< " + line);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            outbound_.sendMessage(frame_, line + "\r\n");
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Thread.sleep(100);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } catch (IOException e) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } catch (InterruptedException e) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
117