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@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 
DebugWebSocketServer(int port, boolean debug)55     public DebugWebSocketServer(int port, boolean debug) {
56         super(port);
57         this.debug = debug;
58     }
59 
60     @Override
openWebSocket(IHTTPSession handshake)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 
DebugWebSocket(DebugWebSocketServer server, IHTTPSession handshakeRequest)69         public DebugWebSocket(DebugWebSocketServer server, IHTTPSession handshakeRequest) {
70             super(handshakeRequest);
71             this.server = server;
72         }
73 
74         @Override
onOpen()75         protected void onOpen() {
76         }
77 
78         @Override
onClose(CloseCode code, String reason, boolean initiatedByRemote)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
onMessage(WebSocketFrame message)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
onPong(WebSocketFrame pong)97         protected void onPong(WebSocketFrame pong) {
98             if (server.debug) {
99                 System.out.println("P " + pong);
100             }
101         }
102 
103         @Override
onException(IOException exception)104         protected void onException(IOException exception) {
105             DebugWebSocketServer.LOG.log(Level.SEVERE, "exception occured", exception);
106         }
107 
108         @Override
debugFrameReceived(WebSocketFrame frame)109         protected void debugFrameReceived(WebSocketFrame frame) {
110             if (server.debug) {
111                 System.out.println("R " + frame);
112             }
113         }
114 
115         @Override
debugFrameSent(WebSocketFrame frame)116         protected void debugFrameSent(WebSocketFrame frame) {
117             if (server.debug) {
118                 System.out.println("S " + frame);
119             }
120         }
121     }
122 }
123