1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.websocket.common;
20
21 import java.io.IOException;
22 import java.util.ArrayList;
23 import java.util.List;
24 import java.util.Map;
25 import java.util.Set;
26 import java.util.TreeMap;
27
28 import org.eclipse.jetty.websocket.api.UpgradeRequest;
29 import org.eclipse.jetty.websocket.api.UpgradeResponse;
30 import org.eclipse.jetty.websocket.api.WebSocketConstants;
31 import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
32 import org.eclipse.jetty.websocket.api.util.QuoteUtil;
33
34 public class UpgradeResponseAdapter implements UpgradeResponse
35 {
36 public static final String SEC_WEBSOCKET_PROTOCOL = WebSocketConstants.SEC_WEBSOCKET_PROTOCOL;
37 private int statusCode;
38 private String statusReason;
39 private Map<String, List<String>> headers = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
40 private List<ExtensionConfig> extensions = new ArrayList<>();
41 private boolean success = false;
42
43 @Override
44 public void addHeader(String name, String value)
45 {
46 String key = name;
47 List<String> values = headers.get(key);
48 if (values == null)
49 {
50 values = new ArrayList<>();
51 }
52 values.add(value);
53 headers.put(key,values);
54 }
55
56
57
58
59
60
61 @Override
62 public String getAcceptedSubProtocol()
63 {
64 return getHeader(SEC_WEBSOCKET_PROTOCOL);
65 }
66
67
68
69
70
71
72 @Override
73 public List<ExtensionConfig> getExtensions()
74 {
75 return extensions;
76 }
77
78 @Override
79 public String getHeader(String name)
80 {
81 List<String> values = getHeaders(name);
82
83 if (values == null)
84 {
85 return null;
86 }
87 int size = values.size();
88
89 if (size <= 0)
90 {
91 return null;
92 }
93
94 if (size == 1)
95 {
96 return values.get(0);
97 }
98
99 boolean needsDelim = false;
100 StringBuilder ret = new StringBuilder();
101 for (String value : values)
102 {
103 if (needsDelim)
104 {
105 ret.append(", ");
106 }
107 QuoteUtil.quoteIfNeeded(ret,value,QuoteUtil.ABNF_REQUIRED_QUOTING);
108 needsDelim = true;
109 }
110 return ret.toString();
111 }
112
113 @Override
114 public Set<String> getHeaderNames()
115 {
116 return headers.keySet();
117 }
118
119 @Override
120 public Map<String, List<String>> getHeaders()
121 {
122 return headers;
123 }
124
125 @Override
126 public List<String> getHeaders(String name)
127 {
128 return headers.get(name);
129 }
130
131 @Override
132 public int getStatusCode()
133 {
134 return statusCode;
135 }
136
137 @Override
138 public String getStatusReason()
139 {
140 return statusReason;
141 }
142
143 @Override
144 public boolean isSuccess()
145 {
146 return success;
147 }
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162 @Override
163 public void sendForbidden(String message) throws IOException
164 {
165 throw new UnsupportedOperationException("Not supported");
166 }
167
168
169
170
171
172
173
174 @Override
175 public void setAcceptedSubProtocol(String protocol)
176 {
177 setHeader(SEC_WEBSOCKET_PROTOCOL,protocol);
178 }
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193 @Override
194 public void setExtensions(List<ExtensionConfig> extensions)
195 {
196 this.extensions.clear();
197 if (extensions != null)
198 {
199 this.extensions.addAll(extensions);
200 }
201 }
202
203 @Override
204 public void setHeader(String name, String value)
205 {
206 List<String> values = new ArrayList<>();
207 values.add(value);
208 headers.put(name,values);
209 }
210
211 @Override
212 public void setStatusCode(int statusCode)
213 {
214 this.statusCode = statusCode;
215 }
216
217 @Override
218 public void setStatusReason(String statusReason)
219 {
220 this.statusReason = statusReason;
221 }
222
223 @Override
224 public void setSuccess(boolean success)
225 {
226 this.success = success;
227 }
228 }