Skip to content

Commit 33fe5de

Browse files
committed
Issue #136: Fix for missing response error object
Signed-off-by: Jonah Graham <[email protected]>
1 parent 5615657 commit 33fe5de

File tree

1 file changed

+26
-19
lines changed

1 file changed

+26
-19
lines changed

org.eclipse.lsp4j.jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/RemoteEndpoint.java

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -47,19 +47,23 @@ public class RemoteEndpoint implements Endpoint, MessageConsumer, MethodProvider
4747
&& throwable.getCause() instanceof ResponseErrorException) {
4848
return ((ResponseErrorException) throwable.getCause()).getResponseError();
4949
} else {
50-
LOG.log(Level.SEVERE, "Internal error: " + throwable.getMessage(), throwable);
51-
ResponseError error = new ResponseError();
52-
error.setMessage("Internal error.");
53-
error.setCode(ResponseErrorCode.InternalError);
54-
ByteArrayOutputStream stackTrace = new ByteArrayOutputStream();
55-
PrintWriter stackTraceWriter = new PrintWriter(stackTrace);
56-
throwable.printStackTrace(stackTraceWriter);
57-
stackTraceWriter.flush();
58-
error.setData(stackTrace.toString());
59-
return error;
50+
return fallbackResponseError("Internal error", throwable);
6051
}
6152
};
62-
53+
54+
private static ResponseError fallbackResponseError(String header, Throwable throwable) {
55+
LOG.log(Level.SEVERE, header + ": " + throwable.getMessage(), throwable);
56+
ResponseError error = new ResponseError();
57+
error.setMessage(header + ".");
58+
error.setCode(ResponseErrorCode.InternalError);
59+
ByteArrayOutputStream stackTrace = new ByteArrayOutputStream();
60+
PrintWriter stackTraceWriter = new PrintWriter(stackTrace);
61+
throwable.printStackTrace(stackTraceWriter);
62+
stackTraceWriter.flush();
63+
error.setData(stackTrace.toString());
64+
return error;
65+
}
66+
6367
private final MessageConsumer out;
6468
private final Endpoint localEndpoint;
6569
private final Function<Throwable, ResponseError> exceptionHandler;
@@ -76,7 +80,10 @@ private static class PendingRequestInfo {
7680
RequestMessage requestMessage;
7781
Consumer<ResponseMessage> responseHandler;
7882
}
79-
83+
84+
/**
85+
* @param exceptionHandler An exception handler that should never return null.
86+
*/
8087
public RemoteEndpoint(MessageConsumer out, Endpoint localEndpoint, Function<Throwable, ResponseError> exceptionHandler) {
8188
if (out == null)
8289
throw new NullPointerException("out");
@@ -217,10 +224,11 @@ protected void handleRequest(RequestMessage requestMessage) {
217224
future = localEndpoint.request(requestMessage.getMethod(), requestMessage.getParams());
218225
} catch (Throwable e) {
219226
ResponseError errorObject = exceptionHandler.apply(e);
220-
if (errorObject != null) {
221-
ResponseMessage responseMessage = createErrorResponseMessage(requestMessage, errorObject);
222-
out.consume(responseMessage);
227+
if (errorObject == null) {
228+
errorObject = fallbackResponseError("Internal error. Exception handler provided no error object", e);
223229
}
230+
ResponseMessage responseMessage = createErrorResponseMessage(requestMessage, errorObject);
231+
out.consume(responseMessage);
224232
return;
225233
}
226234
synchronized (receivedRequestMap) {
@@ -237,11 +245,10 @@ protected void handleRequest(RequestMessage requestMessage) {
237245
responseMessage = createErrorResponseMessage(requestMessage, errorObject);
238246
} else {
239247
ResponseError errorObject = exceptionHandler.apply(t);
240-
if (errorObject != null) {
241-
responseMessage = createErrorResponseMessage(requestMessage, errorObject);
242-
} else {
243-
responseMessage = createResponseMessage(requestMessage);
248+
if (errorObject == null) {
249+
errorObject = fallbackResponseError("Internal error. Exception handler provided no error object", t);
244250
}
251+
responseMessage = createErrorResponseMessage(requestMessage, errorObject);
245252
}
246253
out.consume(responseMessage);
247254
return null;

0 commit comments

Comments
 (0)