下面列出了org.springframework.http.HttpRequest#getHeaders ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
public boolean match(HttpRequest request) {
if (expressions.isEmpty()) {
return true;
}
HttpHeaders httpHeaders = request.getHeaders();
List<MediaType> acceptedMediaTypes = httpHeaders.getAccept();
for (ProduceMediaTypeExpression expression : expressions) {
if (!expression.match(acceptedMediaTypes)) {
return false;
}
}
return true;
}
@Override
public ClientHttpResponse intercept(HttpRequest httpRequest, byte[] body,
ClientHttpRequestExecution clientHttpRequestExecution) throws IOException {
Map<String, String> map = ThreadContext.getImmutableContext();
HttpHeaders headers = httpRequest.getHeaders();
for (Map.Entry<String, String> entry : map.entrySet()) {
RequestContextMapping mapping = mappings.getMapping(entry.getKey());
if (mapping != null && !mapping.isLocal()) {
String key = mappings.getHeaderPrefix() + mapping.getFieldName();
if (!headers.containsKey(key)) {
headers.add(key, entry.getValue());
}
}
}
return clientHttpRequestExecution.execute(httpRequest, body);
}
public static void verifyExpectedTracingHeaders(HttpRequest executedRequest, Span expectedSpanForHeaders) {
HttpHeaders headers = executedRequest.getHeaders();
List<String> actualTraceIdHeaderVal = headers.get(TRACE_ID);
List<String> actualSpanIdHeaderVal = headers.get(SPAN_ID);
List<String> actualSampledHeaderVal = headers.get(TRACE_SAMPLED);
List<String> actualParentSpanIdHeaderVal = headers.get(PARENT_SPAN_ID);
if (expectedSpanForHeaders == null) {
verifyExpectedTracingHeaderValue(actualTraceIdHeaderVal, null);
verifyExpectedTracingHeaderValue(actualSpanIdHeaderVal, null);
verifyExpectedTracingHeaderValue(actualSampledHeaderVal, null);
verifyExpectedTracingHeaderValue(actualParentSpanIdHeaderVal, null);
}
else {
verifyExpectedTracingHeaderValue(actualTraceIdHeaderVal, expectedSpanForHeaders.getTraceId());
verifyExpectedTracingHeaderValue(actualSpanIdHeaderVal, expectedSpanForHeaders.getSpanId());
verifyExpectedTracingHeaderValue(
actualSampledHeaderVal,
convertSampleableBooleanToExpectedB3Value(expectedSpanForHeaders.isSampleable())
);
verifyExpectedTracingHeaderValue(actualParentSpanIdHeaderVal, expectedSpanForHeaders.getParentSpanId());
}
}
private void invokeBeforeSendRequest(HttpRequest httpRequest, String identifier) throws IOException {
SpringCloudBeanRegistry beanRegistry = SpringCloudBeanRegistry.getInstance();
TransactionBeanFactory beanFactory = beanRegistry.getBeanFactory();
TransactionManager transactionManager = beanFactory.getTransactionManager();
TransactionInterceptor transactionInterceptor = beanFactory.getTransactionInterceptor();
TransactionImpl transaction = //
(TransactionImpl) transactionManager.getTransactionQuietly();
TransactionContext transactionContext = transaction.getTransactionContext();
byte[] reqByteArray = SerializeUtils.serializeObject(transactionContext);
String reqTransactionStr = Base64.getEncoder().encodeToString(reqByteArray);
HttpHeaders reqHeaders = httpRequest.getHeaders();
reqHeaders.add(HEADER_TRANCACTION_KEY, reqTransactionStr);
reqHeaders.add(HEADER_PROPAGATION_KEY, this.identifier);
TransactionRequestImpl request = new TransactionRequestImpl();
request.setTransactionContext(transactionContext);
RemoteCoordinator coordinator = beanRegistry.getConsumeCoordinator(identifier);
request.setTargetTransactionCoordinator(coordinator);
transactionInterceptor.beforeSendRequest(request);
}
@Override
public ClientHttpResponse intercept(
HttpRequest request, byte[] bytes,
ClientHttpRequestExecution execution) throws IOException {
HttpHeaders headers = BladeHttpHeadersContextHolder.get();
// 考虑2中情况 1. RestTemplate 不是用 hystrix 2. 使用 hystrix
if (headers == null) {
headers = BladeHttpHeadersContextHolder.toHeaders(accountGetter, properties);
}
if (headers != null && !headers.isEmpty()) {
HttpHeaders httpHeaders = request.getHeaders();
headers.forEach((key, values) -> {
values.forEach(value -> httpHeaders.add(key, value));
});
}
return execution.execute(request, bytes);
}
@Override
public ClientHttpResponse intercept(HttpRequest httpRequest, byte[] bytes,
ClientHttpRequestExecution clientHttpRequestExecution) throws IOException {
DTMContext dtmContext = DTMContext.getDTMContext();
long gid = dtmContext.getGlobalTxId();
HttpHeaders headers = httpRequest.getHeaders();
if (gid != -1) {
DtmContextDTO dtmContextDTO = DtmContextDTO.fromDtmContext(dtmContext);
headers.add(DtmConstants.DTM_CONTEXT, Json.encode(dtmContextDTO));
}
return clientHttpRequestExecution.execute(httpRequest, bytes);
}
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
Assert.notEmpty(token, "token cannot be empty");
HttpHeaders headers = request.getHeaders();
headers.add(HttpHeaders.AUTHORIZATION, "Bearer " + token);
return execution.execute(request, body);
}
/**
* Check if the request is a same-origin one, based on {@code Origin}, {@code Host},
* {@code Forwarded}, {@code X-Forwarded-Proto}, {@code X-Forwarded-Host} and
* {@code X-Forwarded-Port} headers.
*
* <p><strong>Note:</strong> as of 5.1 this method ignores
* {@code "Forwarded"} and {@code "X-Forwarded-*"} headers that specify the
* client-originated address. Consider using the {@code ForwardedHeaderFilter}
* to extract and use, or to discard such headers.
* @return {@code true} if the request is a same-origin one, {@code false} in case
* of cross-origin request
* @since 4.2
*/
public static boolean isSameOrigin(HttpRequest request) {
HttpHeaders headers = request.getHeaders();
String origin = headers.getOrigin();
if (origin == null) {
return true;
}
String scheme;
String host;
int port;
if (request instanceof ServletServerHttpRequest) {
// Build more efficiently if we can: we only need scheme, host, port for origin comparison
HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest();
scheme = servletRequest.getScheme();
host = servletRequest.getServerName();
port = servletRequest.getServerPort();
}
else {
URI uri = request.getURI();
scheme = uri.getScheme();
host = uri.getHost();
port = uri.getPort();
}
UriComponents originUrl = UriComponentsBuilder.fromOriginHeader(origin).build();
return (ObjectUtils.nullSafeEquals(scheme, originUrl.getScheme()) &&
ObjectUtils.nullSafeEquals(host, originUrl.getHost()) &&
getPort(scheme, port) == getPort(originUrl.getScheme(), originUrl.getPort()));
}
@Override
public ClientHttpResponse intercept(final HttpRequest request, final byte[] body,
final ClientHttpRequestExecution execution) throws IOException {
try {
final HttpHeaders headers = request.getHeaders();
interceptInner(headers, request);
return execution.execute(request, body);
} finally {
registryName.remove();
}
}
/**
* Check if the request is a same-origin one, based on {@code Origin}, {@code Host},
* {@code Forwarded}, {@code X-Forwarded-Proto}, {@code X-Forwarded-Host} and
* {@code X-Forwarded-Port} headers.
*
* <p><strong>Note:</strong> as of 5.1 this method ignores
* {@code "Forwarded"} and {@code "X-Forwarded-*"} headers that specify the
* client-originated address. Consider using the {@code ForwardedHeaderFilter}
* to extract and use, or to discard such headers.
* @return {@code true} if the request is a same-origin one, {@code false} in case
* of cross-origin request
* @since 4.2
*/
public static boolean isSameOrigin(HttpRequest request) {
HttpHeaders headers = request.getHeaders();
String origin = headers.getOrigin();
if (origin == null) {
return true;
}
String scheme;
String host;
int port;
if (request instanceof ServletServerHttpRequest) {
// Build more efficiently if we can: we only need scheme, host, port for origin comparison
HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest();
scheme = servletRequest.getScheme();
host = servletRequest.getServerName();
port = servletRequest.getServerPort();
}
else {
URI uri = request.getURI();
scheme = uri.getScheme();
host = uri.getHost();
port = uri.getPort();
}
UriComponents originUrl = UriComponentsBuilder.fromOriginHeader(origin).build();
return (ObjectUtils.nullSafeEquals(scheme, originUrl.getScheme()) &&
ObjectUtils.nullSafeEquals(host, originUrl.getHost()) &&
getPort(scheme, port) == getPort(originUrl.getScheme(), originUrl.getPort()));
}
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
HttpHeaders headers = request.getHeaders();
headers.add(UserContext.CORRELATION_ID, UserContextHolder.getContext().getCorrelationId());
headers.add(UserContext.AUTH_TOKEN, UserContextHolder.getContext().getAuthToken());
return execution.execute(request, body);
}
/**
* Compress a request body using Gzip and add Http headers.
*
* @param req
* @param body
* @param exec
* @return
* @throws IOException
*/
@Override
public ClientHttpResponse intercept(HttpRequest req, byte[] body, ClientHttpRequestExecution exec)
throws IOException {
LOG.info("Compressing request...");
HttpHeaders httpHeaders = req.getHeaders();
httpHeaders.add(HttpHeaders.CONTENT_ENCODING, GZIP_ENCODING);
httpHeaders.add(HttpHeaders.ACCEPT_ENCODING, GZIP_ENCODING);
return exec.execute(req, GzipUtils.compress(body));
}
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
Transaction t = Cat.newTransaction(CatConstants.TYPE_CALL, request.getURI().toString());
try {
HttpHeaders headers = request.getHeaders();
// 保存和传递CAT调用链上下文
Context ctx = new CatContext();
Cat.logRemoteCallClient(ctx);
headers.add(CatHttpConstants.CAT_HTTP_HEADER_ROOT_MESSAGE_ID, ctx.getProperty(Cat.Context.ROOT));
headers.add(CatHttpConstants.CAT_HTTP_HEADER_PARENT_MESSAGE_ID, ctx.getProperty(Cat.Context.PARENT));
headers.add(CatHttpConstants.CAT_HTTP_HEADER_CHILD_MESSAGE_ID, ctx.getProperty(Cat.Context.CHILD));
// 保证请求继续被执行
ClientHttpResponse response = execution.execute(request, body);
t.setStatus(Transaction.SUCCESS);
return response;
} catch (Exception e) {
Cat.getProducer().logError(e);
t.setStatus(e);
throw e;
} finally {
t.complete();
}
}
/**
* add request tag
* @param request
* @param sofaTracerSpan
*/
private void appendRestTemplateRequestSpanTags(HttpRequest request,
SofaTracerSpan sofaTracerSpan) {
if (sofaTracerSpan == null) {
return;
}
//appName
String appName = SofaTracerConfiguration.getProperty(
SofaTracerConfiguration.TRACER_APPNAME_KEY, StringUtils.EMPTY_STRING);
//methodName
String methodName = request.getMethod().name();
//appName
sofaTracerSpan.setTag(CommonSpanTags.LOCAL_APP, appName == null ? StringUtils.EMPTY_STRING
: appName);
sofaTracerSpan.setTag(CommonSpanTags.REQUEST_URL, request.getURI().toString());
//method
sofaTracerSpan.setTag(CommonSpanTags.METHOD, methodName);
HttpHeaders headers = request.getHeaders();
//reqSize
if (headers != null && headers.containsKey("Content-Length")) {
List<String> contentLengthList = headers.get("Content-Length");
if (contentLengthList != null && !contentLengthList.isEmpty()) {
sofaTracerSpan.setTag(CommonSpanTags.REQ_SIZE,
Long.valueOf(contentLengthList.get(0)));
}
} else {
sofaTracerSpan.setTag(CommonSpanTags.REQ_SIZE, String.valueOf(-1));
}
//carrier
this.injectCarrier(request, sofaTracerSpan);
}
public HttpMessageConverterHolder resolve(HttpRequest request,
Class<?> parameterType) {
HttpMessageConverterHolder httpMessageConverterHolder = null;
HttpHeaders httpHeaders = request.getHeaders();
MediaType contentType = httpHeaders.getContentType();
if (contentType == null) {
contentType = MediaType.APPLICATION_OCTET_STREAM;
}
for (HttpMessageConverter<?> converter : this.messageConverters) {
if (converter instanceof GenericHttpMessageConverter) {
GenericHttpMessageConverter genericConverter = (GenericHttpMessageConverter) converter;
if (genericConverter.canRead(parameterType, parameterType, contentType)) {
httpMessageConverterHolder = new HttpMessageConverterHolder(
contentType, converter);
break;
}
}
else {
if (converter.canRead(parameterType, contentType)) {
httpMessageConverterHolder = new HttpMessageConverterHolder(
contentType, converter);
break;
}
}
}
return httpMessageConverterHolder;
}
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
HttpHeaders headers = request.getHeaders();
setHeader(headers, TAG_HEADER_NAME, headerValue);
if (orgHeaderValue != null && spaceHeaderValue != null) {
setHeader(headers, TAG_HEADER_ORG_NAME, orgHeaderValue);
setHeader(headers, TAG_HEADER_SPACE_NAME, spaceHeaderValue);
}
return execution.execute(request, body);
}
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
HttpHeaders headers = request.getHeaders();
headers.add(UserContext.CORRELATION_ID, UserContextHolder.getContext().getCorrelationId());
headers.add(UserContext.AUTH_TOKEN, UserContextHolder.getContext().getAuthToken());
return execution.execute(request, body);
}
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
Transaction t = Cat.newTransaction(CatConstants.TYPE_REMOTE_CALL, request.getURI().toString());
try {
HttpHeaders headers = request.getHeaders();
// 保存和传递CAT调用链上下文
Context ctx = new CatContext();
Cat.logRemoteCallClient(ctx);
headers.add(CatHttpConstants.CAT_HTTP_HEADER_ROOT_MESSAGE_ID, ctx.getProperty(Cat.Context.ROOT));
headers.add(CatHttpConstants.CAT_HTTP_HEADER_PARENT_MESSAGE_ID, ctx.getProperty(Cat.Context.PARENT));
headers.add(CatHttpConstants.CAT_HTTP_HEADER_CHILD_MESSAGE_ID, ctx.getProperty(Cat.Context.CHILD));
// 保证请求继续被执行
ClientHttpResponse response = execution.execute(request, body);
t.setStatus(Transaction.SUCCESS);
return response;
} catch (Exception e) {
Cat.getProducer().logError(e);
t.setStatus(e);
throw e;
} finally {
t.complete();
}
}
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
HttpHeaders headers = request.getHeaders();
headers.add(UserContext.CORRELATION_ID, UserContextHolder.getContext().getCorrelationId());
headers.add(UserContext.AUTH_TOKEN, UserContextHolder.getContext().getAuthToken());
return execution.execute(request, body);
}
/**
* Description: <br>
*
* @author 王伟<br>
* @taskId <br>
* @param httpRequest
* @param bytes
* @param clientHttpRequestExecution
* @return
* @throws IOException <br>
*/
@Override
public ClientHttpResponse intercept(final HttpRequest httpRequest, final byte[] bytes,
final ClientHttpRequestExecution clientHttpRequestExecution) throws IOException {
HttpHeaders headers = httpRequest.getHeaders();
headers.put(TraceIdFilter.TRACE_ID, Arrays.asList(TxManager.getTraceId()));
return clientHttpRequestExecution.execute(httpRequest, bytes);
}