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/entity/all/StaticData.java                  |    2 ++
 src/main/java/com/moon/server/service/sys/ProxyService.java               |    7 ++++---
 src/main/java/com/moon/server/controller/data/upload/CheckController.java |    2 +-
 src/main/java/com/moon/server/helper/HttpHelper.java                      |   42 ++++++++++++++++++++++++++++++++----------
 4 files changed, 39 insertions(+), 14 deletions(-)

diff --git a/src/main/java/com/moon/server/controller/data/upload/CheckController.java b/src/main/java/com/moon/server/controller/data/upload/CheckController.java
index 4813937..b304901 100644
--- a/src/main/java/com/moon/server/controller/data/upload/CheckController.java
+++ b/src/main/java/com/moon/server/controller/data/upload/CheckController.java
@@ -68,7 +68,7 @@
 
                 HttpHelper httpHelper = new HttpHelper();
                 // res.sendRedirect(url)
-                httpHelper.service(req, res, url, null);
+                httpHelper.service(req, res, null, url);
             }
         } catch (Exception ex) {
             log.error(ex.getMessage(), ex);
diff --git a/src/main/java/com/moon/server/entity/all/StaticData.java b/src/main/java/com/moon/server/entity/all/StaticData.java
index 7ccd236..5e63475 100644
--- a/src/main/java/com/moon/server/entity/all/StaticData.java
+++ b/src/main/java/com/moon/server/entity/all/StaticData.java
@@ -91,6 +91,8 @@
 
     public final static String BBOREHOLE = "bborehole";
 
+    public final static String TEXT_XML = "text/xml";
+
     /**
      * 姝f枩鏉�
      */
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);
     }
 }
diff --git a/src/main/java/com/moon/server/service/sys/ProxyService.java b/src/main/java/com/moon/server/service/sys/ProxyService.java
index 7954f07..ee18ddb 100644
--- a/src/main/java/com/moon/server/service/sys/ProxyService.java
+++ b/src/main/java/com/moon/server/service/sys/ProxyService.java
@@ -62,7 +62,8 @@
         insertLog(req, ue, resId);
 
         String url = getSourceUrl(req, entity, token);
-        forward(req, res, url);
+        res.setHeader("token", token);
+        forward(req, res, entity, url);
     }
 
     /**
@@ -237,8 +238,8 @@
     /**
      * 杞彂璇锋眰
      */
-    private void forward(HttpServletRequest request, HttpServletResponse response, String url) throws Exception {
+    private void forward(HttpServletRequest request, HttpServletResponse response, ResEntity entity, String url) throws Exception {
         HttpHelper httpHelper = new HttpHelper();
-        httpHelper.service(request, response, url, null);
+        httpHelper.service(request, response, entity, url);
     }
 }

--
Gitblit v1.9.3