Skip to content

Commit d929bc4

Browse files
committed
🐛 Respect OpenAPI servers base URL
1 parent b1a1298 commit d929bc4

File tree

2 files changed

+62
-1
lines changed

2 files changed

+62
-1
lines changed

connector/openapi-connector/src/main/java/eu/datacellar/connector/OpenAPICoreExtension.java

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import java.util.List;
1515
import java.util.Map;
1616
import java.util.Optional;
17+
import java.util.regex.Matcher;
18+
import java.util.regex.Pattern;
1719

1820
import javax.sql.DataSource;
1921

@@ -50,6 +52,8 @@
5052
import io.swagger.v3.oas.models.OpenAPI;
5153
import io.swagger.v3.oas.models.PathItem.HttpMethod;
5254
import io.swagger.v3.oas.models.parameters.RequestBody;
55+
import io.swagger.v3.oas.models.servers.Server;
56+
import io.swagger.v3.oas.models.servers.ServerVariable;
5357
import io.swagger.v3.parser.core.models.ParseOptions;
5458
import io.swagger.v3.parser.core.models.SwaggerParseResult;
5559

@@ -263,12 +267,62 @@ private String extractBaseUrl(String fullUrl) {
263267
}
264268
}
265269

270+
private String resolveBaseUrl(ServiceExtensionContext context, OpenAPI openAPI, String openapiUrl) {
271+
String configuredBaseUrl = context.getSetting(API_BASE_URL, null);
272+
if (configuredBaseUrl != null && !configuredBaseUrl.isBlank()) {
273+
return configuredBaseUrl;
274+
}
275+
276+
String serverUrl = resolveOpenApiServerUrl(openAPI);
277+
if (serverUrl == null || serverUrl.isBlank()) {
278+
return extractBaseUrl(openapiUrl);
279+
}
280+
281+
if (serverUrl.startsWith("/")) {
282+
return extractBaseUrl(openapiUrl) + serverUrl;
283+
}
284+
285+
return serverUrl;
286+
}
287+
288+
private String resolveOpenApiServerUrl(OpenAPI openAPI) {
289+
if (openAPI == null || openAPI.getServers() == null || openAPI.getServers().isEmpty()) {
290+
return null;
291+
}
292+
293+
Server server = openAPI.getServers().get(0);
294+
String url = server.getUrl();
295+
if (url == null || url.isBlank()) {
296+
return null;
297+
}
298+
299+
Map<String, ServerVariable> variables = server.getVariables();
300+
if (variables == null || variables.isEmpty()) {
301+
return url;
302+
}
303+
304+
Pattern pattern = Pattern.compile("\\{([^}]+)\\}");
305+
Matcher matcher = pattern.matcher(url);
306+
StringBuffer resolved = new StringBuffer();
307+
while (matcher.find()) {
308+
String varName = matcher.group(1);
309+
ServerVariable variable = variables.get(varName);
310+
String replacement = variable != null ? variable.getDefault() : null;
311+
if (replacement == null) {
312+
replacement = "";
313+
}
314+
matcher.appendReplacement(resolved, Matcher.quoteReplacement(replacement));
315+
}
316+
matcher.appendTail(resolved);
317+
return resolved.toString();
318+
}
319+
266320
@SuppressWarnings("unchecked")
267321
private void createAssets(ServiceExtensionContext context) {
268322
Monitor monitor = context.getMonitor();
269323
Slugify slg = Slugify.builder().lowerCase(false).build();
270324
OpenAPI openAPI = readOpenAPISchema(context.getMonitor());
271-
String baseUrl = context.getSetting(API_BASE_URL, extractBaseUrl(openapiUrl));
325+
String baseUrl = resolveBaseUrl(context, openAPI, openapiUrl);
272326
boolean forceHttpDataFixed = context.getSetting(OPENAPI_FORCE_HTTPDATAFIXED, "false")
273327
.equals("true");
274328

mock-backend/http-api.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
"url": "https://github.com/agmangas",
3030
"email": "andres.garcia@fundacionctic.org",
3131
},
32+
servers=[{"url": "/datacellar"}],
3233
)
3334

3435
API_KEY_HEADER_NAME = "X-API-Key"
@@ -226,6 +227,12 @@ async def upload_text_file(
226227

227228
@app.middleware("http")
228229
async def log_requests(request: Request, call_next):
230+
original_path = request.url.path
231+
if original_path.startswith("/datacellar"):
232+
trimmed = original_path[len("/datacellar") :]
233+
request.scope["path"] = trimmed if trimmed else "/"
234+
request.scope["root_path"] = "/datacellar"
235+
229236
headers = request.headers
230237
_logger.info("Request headers:\n%s", headers)
231238
response = await call_next(request)

0 commit comments

Comments
 (0)