in shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/parser/WebSocketParser.java [189:269]
private List<IngressConfiguration> parseIngressRule(final V1IngressRule ingressRule,
final List<WebSocketUpstream> webSocketUpstream,
final String namespace,
final Map<String, String> annotations) {
List<IngressConfiguration> res = new ArrayList<>();
ConditionData hostCondition = null;
if (Objects.nonNull(ingressRule.getHost())) {
hostCondition = new ConditionData();
hostCondition.setParamType(ParamTypeEnum.DOMAIN.getName());
hostCondition.setOperator(OperatorEnum.EQ.getAlias());
hostCondition.setParamValue(ingressRule.getHost());
}
if (Objects.nonNull(ingressRule.getHttp())) {
List<V1HTTPIngressPath> paths = ingressRule.getHttp().getPaths();
if (Objects.nonNull(paths)) {
for (V1HTTPIngressPath path : paths) {
String pathPath = path.getPath();
if (Objects.isNull(pathPath)) {
continue;
}
OperatorEnum operator;
if ("ImplementationSpecific".equals(path.getPathType())) {
operator = OperatorEnum.MATCH;
} else if ("Prefix".equals(path.getPathType())) {
operator = OperatorEnum.STARTS_WITH;
} else if ("Exact".equals(path.getPathType())) {
operator = OperatorEnum.EQ;
} else {
LOG.info("Invalid path type, set it with match operator");
operator = OperatorEnum.MATCH;
}
ConditionData pathCondition = new ConditionData();
pathCondition.setOperator(operator.getAlias());
pathCondition.setParamType(ParamTypeEnum.URI.getName());
pathCondition.setParamValue(pathPath);
List<ConditionData> conditionList = new ArrayList<>(2);
if (Objects.nonNull(hostCondition)) {
conditionList.add(hostCondition);
}
conditionList.add(pathCondition);
SelectorData selectorData = SelectorData.builder()
.pluginId(String.valueOf(PluginEnum.WEB_SOCKET.getCode()))
.pluginName(PluginEnum.WEB_SOCKET.getName())
.name(pathPath)
.matchMode(MatchModeEnum.AND.getCode())
.type(SelectorTypeEnum.CUSTOM_FLOW.getCode())
.enabled(true)
.logged(false)
.continued(true)
.conditionList(conditionList).build();
List<WebSocketUpstream> upstreamList = parseUpstream(path.getBackend(), namespace);
if (upstreamList.isEmpty()) {
upstreamList = webSocketUpstream;
}
selectorData.setHandle(GsonUtils.getInstance().toJson(upstreamList));
WebSocketRuleHandle webSocketRuleHandle = new WebSocketRuleHandle();
if (Objects.nonNull(annotations)) {
webSocketRuleHandle.setLoadBalance(annotations.getOrDefault(IngressConstants.LOADBALANCER_ANNOTATION_KEY, LoadBalanceEnum.RANDOM.getName()));
webSocketRuleHandle.setRetry(Integer.parseInt(annotations.getOrDefault(IngressConstants.RETRY_ANNOTATION_KEY, "0")));
webSocketRuleHandle.setTimeout(Long.parseLong(annotations.getOrDefault(IngressConstants.TIMEOUT_ANNOTATION_KEY, "3000")));
}
RuleData ruleData = RuleData.builder()
.name(pathPath)
.pluginName(PluginEnum.WEB_SOCKET.getName())
.matchMode(MatchModeEnum.AND.getCode())
.conditionDataList(conditionList)
.handle(GsonUtils.getInstance().toJson(webSocketRuleHandle))
.loged(false)
.enabled(true).build();
res.add(new IngressConfiguration(selectorData, Arrays.asList(ruleData), null));
}
}
}
return res;
}