ProxyController.java 2.09 KB
package com.sigem.gis.controller;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

@RestController
public class ProxyController {

    private final HttpClient httpClient = HttpClient.newHttpClient();
    private final String GEOSERVER_INTERNAL_URL = "http://geoserver:8080/geoserver";

    @GetMapping({"/gwc/**", "/sigem/**", "/wms/**", "/wfs/**", "/rest/**"})
    public ResponseEntity<byte[]> proxyGwc(HttpServletRequest request) {
        try {
            String path = request.getRequestURI();
            String contextPath = request.getContextPath(); // /gis-geoserver
            
            // Extraer la parte despues del context path
            String relativePath = path.substring(contextPath.length());
            
            String targetUrl = GEOSERVER_INTERNAL_URL + relativePath;
            if (request.getQueryString() != null) {
                targetUrl += "?" + request.getQueryString();
            }

            HttpRequest proxyRequest = HttpRequest.newBuilder()
                    .uri(URI.create(targetUrl))
                    .GET()
                    .build();

            HttpResponse<byte[]> response = httpClient.send(proxyRequest, HttpResponse.BodyHandlers.ofByteArray());

            // Copiar cabeceras relevantes (Content-Type es el mas importante para PBF)
            HttpHeaders headers = new HttpHeaders();
            response.headers().firstValue("Content-Type").ifPresent(ct -> headers.setContentType(MediaType.parseMediaType(ct)));
            
            return ResponseEntity.status(response.statusCode())
                    .headers(headers)
                    .body(response.body());

        } catch (Exception e) {
            return ResponseEntity.status(500).build();
        }
    }
}
GitLab Appliance - Powered by TurnKey Linux