use of com.baidu.brpc.ChannelInfo in project brpc-java by baidu.
the class HuluRpcProtocol method decodeResponse.
@Override
public Response decodeResponse(Object packet, ChannelHandlerContext ctx) throws Exception {
HuluRpcDecodePacket responsePacket = (HuluRpcDecodePacket) packet;
ByteBuf metaBuf = responsePacket.getMetaBuf();
ByteBuf protoAndAttachmentBuf = responsePacket.getProtoAndAttachmentBuf();
ByteBuf protoBuf = null;
try {
RpcResponse rpcResponse = new RpcResponse();
HuluRpcProto.HuluRpcResponseMeta responseMeta = (HuluRpcProto.HuluRpcResponseMeta) ProtobufUtils.parseFrom(metaBuf, defaultRpcResponseMetaInstance);
Long correlationId = responseMeta.getCorrelationId();
rpcResponse.setCorrelationId(correlationId);
ChannelInfo channelInfo = ChannelInfo.getClientChannelInfo(ctx.channel());
RpcFuture future = channelInfo.removeRpcFuture(rpcResponse.getCorrelationId());
if (future == null) {
return rpcResponse;
}
rpcResponse.setRpcFuture(future);
int compressType = responseMeta.getCompressType();
rpcResponse.setCompressType(compressType);
try {
if (responseMeta != null && responseMeta.getErrorCode() == 0) {
Compress compress = compressManager.getCompress(compressType);
int userMessageSize = responseMeta.getUserMessageSize();
if (userMessageSize > 0) {
protoBuf = protoAndAttachmentBuf.readSlice(userMessageSize);
} else {
protoBuf = protoAndAttachmentBuf;
}
Object responseProto = compress.uncompressOutput(protoBuf, future.getRpcMethodInfo());
rpcResponse.setResult(responseProto);
// attachment
if (responseMeta.getUserMessageSize() > 0) {
rpcResponse.setBinaryAttachment(protoAndAttachmentBuf);
responsePacket.setProtoAndAttachmentBuf(null);
}
} else {
rpcResponse.setException(new RpcException(RpcException.SERVICE_EXCEPTION, responseMeta.getErrorText()));
}
} catch (Exception ex) {
// 解析失败直接抛异常
throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, "decode response failed", ex);
}
return rpcResponse;
} finally {
if (responsePacket.getMetaBuf() != null) {
responsePacket.getMetaBuf().release();
}
if (responsePacket.getProtoAndAttachmentBuf() != null) {
responsePacket.getProtoAndAttachmentBuf().release();
}
}
}
use of com.baidu.brpc.ChannelInfo in project brpc-java by baidu.
the class PublicPbrpcProtocol method decodeResponse.
@Override
public Response decodeResponse(Object in, ChannelHandlerContext ctx) throws Exception {
PublicPbRpcPacket packet = (PublicPbRpcPacket) in;
RpcResponse rpcResponse = new RpcResponse();
ChannelInfo channelInfo = ChannelInfo.getClientChannelInfo(ctx.channel());
ByteBuf bodyBuf = packet.getBody();
try {
PublicPbrpcResponse pbResponse = (PublicPbrpcResponse) ProtobufUtils.parseFrom(bodyBuf, PublicPbrpcResponse.getDefaultInstance());
ResponseBody body = pbResponse.getResponseBody(0);
ResponseHead head = pbResponse.getResponseHead();
if (head.getCode() != 0) {
rpcResponse.setException(new RpcException(head.getText()));
} else {
rpcResponse.setCorrelationId(body.getId());
RpcFuture future = channelInfo.removeRpcFuture(rpcResponse.getCorrelationId());
if (future == null) {
return rpcResponse;
}
rpcResponse.setRpcFuture(future);
Object responseBody;
int compressType = head.getCompressType();
try {
Compress compress = compressManager.getCompress(compressType);
responseBody = compress.uncompressOutput(body.getSerializedResponse().toByteArray(), future.getRpcMethodInfo());
} catch (Exception ex) {
String errorMsg = String.format("decode failed, msg=%s", ex.getMessage());
log.error(errorMsg);
throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, errorMsg, ex);
}
rpcResponse.setResult(responseBody);
}
} finally {
if (bodyBuf != null) {
bodyBuf.release();
}
}
return rpcResponse;
}
use of com.baidu.brpc.ChannelInfo in project brpc-java by baidu.
the class DefaultServerPushProtocol method decodeResponse.
@Override
public Response decodeResponse(Object in, ChannelHandlerContext ctx) throws Exception {
DefaultServerPushPacket packet = (DefaultServerPushPacket) in;
RpcResponse rpcResponse = new RpcResponse();
// channel info是在客户端生成连接池的时候生成的
ChannelInfo channelInfo = ChannelInfo.getClientChannelInfo(ctx.channel());
Long correlationId = packet.getSpHead().getCorrelationId();
rpcResponse.setCorrelationId(correlationId);
RpcFuture future = channelInfo.removeRpcFuture(rpcResponse.getCorrelationId());
if (future == null || future.getRpcMethodInfo() == null) {
// rpc method info为null,表示register请求
try {
ByteBuf byteBuf = packet.getBodyBuf();
byteBuf.release();
} catch (Exception e) {
throw new RpcException(e);
}
return rpcResponse;
}
rpcResponse.setRpcFuture(future);
SPBody spBody = decodeBodyByteBuf(packet.getBodyBuf());
Object responseBody = spBody.getContent();
if (responseBody == null) {
return null;
}
rpcResponse.setResult(responseBody);
return rpcResponse;
}
use of com.baidu.brpc.ChannelInfo in project brpc-java by baidu.
the class SofaRpcProtocol method decodeResponse.
@Override
public RpcResponse decodeResponse(Object packet, ChannelHandlerContext ctx) throws Exception {
SofaRpcDecodePacket responsePacket = (SofaRpcDecodePacket) packet;
ByteBuf metaBuf = responsePacket.getMetaBuf();
ByteBuf protoBuf = responsePacket.getProtoBuf();
try {
RpcResponse rpcResponse = new RpcResponse();
SofaRpcProto.SofaRpcMeta responseMeta = (SofaRpcProto.SofaRpcMeta) ProtobufUtils.parseFrom(metaBuf, defaultRpcMetaInstance);
Long correlationId = responseMeta.getSequenceId();
rpcResponse.setCorrelationId(correlationId);
ChannelInfo channelInfo = ChannelInfo.getClientChannelInfo(ctx.channel());
RpcFuture future = channelInfo.removeRpcFuture(rpcResponse.getCorrelationId());
if (future == null) {
return rpcResponse;
}
rpcResponse.setRpcFuture(future);
int compressType = getStandardCompressType(responseMeta.getCompressType());
rpcResponse.setCompressType(compressType);
try {
if (responseMeta != null && responseMeta.getErrorCode() == 0) {
Compress compress = compressManager.getCompress(compressType);
Object result = compress.uncompressOutput(protoBuf, future.getRpcMethodInfo());
rpcResponse.setResult(result);
} else {
rpcResponse.setException(new RpcException(RpcException.SERVICE_EXCEPTION, responseMeta.getReason()));
}
} catch (Exception ex) {
LOG.warn("decode response failed");
throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, "decode response failed", ex);
}
return rpcResponse;
} finally {
if (metaBuf != null) {
metaBuf.release();
}
if (protoBuf != null) {
protoBuf.release();
}
}
}
use of com.baidu.brpc.ChannelInfo in project brpc-java by baidu.
the class HttpRpcProtocol method decodeResponse.
@Override
public Response decodeResponse(Object msg, ChannelHandlerContext ctx) {
FullHttpResponse httpResponse = (FullHttpResponse) msg;
try {
ChannelInfo channelInfo = ChannelInfo.getClientChannelInfo(ctx.channel());
Long correlationId = parseCorrelationId(httpResponse.headers().get(CORRELATION_ID), channelInfo.getCorrelationId());
HttpResponse response = new HttpResponse();
response.setCorrelationId(correlationId);
RpcFuture future = channelInfo.removeRpcFuture(response.getCorrelationId());
if (future == null) {
return response;
}
response.setRpcFuture(future);
int bodyLen = httpResponse.content().readableBytes();
byte[] bytes = new byte[bodyLen];
httpResponse.content().readBytes(bytes);
if (!httpResponse.status().equals(HttpResponseStatus.OK)) {
String body = new String(bytes);
String message = String.format("http status=%d, message=%s", httpResponse.status().code(), body);
LOG.warn("{}", message);
response.setException(new RpcException(RpcException.SERVICE_EXCEPTION, message));
return response;
}
String contentTypeAndEncoding = httpResponse.headers().get(HttpHeaderNames.CONTENT_TYPE).toLowerCase();
String[] splits = StringUtils.split(contentTypeAndEncoding, ";");
int protocolType = HttpRpcProtocol.parseProtocolType(splits[0]);
String encoding = this.encoding;
// 由于uc服务返回的encoding是错误的,所以这里以client端设置的encoding为准。
// for (String split : splits) {
// split = split.trim();
// if (split.startsWith("charset=")) {
// encoding = split.substring("charset=".length());
// }
// }
Object body = null;
if (bodyLen != 0) {
try {
body = decodeBody(protocolType, encoding, bytes);
} catch (Exception ex) {
LOG.error("decode response body failed");
response.setException(ex);
return response;
}
}
if (body != null) {
try {
response.setResult(parseHttpResponse(body, future.getRpcMethodInfo()));
} catch (Exception ex) {
LOG.error("failed to parse result from HTTP body");
response.setException(ex);
}
} else {
response.setResult(null);
}
// set response attachment
if (response.getKvAttachment() == null) {
response.setKvAttachment(new HashMap<String, Object>());
}
for (Map.Entry<String, String> entry : httpResponse.headers()) {
response.getKvAttachment().put(entry.getKey(), entry.getValue());
}
return response;
} finally {
httpResponse.release();
}
}
Aggregations