Home | History | Annotate | Download | only in echo
      1 package fi.iki.elonen.samples.echo;
      2 
      3 /*
      4  * #%L
      5  * NanoHttpd-Websocket
      6  * %%
      7  * Copyright (C) 2012 - 2015 nanohttpd
      8  * %%
      9  * Redistribution and use in source and binary forms, with or without modification,
     10  * are permitted provided that the following conditions are met:
     11  *
     12  * 1. Redistributions of source code must retain the above copyright notice, this
     13  *    list of conditions and the following disclaimer.
     14  *
     15  * 2. Redistributions in binary form must reproduce the above copyright notice,
     16  *    this list of conditions and the following disclaimer in the documentation
     17  *    and/or other materials provided with the distribution.
     18  *
     19  * 3. Neither the name of the nanohttpd nor the names of its contributors
     20  *    may be used to endorse or promote products derived from this software without
     21  *    specific prior written permission.
     22  *
     23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
     24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     25  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     26  * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
     27  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     29  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     30  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     31  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     32  * OF THE POSSIBILITY OF SUCH DAMAGE.
     33  * #L%
     34  */
     35 
     36 import java.io.IOException;
     37 import java.util.logging.Level;
     38 import java.util.logging.Logger;
     39 
     40 import fi.iki.elonen.NanoWSD;
     41 import fi.iki.elonen.NanoWSD.WebSocketFrame.CloseCode;
     42 
     43 /**
     44  * @author Paul S. Hawke (paul.hawke (at) gmail.com) On: 4/23/14 at 10:31 PM
     45  */
     46 public class DebugWebSocketServer extends NanoWSD {
     47 
     48     /**
     49      * logger to log to.
     50      */
     51     private static final Logger LOG = Logger.getLogger(DebugWebSocketServer.class.getName());
     52 
     53     private final boolean debug;
     54 
     55     public DebugWebSocketServer(int port, boolean debug) {
     56         super(port);
     57         this.debug = debug;
     58     }
     59 
     60     @Override
     61     protected WebSocket openWebSocket(IHTTPSession handshake) {
     62         return new DebugWebSocket(this, handshake);
     63     }
     64 
     65     private static class DebugWebSocket extends WebSocket {
     66 
     67         private final DebugWebSocketServer server;
     68 
     69         public DebugWebSocket(DebugWebSocketServer server, IHTTPSession handshakeRequest) {
     70             super(handshakeRequest);
     71             this.server = server;
     72         }
     73 
     74         @Override
     75         protected void onOpen() {
     76         }
     77 
     78         @Override
     79         protected void onClose(CloseCode code, String reason, boolean initiatedByRemote) {
     80             if (server.debug) {
     81                 System.out.println("C [" + (initiatedByRemote ? "Remote" : "Self") + "] " + (code != null ? code : "UnknownCloseCode[" + code + "]")
     82                         + (reason != null && !reason.isEmpty() ? ": " + reason : ""));
     83             }
     84         }
     85 
     86         @Override
     87         protected void onMessage(WebSocketFrame message) {
     88             try {
     89                 message.setUnmasked();
     90                 sendFrame(message);
     91             } catch (IOException e) {
     92                 throw new RuntimeException(e);
     93             }
     94         }
     95 
     96         @Override
     97         protected void onPong(WebSocketFrame pong) {
     98             if (server.debug) {
     99                 System.out.println("P " + pong);
    100             }
    101         }
    102 
    103         @Override
    104         protected void onException(IOException exception) {
    105             DebugWebSocketServer.LOG.log(Level.SEVERE, "exception occured", exception);
    106         }
    107 
    108         @Override
    109         protected void debugFrameReceived(WebSocketFrame frame) {
    110             if (server.debug) {
    111                 System.out.println("R " + frame);
    112             }
    113         }
    114 
    115         @Override
    116         protected void debugFrameSent(WebSocketFrame frame) {
    117             if (server.debug) {
    118                 System.out.println("S " + frame);
    119             }
    120         }
    121     }
    122 }
    123