33import com .google .gson .FieldNamingPolicy ;
44import com .google .gson .Gson ;
55import com .google .gson .GsonBuilder ;
6+ import org .eclipse .jetty .server .handler .ContextHandler ;
7+ import org .eclipse .jetty .server .handler .HandlerCollection ;
68import org .eclipse .jetty .util .log .Log ;
9+ import org .eclipse .jetty .websocket .api .Session ;
10+ import org .eclipse .jetty .websocket .api .annotations .OnWebSocketConnect ;
11+ import org .eclipse .jetty .websocket .server .WebSocketHandler ;
12+ import org .eclipse .jetty .websocket .servlet .WebSocketServletFactory ;
713import org .javawebstack .httpserver .helper .JettyNoLog ;
814import org .javawebstack .httpserver .inject .Injector ;
915import org .javawebstack .httpserver .helper .HttpMethod ;
1723import org .eclipse .jetty .server .Server ;
1824import org .eclipse .jetty .server .handler .AbstractHandler ;
1925import org .javawebstack .httpserver .handler .*;
26+ import org .javawebstack .httpserver .websocket .WebSocket ;
2027import org .reflections .Reflections ;
2128
2229import javax .servlet .http .HttpServletRequest ;
2330import javax .servlet .http .HttpServletResponse ;
2431import java .nio .charset .StandardCharsets ;
25- import java .util .ArrayList ;
26- import java .util .Arrays ;
27- import java .util .List ;
32+ import java .util .*;
2833
2934public class HTTPServer implements RouteParamTransformerProvider {
3035
@@ -44,6 +49,7 @@ public static void main(String[] args) {
4449 private final List <RequestInterceptor > beforeInterceptors = new ArrayList <>();
4550 private Gson gson = new GsonBuilder ().setFieldNamingPolicy (FieldNamingPolicy .LOWER_CASE_WITH_UNDERSCORES ).setDateFormat ("yyyy-MM-dd HH:mm:ss" ).disableHtmlEscaping ().create ();
4651 private Injector injector = null ;
52+ private Map <String , Class > webSockets = new HashMap <>();
4753
4854 public HTTPServer (){
4955 routeParamTransformers .add (DefaultRouteParamTransformer .INSTANCE );
@@ -75,6 +81,27 @@ public HTTPServer route(HttpMethod method, String pattern, RequestHandler... han
7581 return this ;
7682 }
7783
84+ public HTTPServer webSocket (String path , Class webSocketHandler ){
85+ webSockets .put (path , webSocketHandler );
86+ return this ;
87+ }
88+
89+ public HTTPServer webSocket (String path , WebSocket webSocketHandler ){
90+ webSockets .put (path , new Object (){
91+ private Session session ;
92+
93+ @ OnWebSocketConnect public void onConnect (Session session ){
94+ this .session = session ;
95+ webSocketHandler .getWebSocketConnectionEvent ().onConnect (session );
96+ }
97+
98+ @ OnWebSocketConnect public void onMessage (String message ){
99+ webSocketHandler .getWebSocketMessageEvent ().onMessage (session , message );
100+ }
101+ }.getClass ());
102+ return this ;
103+ }
104+
78105 public HTTPServer notFound (RequestHandler handler ){
79106 notFoundHandler = handler ;
80107 return this ;
@@ -149,7 +176,25 @@ public HTTPServer port(int port){
149176 public HTTPServer start (){
150177 Log .setLog (new JettyNoLog ());
151178 server = new Server (port );
152- server .setHandler (new HttpHandler ());
179+ HandlerCollection handlerCollection = new HandlerCollection ();
180+
181+ handlerCollection .addHandler (new HttpHandler ());
182+
183+ webSockets .forEach ((path , webSocketHandler )->{
184+ ContextHandler contextHandler = new ContextHandler ();
185+ contextHandler .setHandler (new WebSocketHandler () {
186+ @ Override
187+ public void configure (WebSocketServletFactory webSocketServletFactory ) {
188+ webSocketServletFactory .register (webSocketHandler );
189+ }
190+ });
191+ contextHandler .setContextPath (path );
192+ handlerCollection .addHandler (contextHandler );
193+ });
194+
195+
196+ server .setHandler (handlerCollection );
197+
153198 try {
154199 server .start ();
155200 }catch (Exception ex ){
@@ -210,6 +255,7 @@ public void execute(Exchange exchange){
210255 }
211256 exchange .write (transformResponse (notFoundHandler .handle (exchange )));
212257 }catch (Throwable ex ){
258+ ex .printStackTrace ();
213259 exchange .write (exceptionHandler .handleBytes (exchange , ex ));
214260 }
215261 exchange .close ();
0 commit comments