protected Result doInvoke()

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;
        }
    }