From 8500216eee0eb666a511f35ed06ab156b0573ee1 Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期二, 11 七月 2023 18:52:12 +0800
Subject: [PATCH] 解决WMTS服务请求GetCapabilities时输出xml不完整

---
 src/main/java/com/moon/server/helper/HttpHelper.java |   42 ++++++++++++++++++++++++++++++++----------
 1 files changed, 32 insertions(+), 10 deletions(-)

diff --git a/src/main/java/com/moon/server/helper/HttpHelper.java b/src/main/java/com/moon/server/helper/HttpHelper.java
index 7148fba..2ee36e5 100644
--- a/src/main/java/com/moon/server/helper/HttpHelper.java
+++ b/src/main/java/com/moon/server/helper/HttpHelper.java
@@ -1,10 +1,13 @@
 package com.moon.server.helper;
 
+import com.moon.server.entity.all.StaticData;
+import com.moon.server.entity.sys.ResEntity;
 import org.apache.http.*;
 import org.apache.http.client.config.CookieSpecs;
 import org.apache.http.client.config.RequestConfig;
 import org.apache.http.client.utils.URIUtils;
 import org.apache.http.entity.InputStreamEntity;
+import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.message.BasicHeader;
@@ -19,9 +22,11 @@
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.io.PrintWriter;
 import java.net.HttpCookie;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
 import java.util.Enumeration;
 
 /**
@@ -51,7 +56,7 @@
         }
     }
 
-    public void service(HttpServletRequest request, HttpServletResponse response, String url, String cookie) throws ServletException, IOException {
+    public void service(HttpServletRequest request, HttpServletResponse response, ResEntity entity, String url) throws ServletException, IOException {
         HttpRequest proxyRequest;
         if (request.getHeader(HttpHeaders.CONTENT_LENGTH) != null || request.getHeader(HttpHeaders.TRANSFER_ENCODING) != null) {
             proxyRequest = newProxyRequestWithEntity(request, url);
@@ -63,9 +68,9 @@
         // copyRequestHeaders(request, proxyRequest, host);
         //setXrForwardedForHeader(request, proxyRequest);
 
-        if (!StringHelper.isEmpty(cookie)) {
-            proxyRequest.addHeader("Cookie", cookie + "; ");
-        }
+        //if (!StringHelper.isEmpty(cookie)) {
+        //    proxyRequest.addHeader("Cookie", cookie + "; ");
+        //}
 
         CloseableHttpClient client = null;
         HttpResponse proxyResponse = null;
@@ -83,7 +88,7 @@
             if (statusCode == HttpServletResponse.SC_NOT_MODIFIED) {
                 response.setIntHeader(HttpHeaders.CONTENT_LENGTH, 0);
             } else {
-                copyResponseEntity(proxyResponse, response);
+                copyResponseEntity(proxyResponse, request, response, entity);
             }
         } catch (Exception ex) {
             throw new ServletException(ex.getMessage());
@@ -267,12 +272,29 @@
         return theUrl;
     }
 
-    protected void copyResponseEntity(HttpResponse proxyResponse, HttpServletResponse response) throws IOException {
+    protected void copyResponseEntity(HttpResponse proxyResponse, HttpServletRequest request, HttpServletResponse response, ResEntity res) throws IOException {
         HttpEntity entity = proxyResponse.getEntity();
-        if (entity != null) {
-            //String str = EntityUtils.toString(entity, "UTF-8")
-            OutputStream servletOutputStream = response.getOutputStream();
-            entity.writeTo(servletOutputStream);
+        if (null == entity) {
+            return;
         }
+
+        OutputStream outputStream = response.getOutputStream();
+
+        Header[] headers = proxyResponse.getHeaders("content-type");
+        if (null != headers && headers.length > 0 && headers[0].getValue().contains(StaticData.TEXT_XML)) {
+            String str = EntityUtils.toString(entity, "UTF-8");
+            if (str.contains(res.getUrl())) {
+                String proxyUrl = res.getProxy().replace("{token}", response.getHeader("token"));
+                proxyUrl = request.getRequestURL().substring(0, request.getRequestURL().indexOf(proxyUrl) + proxyUrl.length());
+                str = str.replace(res.getUrl(), proxyUrl);
+
+                byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
+                response.setContentLength(bytes.length);
+                outputStream.write(bytes);
+            }
+            return;
+        }
+
+        entity.writeTo(outputStream);
     }
 }

--
Gitblit v1.9.3