Skip to content

Commit 625c748

Browse files
committed
fix: http协议客户端对请求头的处理和服务端解析不一致
1 parent 8ba3d46 commit 625c748

2 files changed

Lines changed: 83 additions & 6 deletions

File tree

trpc-proto/trpc-proto-http/src/main/java/com/tencent/trpc/proto/http/client/Http2ConsumerInvoker.java

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,30 @@
1414

1515
import static com.tencent.trpc.core.common.Constants.DEFAULT_CLIENT_REQUEST_TIMEOUT_MS;
1616
import static com.tencent.trpc.proto.http.common.HttpConstants.CONNECTION_REQUEST_TIMEOUT;
17+
import static com.tencent.trpc.proto.http.common.HttpConstants.HTTP_HEADER_TRPC_CALLEE;
18+
import static com.tencent.trpc.proto.http.common.HttpConstants.HTTP_HEADER_TRPC_CALLER;
19+
import static com.tencent.trpc.proto.http.common.HttpConstants.HTTP_HEADER_TRPC_MESSAGE_TYPE;
20+
import static com.tencent.trpc.proto.http.common.HttpConstants.HTTP_HEADER_TRPC_REQUEST_ID;
21+
import static com.tencent.trpc.proto.http.common.HttpConstants.HTTP_HEADER_TRPC_TIMEOUT;
22+
import static com.tencent.trpc.proto.http.common.HttpConstants.HTTP_HEADER_TRPC_TRANS_INFO;
1723

1824
import autovalue.shaded.com.google.common.common.base.Objects;
25+
import com.fasterxml.jackson.core.Base64Variants;
1926
import com.tencent.trpc.core.common.config.BackendConfig;
2027
import com.tencent.trpc.core.common.config.ConsumerConfig;
2128
import com.tencent.trpc.core.common.config.ProtocolConfig;
2229
import com.tencent.trpc.core.exception.TRpcException;
2330
import com.tencent.trpc.core.logger.Logger;
2431
import com.tencent.trpc.core.logger.LoggerFactory;
32+
import com.tencent.trpc.core.rpc.CallInfo;
2533
import com.tencent.trpc.core.rpc.Request;
2634
import com.tencent.trpc.core.rpc.Response;
35+
import com.tencent.trpc.core.utils.JsonUtils;
2736
import com.tencent.trpc.core.utils.RpcUtils;
2837
import com.tencent.trpc.proto.http.common.HttpConstants;
2938
import java.nio.charset.StandardCharsets;
3039
import java.util.HashMap;
40+
import java.util.LinkedHashMap;
3141
import java.util.Map;
3242
import java.util.concurrent.Future;
3343
import java.util.concurrent.TimeUnit;
@@ -199,12 +209,7 @@ private SimpleHttpRequest buildRequest(Request request, int requestTimeout) thro
199209
SimpleHttpRequest simpleHttpRequest = SimpleHttpRequests.post(getUri(request));
200210
simpleHttpRequest.setConfig(requestConfig);
201211
simpleHttpRequest.setHeader(HttpHeaders.CONTENT_TYPE, HttpConstants.CONTENT_TYPE_JSON);
202-
// encode request
203-
String jsonString = encodeToJson(request);
204-
if (jsonString != null) {
205-
simpleHttpRequest.setBody(jsonString, ContentType.APPLICATION_JSON);
206-
}
207-
// Set custom business headers, consistent with the TRPC protocol, only process String and byte[]
212+
// set custom business headers, consistent with the TRPC protocol, only process String and byte[]
208213
request.getAttachments().forEach((k, v) -> {
209214
if (Objects.equal(k, HttpHeaders.TRANSFER_ENCODING) || Objects.equal(k, HttpHeaders.CONTENT_LENGTH)) {
210215
return;
@@ -215,6 +220,43 @@ private SimpleHttpRequest buildRequest(Request request, int requestTimeout) thro
215220
simpleHttpRequest.setHeader(k, new String((byte[]) v));
216221
}
217222
});
223+
// set caller and callee information
224+
CallInfo callInfo = request.getMeta().getCallInfo();
225+
simpleHttpRequest.setHeader(HTTP_HEADER_TRPC_CALLER, callInfo.getCaller());
226+
simpleHttpRequest.setHeader(HTTP_HEADER_TRPC_CALLEE, callInfo.getCallee());
227+
228+
// set request id
229+
simpleHttpRequest.setHeader(HTTP_HEADER_TRPC_REQUEST_ID, String.valueOf(request.getRequestId()));
230+
// set timeout
231+
simpleHttpRequest.setHeader(HTTP_HEADER_TRPC_TIMEOUT, String.valueOf(requestTimeout));
232+
// set message type
233+
int messageType = request.getMeta().getMessageType();
234+
if (messageType != 0) {
235+
simpleHttpRequest.setHeader(HTTP_HEADER_TRPC_MESSAGE_TYPE, String.valueOf(messageType));
236+
}
237+
// set trans info: encode attachments as JSON with base64-encoded values,
238+
// consistent with the server-side decoding logic in AbstractHttpExecutor.setAttachments
239+
Map<String, Object> attachments = request.getAttachments();
240+
if (attachments != null && !attachments.isEmpty()) {
241+
Map<String, String> transInfoMap = new LinkedHashMap<>();
242+
attachments.forEach((k, v) -> {
243+
if (v instanceof byte[]) {
244+
transInfoMap.put(k, Base64Variants.getDefaultVariant().encode((byte[]) v));
245+
} else if (v instanceof String) {
246+
transInfoMap.put(k, Base64Variants.getDefaultVariant()
247+
.encode(((String) v).getBytes(StandardCharsets.UTF_8)));
248+
}
249+
});
250+
if (!transInfoMap.isEmpty()) {
251+
simpleHttpRequest.setHeader(HTTP_HEADER_TRPC_TRANS_INFO, JsonUtils.toJson(transInfoMap));
252+
}
253+
}
254+
255+
// encode request body
256+
String jsonString = encodeToJson(request);
257+
if (jsonString != null) {
258+
simpleHttpRequest.setBody(jsonString, ContentType.APPLICATION_JSON);
259+
}
218260
return simpleHttpRequest;
219261
}
220262

trpc-proto/trpc-proto-http/src/main/java/com/tencent/trpc/proto/http/client/HttpConsumerInvoker.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,27 @@
1515
import static com.tencent.trpc.proto.http.common.HttpConstants.CONNECTION_REQUEST_TIMEOUT;
1616
import static com.tencent.trpc.proto.http.common.HttpConstants.HTTP_HEADER_TRPC_CALLEE;
1717
import static com.tencent.trpc.proto.http.common.HttpConstants.HTTP_HEADER_TRPC_CALLER;
18+
import static com.tencent.trpc.proto.http.common.HttpConstants.HTTP_HEADER_TRPC_MESSAGE_TYPE;
19+
import static com.tencent.trpc.proto.http.common.HttpConstants.HTTP_HEADER_TRPC_REQUEST_ID;
20+
import static com.tencent.trpc.proto.http.common.HttpConstants.HTTP_HEADER_TRPC_TIMEOUT;
21+
import static com.tencent.trpc.proto.http.common.HttpConstants.HTTP_HEADER_TRPC_TRANS_INFO;
1822

23+
import com.fasterxml.jackson.core.Base64Variant;
24+
import com.fasterxml.jackson.core.Base64Variants;
1925
import com.tencent.trpc.core.common.config.BackendConfig;
2026
import com.tencent.trpc.core.common.config.ConsumerConfig;
2127
import com.tencent.trpc.core.common.config.ProtocolConfig;
2228
import com.tencent.trpc.core.exception.TRpcException;
2329
import com.tencent.trpc.core.rpc.CallInfo;
2430
import com.tencent.trpc.core.rpc.Request;
2531
import com.tencent.trpc.core.rpc.Response;
32+
import com.tencent.trpc.core.utils.JsonUtils;
2633
import com.tencent.trpc.core.utils.RpcUtils;
2734
import com.tencent.trpc.proto.http.common.HttpConstants;
2835
import java.io.InputStream;
2936
import java.nio.charset.StandardCharsets;
3037
import java.util.HashMap;
38+
import java.util.LinkedHashMap;
3139
import java.util.Map;
3240
import java.util.Objects;
3341
import org.apache.commons.io.IOUtils;
@@ -162,6 +170,33 @@ private HttpPost buildRequest(Request request) throws Exception {
162170
httpPost.setHeader(HTTP_HEADER_TRPC_CALLER, callInfo.getCaller());
163171
httpPost.setHeader(HTTP_HEADER_TRPC_CALLEE, callInfo.getCallee());
164172

173+
// set request id
174+
httpPost.setHeader(HTTP_HEADER_TRPC_REQUEST_ID, String.valueOf(request.getRequestId()));
175+
// set timeout
176+
httpPost.setHeader(HTTP_HEADER_TRPC_TIMEOUT, String.valueOf(socketTimeout));
177+
// set message type
178+
int messageType = request.getMeta().getMessageType();
179+
if (messageType != 0) {
180+
httpPost.setHeader(HTTP_HEADER_TRPC_MESSAGE_TYPE, String.valueOf(messageType));
181+
}
182+
// set trans info: encode attachments as JSON with base64-encoded values,
183+
// consistent with the server-side decoding logic in AbstractHttpExecutor.setAttachments
184+
Map<String, Object> attachments = request.getAttachments();
185+
if (attachments != null && !attachments.isEmpty()) {
186+
Map<String, String> transInfoMap = new LinkedHashMap<>();
187+
attachments.forEach((k, v) -> {
188+
Base64Variant variant = Base64Variants.getDefaultVariant();
189+
if (v instanceof byte[]) {
190+
transInfoMap.put(k, variant.encode((byte[]) v));
191+
} else if (v instanceof String) {
192+
transInfoMap.put(k, variant.encode(((String) v).getBytes(StandardCharsets.UTF_8)));
193+
}
194+
});
195+
if (!transInfoMap.isEmpty()) {
196+
httpPost.setHeader(HTTP_HEADER_TRPC_TRANS_INFO, JsonUtils.toJson(transInfoMap));
197+
}
198+
}
199+
165200
// encode request parameters
166201
String jsonString = encodeToJson(request);
167202
if (jsonString != null) {

0 commit comments

Comments
 (0)