Skip to content

Commit 928b1f2

Browse files
authored
improve error handling in VSCodeAPI in case files can not be accessed within an extension and include the exception message (eclipse#1625)
1 parent 8addd63 commit 928b1f2

File tree

2 files changed

+39
-19
lines changed

2 files changed

+39
-19
lines changed

server/src/main/java/org/eclipse/openvsx/adapter/VSCodeAPI.java

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@
1818
import io.swagger.v3.oas.annotations.media.Schema;
1919
import io.swagger.v3.oas.annotations.responses.ApiResponse;
2020
import jakarta.servlet.http.HttpServletRequest;
21+
import org.eclipse.openvsx.util.ErrorResultException;
2122
import org.eclipse.openvsx.util.NotFoundException;
2223
import org.eclipse.openvsx.util.TargetPlatform;
2324
import org.eclipse.openvsx.util.UrlUtil;
25+
import org.slf4j.Logger;
26+
import org.slf4j.LoggerFactory;
2427
import org.springframework.http.CacheControl;
2528
import org.springframework.http.HttpStatus;
2629
import org.springframework.http.MediaType;
@@ -44,6 +47,7 @@
4447
public class VSCodeAPI {
4548

4649
private static final int DEFAULT_PAGE_SIZE = 20;
50+
private static final Logger logger = LoggerFactory.getLogger(VSCodeAPI.class);
4751

4852
private final LocalVSCodeService local;
4953
private final UpstreamVSCodeService upstream;
@@ -81,7 +85,7 @@ private Iterable<IVSCodeService> getVSCodeServices() {
8185
public ExtensionQueryResult extensionQuery(@RequestBody @Parameter(description = "Parameters of the extension query") ExtensionQueryParam param) {
8286
var size = 0;
8387
if(param.filters() != null && !param.filters().isEmpty()) {
84-
size = param.filters().get(0).pageSize();
88+
size = param.filters().getFirst().pageSize();
8589
}
8690
if(size <= 0) {
8791
size = DEFAULT_PAGE_SIZE;
@@ -149,15 +153,19 @@ public ResponseEntity<StreamingResponseBody> getAsset(
149153
String targetPlatform
150154
) {
151155
var restOfTheUrl = UrlUtil.extractWildcardPath(request);
152-
for (var service : getVSCodeServices()) {
153-
try {
154-
return service.getAsset(namespaceName, extensionName, version, assetType, targetPlatform, restOfTheUrl);
155-
} catch (NotFoundException exc) {
156-
// Try the next registry
156+
try {
157+
for (var service : getVSCodeServices()) {
158+
try {
159+
return service.getAsset(namespaceName, extensionName, version, assetType, targetPlatform, restOfTheUrl);
160+
} catch (NotFoundException exc) {
161+
// Try the next registry
162+
}
157163
}
164+
return ResponseEntity.notFound().build();
165+
} catch (ErrorResultException ex) {
166+
logger.error(ex.getMessage());
167+
return ResponseEntity.internalServerError().build();
158168
}
159-
160-
return ResponseEntity.notFound().build();
161169
}
162170

163171
@GetMapping("/vscode/item")
@@ -301,15 +309,19 @@ public ResponseEntity<StreamingResponseBody> browse(
301309
@PathVariable @Parameter(description = "Extension version", example = "0.3.1710435722") String version
302310
) {
303311
var path = UrlUtil.extractWildcardPath(request);
304-
for (var service : getVSCodeServices()) {
305-
try {
306-
return service.browse(namespaceName, extensionName, version, path);
307-
} catch (NotFoundException exc) {
308-
// Try the next registry
312+
try {
313+
for (var service : getVSCodeServices()) {
314+
try {
315+
return service.browse(namespaceName, extensionName, version, path);
316+
} catch (NotFoundException exc) {
317+
// Try the next registry
318+
}
309319
}
320+
return ResponseEntity.notFound().build();
321+
} catch (ErrorResultException ex) {
322+
logger.error(ex.getMessage());
323+
return ResponseEntity.internalServerError().build();
310324
}
311-
312-
return ResponseEntity.notFound().build();
313325
}
314326

315327
@GetMapping(
@@ -339,9 +351,9 @@ public ResponseEntity<ExtensionQueryResult.Extension> getLatest(
339351
var result = extensionQueryRequestHandler.getResult(param, 1, DEFAULT_PAGE_SIZE);
340352
var extension = Optional.of(result)
341353
.filter(r -> !r.results().isEmpty())
342-
.map(r -> r.results().get(0).extensions())
354+
.map(r -> r.results().getFirst().extensions())
343355
.filter(e -> !e.isEmpty())
344-
.map(e -> e.get(0))
356+
.map(List::getFirst)
345357
.orElse(null);
346358

347359
return extension != null

server/src/main/java/org/eclipse/openvsx/adapter/WebResourceService.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,11 @@ public Path getWebResource(String namespace, String extension, String targetPlat
9090
return null;
9191
}
9292
} catch (IOException | UncheckedIOException e) {
93-
throw new ErrorResultException("Failed to read extension files for " + NamingUtil.toLogFormat(namespace, extension, targetPlatform, version), HttpStatus.INTERNAL_SERVER_ERROR);
93+
throw new ErrorResultException(
94+
"Failed to read extension files for " +
95+
NamingUtil.toLogFormat(namespace, extension, targetPlatform, version) + ": " + e.getMessage(),
96+
HttpStatus.INTERNAL_SERVER_ERROR
97+
);
9498
}
9599
}
96100

@@ -115,7 +119,11 @@ public ArrayNode browseExtensionPackage(String namespace, String extension, Stri
115119

116120
return node;
117121
} catch (IOException | UncheckedIOException e) {
118-
throw new ErrorResultException("Failed to read extension files for " + NamingUtil.toLogFormat(namespace, extension, targetPlatform, version), HttpStatus.INTERNAL_SERVER_ERROR);
122+
throw new ErrorResultException(
123+
"Failed to read extension files for " +
124+
NamingUtil.toLogFormat(namespace, extension, targetPlatform, version) + ": " + e.getMessage(),
125+
HttpStatus.INTERNAL_SERVER_ERROR
126+
);
119127
}
120128
}
121129

0 commit comments

Comments
 (0)