BitoAgent commented on code in PR #13786: URL: https://github.com/apache/dubbo/pull/13786#discussion_r1573855670
########## dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/grpc/GrpcHttp2ServerTransportListener.java: ########## @@ -145,39 +146,31 @@ public void onMessage(InputStream inputStream) { private class DetermineMethodDescriptorListener implements StreamingDecoder.FragmentListener { - @Override - public void onFragmentMessage(InputStream rawMessage) {} - @Override public void onClose() { getStreamingDecoder().close(); } @Override - public void onFragmentMessage(InputStream dataHeader, InputStream rawMessage) { + public void onFragmentMessage(InputStream rawMessage) { try { - ByteArrayOutputStream merged = - new ByteArrayOutputStream(dataHeader.available() + rawMessage.available()); - StreamUtils.copy(dataHeader, merged); - byte[] data = StreamUtils.readBytes(rawMessage); - RpcInvocationBuildContext context = getContext(); if (null == context.getMethodDescriptor()) { - context.setMethodDescriptor(DescriptorUtils.findTripleMethodDescriptor( - context.getServiceDescriptor(), context.getMethodName(), data)); + byte[] data = StreamUtils.readBytes(rawMessage); + MethodDescriptor methodDescriptor = DescriptorUtils.findTripleMethodDescriptor( + context.getServiceDescriptor(), context.getMethodName(), data); + context.setMethodDescriptor(methodDescriptor); setHttpMessageListener(GrpcHttp2ServerTransportListener.super.buildHttpMessageListener()); // replace decoder GrpcCompositeCodec grpcCompositeCodec = (GrpcCompositeCodec) context.getHttpMessageDecoder(); - MethodMetadata methodMetadata = context.getMethodMetadata(); - grpcCompositeCodec.setDecodeTypes(methodMetadata.getActualRequestTypes()); - grpcCompositeCodec.setEncodeTypes(new Class[] {methodMetadata.getActualResponseType()}); + grpcCompositeCodec.loadPackableMethod(methodDescriptor); getServerChannelObserver().setResponseEncoder(grpcCompositeCodec); + rawMessage = new ByteArrayInputStream(data); } - merged.write(data); - getHttpMessageListener().onMessage(new ByteArrayInputStream(merged.toByteArray())); + getStreamingDecoder().invokeListener(rawMessage); Review Comment: **Issue**: The refactor to streamline the DetermineMethodDescriptorListener and the removal of unnecessary ByteArrayOutputStream usage are excellent for performance. However, directly reading bytes from the rawMessage InputStream without checking its availability or size could potentially lead to issues with large messages. <br> **Fix**: Implement a check on the InputStream size or availability before attempting to read bytes to ensure that the system can handle large messages without running into memory issues. <br> **Code Suggestion**: ``` if (rawMessage.available() > MAX_MESSAGE_SIZE) { throw new IOException("Message size exceeds the maximum limit"); } byte[] data = StreamUtils.readBytes(rawMessage); context.setMethodDescriptor(DescriptorUtils.findTripleMethodDescriptor(context.getServiceDescriptor(), context.getMethodName(), data)); ``` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: notifications-unsubscr...@dubbo.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@dubbo.apache.org For additional commands, e-mail: notifications-h...@dubbo.apache.org