in dubbo-rpc-extensions/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestInvoker.java [65:131]
protected Result doInvoke(Invocation invocation) {
try {
Map<String, Map<ParameterTypesComparator, RestMethodMetadata>> metadataMap =
serviceRestMetadata.getMethodToServiceMap();
// get metadata
RestMethodMetadata restMethodMetadata = metadataMap
.get(invocation.getMethodName())
.get(ParameterTypesComparator.getInstance(invocation.getParameterTypes()));
// create requestTemplate
RequestTemplate requestTemplate = new RequestTemplate(
invocation, restMethodMetadata.getRequest().getMethod(), getUrl().getAddress());
HttpConnectionCreateContext httpConnectionCreateContext = createHttpConnectionCreateContext(
invocation, serviceRestMetadata, restMethodMetadata, requestTemplate);
// fill real data
for (HttpConnectionPreBuildIntercept intercept : httpConnectionPreBuildIntercepts) {
intercept.intercept(httpConnectionCreateContext);
}
// TODO check rest client cannot be reused
CompletableFuture<RestResult> future =
referenceCountedClient.getClient().send(requestTemplate);
CompletableFuture<AppResponse> responseFuture = new CompletableFuture<>();
AsyncRpcResult asyncRpcResult = new AsyncRpcResult(responseFuture, invocation);
future.whenComplete((r, t) -> {
if (t != null) {
responseFuture.completeExceptionally(t);
} else {
AppResponse appResponse = new AppResponse();
try {
int responseCode = r.getResponseCode();
MediaType mediaType = MediaType.TEXT_PLAIN;
if (responseCode == 404) {
responseFuture.completeExceptionally(new PathNoFoundException(r.getMessage()));
} else if (400 <= responseCode && responseCode < 500) {
responseFuture.completeExceptionally(new ParamParseException(r.getMessage()));
// TODO add Exception Mapper
} else if (responseCode >= 500) {
responseFuture.completeExceptionally(new RemoteServerInternalException(r.getMessage()));
} else if (responseCode < 400) {
Method reflectMethod = restMethodMetadata.getReflectMethod();
mediaType =
MediaTypeUtil.convertMediaType(reflectMethod.getReturnType(), r.getContentType());
Object value = HttpMessageCodecManager.httpMessageDecode(
r.getBody(),
reflectMethod.getReturnType(),
reflectMethod.getGenericReturnType(),
mediaType);
appResponse.setValue(value);
// resolve response attribute & attachment
HttpHeaderUtil.parseResponseHeader(appResponse, r);
responseFuture.complete(appResponse);
}
} catch (Exception e) {
responseFuture.completeExceptionally(e);
}
}
});
return asyncRpcResult;
} catch (RpcException e) {
throw e;
}
}