View Javadoc
1   /*
2    * Copyright (C) 2023 B3Partners B.V.
3    *
4    * SPDX-License-Identifier: MIT
5    */
6   package org.tailormap.api.geotools.wfs;
7   
8   import static org.springframework.http.HttpHeaders.REFERER;
9   import static org.tailormap.api.util.HttpProxyUtil.addForwardedForRequestHeaders;
10  import static org.tailormap.api.util.HttpProxyUtil.configureProxyRequestBuilderForUri;
11  import static org.tailormap.api.util.HttpProxyUtil.passthroughRequestHeaders;
12  import static org.tailormap.api.util.HttpProxyUtil.setHttpBasicAuthenticationHeader;
13  
14  import jakarta.servlet.http.HttpServletRequest;
15  import java.io.InputStream;
16  import java.net.URI;
17  import java.net.http.HttpClient;
18  import java.net.http.HttpRequest;
19  import java.net.http.HttpResponse;
20  import java.util.Set;
21  
22  public class WFSProxy {
23    private final HttpClient httpClient;
24  
25    public WFSProxy() {
26      final HttpClient.Builder builder = HttpClient.newBuilder().followRedirects(HttpClient.Redirect.NORMAL);
27      this.httpClient = builder.build();
28    }
29  
30    public HttpResponse<InputStream> proxyWfsRequest(
31        URI wfsRequest, String username, String password, HttpServletRequest request) throws Exception {
32  
33      HttpRequest.Builder requestBuilder = HttpRequest.newBuilder();
34      configureProxyRequestBuilderForUri(requestBuilder, wfsRequest, request);
35      addForwardedForRequestHeaders(requestBuilder, request);
36      // Just a few headers for logging, conditional or range requests not likely to be supported by a
37      // WFS
38      passthroughRequestHeaders(requestBuilder, request, Set.of(REFERER, "User-Agent"));
39      setHttpBasicAuthenticationHeader(requestBuilder, username, password);
40  
41      return httpClient.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofInputStream());
42    }
43  }