diff --git a/src/main/java/com/hlab/yanalyst/global/config/RestTemplateConfig.java b/src/main/java/com/hlab/yanalyst/global/config/RestTemplateConfig.java index e9fd283..1014efd 100644 --- a/src/main/java/com/hlab/yanalyst/global/config/RestTemplateConfig.java +++ b/src/main/java/com/hlab/yanalyst/global/config/RestTemplateConfig.java @@ -4,6 +4,7 @@ import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpHeaders; import org.springframework.web.client.RestTemplate; import java.time.Duration; @@ -17,7 +18,11 @@ public class RestTemplateConfig { .connectTimeout(Duration.ofSeconds(20)) .readTimeout(Duration.ofSeconds(120)) .additionalInterceptors((request, body, execution) -> { - request.getHeaders().add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"); + if (!request.getHeaders().containsKey(HttpHeaders.USER_AGENT)) { + request.getHeaders().set(HttpHeaders.USER_AGENT, + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " + + "(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"); + } return execution.execute(request, body); }) .build(); diff --git a/src/test/java/com/hlab/yanalyst/global/config/RestTemplateConfigTest.java b/src/test/java/com/hlab/yanalyst/global/config/RestTemplateConfigTest.java new file mode 100644 index 0000000..b44596e --- /dev/null +++ b/src/test/java/com/hlab/yanalyst/global/config/RestTemplateConfigTest.java @@ -0,0 +1,38 @@ +package com.hlab.yanalyst.global.config; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.test.web.client.MockRestServiceServer; +import org.springframework.web.client.RestTemplate; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; +import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess; + +class RestTemplateConfigTest { + + @Test + void preservesCallerUserAgentWithoutAddingDuplicateHeader() { + RestTemplate restTemplate = new RestTemplateConfig().restTemplate(new RestTemplateBuilder()); + MockRestServiceServer server = MockRestServiceServer.bindTo(restTemplate).build(); + server.expect(requestTo("https://example.com/feed")) + .andExpect(request -> assertThat(request.getHeaders().get(HttpHeaders.USER_AGENT)) + .isEqualTo(List.of("social-feed-agent"))) + .andRespond(withSuccess("ok", MediaType.TEXT_PLAIN)); + + HttpHeaders headers = new HttpHeaders(); + headers.set(HttpHeaders.USER_AGENT, "social-feed-agent"); + var response = restTemplate.exchange("https://example.com/feed", HttpMethod.GET, + new HttpEntity<>(headers), String.class); + + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + server.verify(); + } +}