1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.websocket.server;
20
21 import java.io.IOException;
22
23 import javax.servlet.ServletException;
24 import javax.servlet.http.HttpServletRequest;
25 import javax.servlet.http.HttpServletResponse;
26
27 import org.eclipse.jetty.http.pathmap.MappedResource;
28 import org.eclipse.jetty.http.pathmap.PathMappings;
29 import org.eclipse.jetty.http.pathmap.PathSpec;
30 import org.eclipse.jetty.io.ByteBufferPool;
31 import org.eclipse.jetty.io.MappedByteBufferPool;
32 import org.eclipse.jetty.server.Request;
33 import org.eclipse.jetty.server.handler.HandlerWrapper;
34 import org.eclipse.jetty.websocket.servlet.WebSocketCreator;
35
36 public class WebSocketUpgradeHandlerWrapper extends HandlerWrapper implements MappedWebSocketCreator
37 {
38 private PathMappings<WebSocketCreator> pathmap = new PathMappings<>();
39 private final WebSocketServerFactory factory;
40
41 public WebSocketUpgradeHandlerWrapper()
42 {
43 this(new MappedByteBufferPool());
44 }
45
46 public WebSocketUpgradeHandlerWrapper(ByteBufferPool bufferPool)
47 {
48 factory = new WebSocketServerFactory(bufferPool);
49 }
50
51 @Override
52 public void addMapping(PathSpec spec, WebSocketCreator creator)
53 {
54 pathmap.put(spec,creator);
55 }
56
57 @Override
58 public PathMappings<WebSocketCreator> getMappings()
59 {
60 return pathmap;
61 }
62
63 @Override
64 public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
65 {
66 if (factory.isUpgradeRequest(request,response))
67 {
68 MappedResource<WebSocketCreator> resource = pathmap.getMatch(target);
69 if (resource == null)
70 {
71
72 response.sendError(HttpServletResponse.SC_NOT_FOUND,"No websocket endpoint matching path: " + target);
73 return;
74 }
75
76 WebSocketCreator creator = resource.getResource();
77
78
79 request.setAttribute(PathSpec.class.getName(),resource);
80
81
82 if (factory.acceptWebSocket(creator,request,response))
83 {
84
85 return;
86 }
87
88
89
90
91 if (response.isCommitted())
92 {
93
94 return;
95 }
96 }
97 super.handle(target,baseRequest,request,response);
98 }
99 }