|
|
|
@ -22,7 +22,6 @@ import java.time.Duration; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.List; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Optional; |
|
|
|
import java.util.Optional; |
|
|
|
import java.util.Set; |
|
|
|
|
|
|
|
import java.util.function.Function; |
|
|
|
import java.util.function.Function; |
|
|
|
import java.util.function.Supplier; |
|
|
|
import java.util.function.Supplier; |
|
|
|
|
|
|
|
|
|
|
|
@ -160,7 +159,7 @@ final class HttpServiceMethod { |
|
|
|
private record HttpRequestValuesInitializer( |
|
|
|
private record HttpRequestValuesInitializer( |
|
|
|
@Nullable HttpMethod httpMethod, @Nullable String url, |
|
|
|
@Nullable HttpMethod httpMethod, @Nullable String url, |
|
|
|
@Nullable MediaType contentType, @Nullable List<MediaType> acceptMediaTypes, |
|
|
|
@Nullable MediaType contentType, @Nullable List<MediaType> acceptMediaTypes, |
|
|
|
@Nullable MultiValueMap<String, String> otherHeaders, |
|
|
|
MultiValueMap<String, String> headers, |
|
|
|
Supplier<HttpRequestValues.Builder> requestValuesSupplier) { |
|
|
|
Supplier<HttpRequestValues.Builder> requestValuesSupplier) { |
|
|
|
|
|
|
|
|
|
|
|
public HttpRequestValues.Builder initializeRequestValuesBuilder() { |
|
|
|
public HttpRequestValues.Builder initializeRequestValuesBuilder() { |
|
|
|
@ -177,16 +176,8 @@ final class HttpServiceMethod { |
|
|
|
if (this.acceptMediaTypes != null) { |
|
|
|
if (this.acceptMediaTypes != null) { |
|
|
|
requestValues.setAccept(this.acceptMediaTypes); |
|
|
|
requestValues.setAccept(this.acceptMediaTypes); |
|
|
|
} |
|
|
|
} |
|
|
|
if (this.otherHeaders != null) { |
|
|
|
this.headers.forEach((name, values) -> |
|
|
|
this.otherHeaders.forEach((name, values) -> { |
|
|
|
values.forEach(value -> requestValues.addHeader(name, value))); |
|
|
|
if (values.size() == 1) { |
|
|
|
|
|
|
|
requestValues.addHeader(name, values.get(0)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
requestValues.addHeader(name, values.toArray(new String[0])); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return requestValues; |
|
|
|
return requestValues; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -217,10 +208,10 @@ final class HttpServiceMethod { |
|
|
|
String url = initUrl(typeAnnotation, methodAnnotation, embeddedValueResolver); |
|
|
|
String url = initUrl(typeAnnotation, methodAnnotation, embeddedValueResolver); |
|
|
|
MediaType contentType = initContentType(typeAnnotation, methodAnnotation); |
|
|
|
MediaType contentType = initContentType(typeAnnotation, methodAnnotation); |
|
|
|
List<MediaType> acceptableMediaTypes = initAccept(typeAnnotation, methodAnnotation); |
|
|
|
List<MediaType> acceptableMediaTypes = initAccept(typeAnnotation, methodAnnotation); |
|
|
|
MultiValueMap<String, String> headers = initHeaders(typeAnnotation, methodAnnotation, |
|
|
|
MultiValueMap<String, String> headers = initHeaders(typeAnnotation, methodAnnotation, embeddedValueResolver); |
|
|
|
embeddedValueResolver); |
|
|
|
|
|
|
|
return new HttpRequestValuesInitializer(httpMethod, url, contentType, |
|
|
|
return new HttpRequestValuesInitializer( |
|
|
|
acceptableMediaTypes, headers, requestValuesSupplier); |
|
|
|
httpMethod, url, contentType, acceptableMediaTypes, headers, requestValuesSupplier); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Nullable |
|
|
|
@Nullable |
|
|
|
@ -296,48 +287,42 @@ final class HttpServiceMethod { |
|
|
|
return null; |
|
|
|
return null; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private static MultiValueMap<String, String> parseHeaders(String[] headersArray, |
|
|
|
private static MultiValueMap<String, String> initHeaders( |
|
|
|
|
|
|
|
@Nullable HttpExchange typeAnnotation, HttpExchange methodAnnotation, |
|
|
|
@Nullable StringValueResolver embeddedValueResolver) { |
|
|
|
@Nullable StringValueResolver embeddedValueResolver) { |
|
|
|
|
|
|
|
|
|
|
|
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>(); |
|
|
|
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>(); |
|
|
|
for (String h: headersArray) { |
|
|
|
if (typeAnnotation != null) { |
|
|
|
String[] headerPair = StringUtils.split(h, "="); |
|
|
|
addHeaders(typeAnnotation.headers(), embeddedValueResolver, headers); |
|
|
|
if (headerPair != null) { |
|
|
|
|
|
|
|
String headerName = headerPair[0].trim(); |
|
|
|
|
|
|
|
List<String> headerValues = new ArrayList<>(); |
|
|
|
|
|
|
|
Set<String> parsedValues = StringUtils.commaDelimitedListToSet(headerPair[1]); |
|
|
|
|
|
|
|
for (String headerValue : parsedValues) { |
|
|
|
|
|
|
|
if (embeddedValueResolver != null) { |
|
|
|
|
|
|
|
headerValue = embeddedValueResolver.resolveStringValue(headerValue); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (headerValue != null) { |
|
|
|
|
|
|
|
headerValue = headerValue.trim(); |
|
|
|
|
|
|
|
headerValues.add(headerValue); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (!headerValues.isEmpty()) { |
|
|
|
|
|
|
|
headers.addAll(headerName, headerValues); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
addHeaders(methodAnnotation.headers(), embeddedValueResolver, headers); |
|
|
|
return headers; |
|
|
|
return headers; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Nullable |
|
|
|
private static void addHeaders( |
|
|
|
private static MultiValueMap<String, String> initHeaders(@Nullable HttpExchange typeAnnotation, HttpExchange methodAnnotation, |
|
|
|
String[] rawValues, @Nullable StringValueResolver embeddedValueResolver, |
|
|
|
@Nullable StringValueResolver embeddedValueResolver) { |
|
|
|
MultiValueMap<String, String> outputHeaders) { |
|
|
|
MultiValueMap<String, String> methodLevelHeaders = parseHeaders(methodAnnotation.headers(), |
|
|
|
|
|
|
|
embeddedValueResolver); |
|
|
|
|
|
|
|
if (!ObjectUtils.isEmpty(methodLevelHeaders)) { |
|
|
|
|
|
|
|
return methodLevelHeaders; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MultiValueMap<String, String> typeLevelHeaders = (typeAnnotation != null ? |
|
|
|
for (String rawValue: rawValues) { |
|
|
|
parseHeaders(typeAnnotation.headers(), embeddedValueResolver) : null); |
|
|
|
String[] pair = StringUtils.split(rawValue, "="); |
|
|
|
if (!ObjectUtils.isEmpty(typeLevelHeaders)) { |
|
|
|
if (pair == null) { |
|
|
|
return typeLevelHeaders; |
|
|
|
continue; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
String name = pair[0].trim(); |
|
|
|
|
|
|
|
List<String> values = new ArrayList<>(); |
|
|
|
|
|
|
|
for (String value : StringUtils.commaDelimitedListToSet(pair[1])) { |
|
|
|
|
|
|
|
if (embeddedValueResolver != null) { |
|
|
|
|
|
|
|
value = embeddedValueResolver.resolveStringValue(value); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (value != null) { |
|
|
|
|
|
|
|
value = value.trim(); |
|
|
|
|
|
|
|
values.add(value); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (!values.isEmpty()) { |
|
|
|
|
|
|
|
outputHeaders.addAll(name, values); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private static List<AnnotationDescriptor> getAnnotationDescriptors(AnnotatedElement element) { |
|
|
|
private static List<AnnotationDescriptor> getAnnotationDescriptors(AnnotatedElement element) { |
|
|
|
|