52public final class JettyWebSocketUpgrades {
54 private JettyWebSocketUpgrades() {
66 public static Object
createEndpoint(
final WebSocketRoute route,
final ServerUpgradeRequest request,
67 final ServerUpgradeResponse response) {
68 final var path = request.getHttpURI().getPath();
70 final var headers = headersOf(request);
71 final var queryParams = queryOf(request);
72 negotiateSubprotocol(route, request, response);
80 private static void negotiateSubprotocol(
final WebSocketRoute route,
final ServerUpgradeRequest request,
81 final ServerUpgradeResponse response) {
82 final var supported = route.endpoint().subprotocols();
83 if (supported ==
null || supported.isEmpty()) {
86 for (
final var requested : request.getSubProtocols()) {
87 if (supported.contains(requested)) {
88 response.setAcceptedSubProtocol(requested);
95 private static Map<String, List<String>> headersOf(
final ServerUpgradeRequest request) {
96 final var out =
new LinkedHashMap<String, List<String>>();
97 for (
final var field : request.getHeaders()) {
98 out.computeIfAbsent(field.getName(), ignored ->
new ArrayList<>()).add(field.getValue());
100 return copyMultiMap(out);
104 private static Map<String, List<String>> queryOf(
final ServerUpgradeRequest request) {
105 final MultiMap<String> params =
new MultiMap<>();
106 final var rawQuery = request.getHttpURI().getQuery();
107 if (rawQuery !=
null && !rawQuery.isEmpty()) {
108 UrlEncoded.decodeTo(rawQuery, params, StandardCharsets.UTF_8);
111 final var out =
new LinkedHashMap<String, List<String>>();
112 for (
final var key : params.keySet()) {
113 final var values = params.getValues(key);
114 out.put(key, values ==
null ? List.of() : List.copyOf(values));
116 return Map.copyOf(out);
120 private static Map<String, List<String>> copyMultiMap(
final Map<String, List<String>> input) {
121 final var out =
new LinkedHashMap<String, List<String>>();
122 for (
final var entry : input.entrySet()) {
123 out.put(entry.getKey(), entry.getValue() ==
null ? List.of() : List.copyOf(entry.getValue()));
125 return Map.copyOf(out);