in gateway-server/src/main/java/org/apache/knox/gateway/websockets/GatewayWebsocketHandler.java [207:281]
protected synchronized String getMatchedBackendURL(final URI requestURI) {
final String path = requestURI.getRawPath();
final String query = requestURI.getRawQuery();
final ServiceRegistry serviceRegistryService = services
.getService(ServiceType.SERVICE_REGISTRY_SERVICE);
final ServiceDefinitionRegistry serviceDefinitionService = services
.getService(ServiceType.SERVICE_DEFINITION_REGISTRY);
/* Filter out the /cluster/topology to get the context we want */
String[] pathInfo = path.split(REGEX_SPLIT_CONTEXT);
final ServiceDefEntry entry = serviceDefinitionService
.getMatchingService(pathInfo[1]);
if (entry == null) {
throw new RuntimeException(
String.format(Locale.ROOT, "Cannot find service for the given path: %s", path));
}
/* Filter out /cluster/topology/service to get endpoint */
String[] pathService = path.split(REGEX_SPLIT_SERVICE_PATH);
/* URL used to connect to websocket backend */
String backendURL = urlFromServiceDefinition(serviceRegistryService, entry, path);
LOG.debugLog("Url obtained from services definition: " + backendURL);
StringBuilder backend = new StringBuilder();
try {
if (StringUtils.containsAny(backendURL, WEBSOCKET_PROTOCOL_STRING, SECURE_WEBSOCKET_PROTOCOL_STRING)) {
LOG.debugLog("ws or wss protocol found in service url");
URI serviceUri = new URI(backendURL);
backend.append(serviceUri);
String pathSuffix = generateUrlSuffix(backend.toString(), pathService);
backend.append(pathSuffix);
} else if (StringUtils.containsAny(requestURI.toString(), WEBSOCKET_PROTOCOL_STRING, SECURE_WEBSOCKET_PROTOCOL_STRING)) {
LOG.debugLog("ws or wss protocol found in request url");
URL serviceUrl = new URL(backendURL);
final String protocol = (serviceUrl.getProtocol().equals("https")) ? "wss" : "ws";
backend.append(protocol).append("://");
backend.append(serviceUrl.getHost()).append(':');
backend.append(serviceUrl.getPort()).append('/');
backend.append(serviceUrl.getPath());
String pathSuffix = generateUrlSuffix(backend.toString(), pathService);
backend.append(pathSuffix);
} else {
LOG.debugLog("ws or wss protocol not found in service url or request url");
URL serviceUrl = new URL(backendURL);
/* Use http host:port if ws url not configured */
final String protocol = (serviceUrl.getProtocol().equals("ws")
|| serviceUrl.getProtocol().equals("wss")) ? serviceUrl.getProtocol()
: "ws";
backend.append(protocol).append("://");
backend.append(serviceUrl.getHost()).append(':');
backend.append(serviceUrl.getPort()).append('/');
backend.append(serviceUrl.getPath());
}
/* in case we have query params */
if(!StringUtils.isBlank(query)) {
backend.append('?').append(query);
}
backendURL = backend.toString();
} catch (MalformedURLException e){
LOG.badUrlError(e);
throw new RuntimeException(e.toString());
} catch (Exception e1) {
LOG.failedCreatingWebSocket(e1);
throw new RuntimeException(e1.toString());
}
return backendURL;
}