All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.taobao.arthas.grpc.server.handler.GrpcResponse Maven / Gradle / Ivy

The newest version!
package com.taobao.arthas.grpc.server.handler;


import arthas.grpc.common.ArthasGrpc;
import com.taobao.arthas.grpc.server.handler.annotation.GrpcMethod;
import com.taobao.arthas.grpc.server.handler.annotation.GrpcService;
import com.taobao.arthas.grpc.server.utils.ByteUtil;
import io.netty.buffer.ByteBuf;
import io.netty.handler.codec.http2.DefaultHttp2Headers;
import io.netty.handler.codec.http2.Http2Headers;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * @author: FengYe
 * @date: 2024/9/5 02:05
 * @description: GrpcResponse
 */
public class GrpcResponse {

    private Map headers;

    /**
     * 请求的 service
     */
    private String service;

    /**
     * 请求的 method
     */
    private String method;

    /**
     * 二进制数据
     */
    private ByteBuf byteData;

    /**
     * 响应class
     */
    private Class clazz;

    {
        headers = new HashMap<>();
        headers.put("content-type", "application/grpc");
        headers.put("grpc-encoding", "identity");
        headers.put("grpc-accept-encoding", "identity,deflate,gzip");
    }

    public GrpcResponse() {
    }

    public GrpcResponse(Method method) {
        this.service = method.getDeclaringClass().getAnnotation(GrpcService.class).value();
        this.method = method.getAnnotation(GrpcMethod.class).value();
    }

    public Http2Headers getEndHeader() {
        Http2Headers endHeader = new DefaultHttp2Headers().status("200");
        headers.forEach(endHeader::set);
        return endHeader;
    }

    public Http2Headers getEndStreamHeader() {
        return new DefaultHttp2Headers().set("grpc-status", "0");
    }

    public static Http2Headers getDefaultEndStreamHeader() {
        return new DefaultHttp2Headers().set("grpc-status", "0");
    }

    public ByteBuf getResponseData() {
        return byteData;
    }

    public void writeResponseData(Object response) {
        byte[] encode = null;
        try {
            if (ArthasGrpc.ErrorRes.class.equals(clazz)) {
                encode = ((ArthasGrpc.ErrorRes) response).toByteArray();
            } else {
                encode = (byte[]) GrpcDispatcher.responseToByteArrayMap.get(GrpcDispatcher.generateGrpcMethodKey(service, method)).invoke(response);
            }
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
        this.byteData = ByteUtil.newByteBuf();
        this.byteData.writeBoolean(false);
        this.byteData.writeInt(encode.length);
        this.byteData.writeBytes(encode);
    }

    public void setClazz(Class clazz) {
        this.clazz = clazz;
    }

    public String getService() {
        return service;
    }

    public void setService(String service) {
        this.service = service;
    }

    public String getMethod() {
        return method;
    }

    public void setMethod(String method) {
        this.method = method;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy