From c6443f039e57306ad89158baed727ab569bdf91e Mon Sep 17 00:00:00 2001 From: Ahoo Wang Date: Wed, 3 Apr 2024 16:05:17 +0800 Subject: [PATCH] feat: Set value only when request header does not exist (#37) --- gradle.properties | 2 +- .../client/reactive/auth/HeaderSetFilter.kt | 3 +++ .../reactive/auth/BearerTokenFilterTest.kt | 24 ++++++++++++++++++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 26e758b..0d6380d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ kotlin.code.style=official ksp.incremental=true ksp.incremental.log=true group=me.ahoo.coapi -version=1.2.5 +version=1.2.6 description=Streamlining HTTP client definition in Spring 6, CoApi provides zero boilerplate code auto-configuration for more convenient and efficient interface calls. website=https://github.com/Ahoo-Wang/CoApi issues=https://github.com/Ahoo-Wang/CoApi/issues diff --git a/spring/src/main/kotlin/me/ahoo/coapi/spring/client/reactive/auth/HeaderSetFilter.kt b/spring/src/main/kotlin/me/ahoo/coapi/spring/client/reactive/auth/HeaderSetFilter.kt index a681529..c54a627 100644 --- a/spring/src/main/kotlin/me/ahoo/coapi/spring/client/reactive/auth/HeaderSetFilter.kt +++ b/spring/src/main/kotlin/me/ahoo/coapi/spring/client/reactive/auth/HeaderSetFilter.kt @@ -25,6 +25,9 @@ open class HeaderSetFilter( private val headerValueMapper: HeaderValueMapper = HeaderValueMapper.IDENTITY ) : ExchangeFilterFunction { override fun filter(request: ClientRequest, next: ExchangeFunction): Mono { + if (request.headers().containsKey(headerName)) { + return next.exchange(request) + } return headerValueProvider.getHeaderValue() .map { headerValue -> ClientRequest.from(request) diff --git a/spring/src/test/kotlin/me/ahoo/coapi/spring/client/reactive/auth/BearerTokenFilterTest.kt b/spring/src/test/kotlin/me/ahoo/coapi/spring/client/reactive/auth/BearerTokenFilterTest.kt index 1b00f1f..5314165 100644 --- a/spring/src/test/kotlin/me/ahoo/coapi/spring/client/reactive/auth/BearerTokenFilterTest.kt +++ b/spring/src/test/kotlin/me/ahoo/coapi/spring/client/reactive/auth/BearerTokenFilterTest.kt @@ -1,9 +1,11 @@ package me.ahoo.coapi.spring.client.reactive.auth +import io.mockk.mockk import me.ahoo.coapi.spring.client.reactive.auth.ExpirableToken.Companion.jwtToExpirableToken import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.equalTo import org.junit.jupiter.api.Test +import org.springframework.http.HttpHeaders import org.springframework.http.HttpMethod import org.springframework.web.reactive.function.client.ClientRequest import org.springframework.web.reactive.function.client.ExchangeFunction @@ -21,7 +23,7 @@ class BearerTokenFilterTest { .build() val jwtToken = JwtFixture.generateToken(Date()) val nextException = ExchangeFunction { request -> - assertThat(request.headers().getFirst("Authorization"), equalTo("Bearer $jwtToken")) + assertThat(request.headers().getFirst(HttpHeaders.AUTHORIZATION), equalTo("Bearer $jwtToken")) Mono.empty() } val tokenProvider = object : ExpirableTokenProvider { @@ -34,4 +36,24 @@ class BearerTokenFilterTest { .test() .verifyComplete() } + + @Test + fun filter_ContainsKey() { + val jwtToken = JwtFixture.generateToken(Date()) + val clientRequest = ClientRequest + .create(HttpMethod.GET, URI.create("http://localhost")) + .headers { + it.setBearerAuth(jwtToken) + } + .build() + + val nextException = ExchangeFunction { request -> + Mono.empty() + } + val tokenProvider = mockk() + val bearerTokenFilter = BearerTokenFilter(tokenProvider) + bearerTokenFilter.filter(clientRequest, nextException) + .test() + .verifyComplete() + } }