From 9f1321355642cd400b1d1aba94d216bfbea27a66 Mon Sep 17 00:00:00 2001
From: mac <user@users-MacBook-Pro.local>
Date: 星期三, 15 五月 2024 15:31:30 +0800
Subject: [PATCH] 2024年05月15日15:31:27

---
 app/src/main/java/com/hdl/photovoltaic/internet/HttpServer/MyNanoHttpServer.java |  148 ++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 116 insertions(+), 32 deletions(-)

diff --git a/app/src/main/java/com/hdl/photovoltaic/internet/HttpServer/MyNanoHttpServer.java b/app/src/main/java/com/hdl/photovoltaic/internet/HttpServer/MyNanoHttpServer.java
index ae5e6f3..3cc1df8 100644
--- a/app/src/main/java/com/hdl/photovoltaic/internet/HttpServer/MyNanoHttpServer.java
+++ b/app/src/main/java/com/hdl/photovoltaic/internet/HttpServer/MyNanoHttpServer.java
@@ -4,9 +4,14 @@
 
 import com.alibaba.fastjson.JSON;
 import com.hdl.photovoltaic.other.HdlFileLogic;
+import com.hdl.photovoltaic.other.HdlLogLogic;
 
 
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -15,12 +20,12 @@
 import fi.iki.elonen.NanoHTTPD;
 
 /**
- * 鏈湴鏈嶅姟鍣�
+ * 鏈湴鏈嶅姟
  */
 public class MyNanoHttpServer extends NanoHTTPD {
 
     //澹版槑鏈嶅姟绔� 绔彛
-    public static final Integer HTTP_PORT = 49152;
+    public static Integer HTTP_PORT = 49152;// 46219;
 
     public MyNanoHttpServer(String hostname, int port) {
         super(hostname, port);
@@ -40,17 +45,21 @@
         return myNanoHttpServer;
     }
 
+
     @Override
     public Response serve(IHTTPSession session) {
         //TODO  瑙e喅瀹㈡埛绔姹傚弬鏁版惡甯︿腑鏂囷紝鍑虹幇涓枃涔辩爜闂
         ContentType ct = new ContentType(session.getHeaders().get("content-type")).tryUTF8();
         session.getHeaders().put("content-type", ct.getContentTypeHeader());
         return dealWith(session);
+
     }
+
 
     private Response dealWith(IHTTPSession session) {
         Date dateTime = new Date();
         if (Method.POST == session.getMethod()) {
+            //todo POST鏂规硶
             //鑾峰彇璇锋眰澶存暟鎹�
             Map<String, String> header = session.getHeaders();
             //鑾峰彇浼犲弬鍙傛暟
@@ -58,49 +67,124 @@
             try {
                 session.parseBody(params);
                 String paramStr = params.get("postData");
-                if (TextUtils.isEmpty(paramStr)) {
-                    return newFixedLengthResponse("success");
-                }
-                paramStr = paramStr.replace("\r\n", " ");
-
-                com.alibaba.fastjson.JSONObject jsonParam = JSON.parseObject(paramStr);
-                Map<String, Object> result = new HashMap<>();
-                //TODO 鍐欎綘鐨勪笟鍔¢�昏緫.....
-                //鍗囩骇椹卞姩鏂囦欢璺緞
-                String fileName = ((HTTPSession) session).getUri();
-                String data = "";
-                if (fileName.equals(HdlFileLogic.getInstance().getDriveRootPath())) {
-
-                    data = HdlFileLogic.getInstance().readFile(fileName);
-
-                }
                 //鍝嶅簲瀹㈡埛绔�
-                return newFixedLengthResponse(data);
-//                return newFixedLengthResponse("success");
-            } catch (IOException e) {
-                e.printStackTrace();
-            } catch (ResponseException e) {
+                return newFixedLengthResponse("success");
+            } catch (IOException | ResponseException e) {
                 e.printStackTrace();
             }
             return newFixedLengthResponse("success");
         } else if (Method.GET == session.getMethod()) {
+            //todo GET鏂规硶
             Map<String, List<String>> parameters = session.getParameters();
-            //鍗囩骇椹卞姩鏂囦欢璺緞
+            //椹卞姩鍗囩骇鏂囦欢璺緞
             String fileName = ((HTTPSession) session).getUri();
-            String data = "";
-            if (fileName.contains(HdlFileLogic.getInstance().getDriveRootPath())) {
-                data = HdlFileLogic.getInstance().readFile(fileName);
+            if (!TextUtils.isEmpty(fileName)) {
+                if (fileName.contains(HdlFileLogic.getInstance().getDriveRootPath())
+                        || fileName.contains(HdlFileLogic.getInstance().getFirmwareRootPath())) {
+                    String range = session.getHeaders().get("range");
+                    if (TextUtils.isEmpty(range)) {
+                        return newFixedLengthResponse("閿欒,澶撮儴娌℃湁range瀛楁(-500)");
+                    }
+                    HdlLogLogic.print("http閫嗗彉鍣ㄨ姹�===璇锋眰澶у皬-->" + range, true);
+                    if (!range.contains("=")) {
+                        HdlLogLogic.print("閿欒,range鐨剉alue鏍煎紡涓嶅.(-501)", true);
+                        return newFixedLengthResponse("閿欒,range鐨剉alue鏍煎紡涓嶅.(-501)");
+                    }
+                    String[] bytesAry = range.split("=");
+                    if (bytesAry.length < 2) {
+                        HdlLogLogic.print("閿欒,range鐨剉alue鏍煎紡涓嶅.(-502)", true);
+                        return newFixedLengthResponse("閿欒,range鐨剉alue鏍煎紡涓嶅.(-502)");
+                    }
+                    String[] dataIndex = bytesAry[1].split("-");
+                    if (dataIndex.length < 2) {
+                        HdlLogLogic.print("閿欒,range鐨剉alue鏍煎紡涓嶅.(-503)", true);
+                        return newFixedLengthResponse("閿欒,range鐨剉alue鏍煎紡涓嶅.(-503)");
+                    }
+                    int startIndex = Integer.parseInt(dataIndex[0]);
+                    int endIndex = Integer.parseInt(dataIndex[1]);
+                    if (endIndex + 1 - startIndex <= 0) {
+                        HdlLogLogic.print("閿欒,璇锋眰澶у皬鏈夐棶棰�.(-504)", true);
+                        return newFixedLengthResponse("閿欒,璇锋眰澶у皬鏈夐棶棰�.(-504)");
+                    }
+                    //璇诲彇鏈湴鏂囦欢瀛楄妭娴�
+                    byte[] sourceDataByte = HdlFileLogic.getInstance().readFileByte(fileName);
+                    if (sourceDataByte == null || sourceDataByte.length == 0) {
+                        HdlLogLogic.print("閿欒,鏈湴鎵句笉鍒版枃浠�,璇蜂笅杞藉啀璇�.(-505)", true);
+                        return newFixedLengthResponse("閿欒,鏈湴鎵句笉鍒版枃浠�,璇蜂笅杞藉啀璇�.(-505)");
+                    }
+                    //鏍规嵁璇锋眰澶у皬鍒涘缓缂撳瓨鍖�
+                    byte[] newByte = new byte[endIndex - startIndex + 1];
+                    //鏍规嵁璇锋眰鍋忕Щ閲忓彇鏁版嵁,涓斿鍒跺埌缂撳瓨鍖�
+                    System.arraycopy(sourceDataByte, startIndex, newByte, 0, endIndex + 1 - startIndex);
+                    //鍝嶅簲瀹㈡埛绔�
+                    Response response = newFixedLengthResponse(newByte);
+                    response.addHeader("Content-Range", range + "/" + sourceDataByte.length);//浼熷崡闇�瑕佽繖涓瓧娈�
+                    HdlLogLogic.print("http鍥炲鏁版嵁===璇锋眰澶у皬--" + range + "=====鏂囦欢澶у皬--" + sourceDataByte.length, true);
+                    return response;
+                }
             }
-            //鍝嶅簲瀹㈡埛绔�
-            return newFixedLengthResponse(data);
-//            return newFixedLengthResponse("success");
-        }
+            return newFixedLengthResponse("success");
 
+        }
         return newFixedLengthResponse("404");
     }
 
     public static Response newFixedLengthResponse(String msg) {
-        return newFixedLengthResponse(Response.Status.OK, NanoHTTPD.MIME_HTML, msg);
+
+        /**
+         鏂囨湰绫诲瀷锛�
+         text/plain锛氱函鏂囨湰
+         text/html锛欻TML 鏂囨。
+         text/css锛欳SS 鏍峰紡琛�
+         text/javascript锛欽avaScript 鑴氭湰
+         搴旂敤绋嬪簭绫诲瀷锛�
+         application/json锛欽SON 鏁版嵁
+         application/xml锛歑ML 鏁版嵁
+         application/pdf锛歅DF 鏂囨。
+         application/octet-stream锛氫簩杩涘埗鏁版嵁娴�
+         application/x-www-form-urlencoded锛歎RL 缂栫爜鐨勮〃鍗曟暟鎹�
+         application/zip锛歓IP 鍘嬬缉鏂囦欢
+         application/x-gzip锛欸ZIP 鍘嬬缉鏂囦欢
+         鍥剧墖绫诲瀷锛�
+         image/jpeg锛欽PEG 鍥惧儚
+         image/png锛歅NG 鍥惧儚
+         image/gif锛欸IF 鍥惧儚
+         image/svg+xml锛歋VG 鍥惧儚
+         闊抽/瑙嗛绫诲瀷锛�
+         audio/mpeg锛歁P3 闊抽
+         video/mp4锛歁P4 瑙嗛
+         video/mpeg锛歁PEG 瑙嗛
+         */
+        return newFixedLengthResponse(Response.Status.OK, "application/octet-stream", msg);
+    }
+
+    public static Response newFixedLengthResponse(byte[] by) {
+
+        /**
+         鏂囨湰绫诲瀷锛�
+         text/plain锛氱函鏂囨湰
+         text/html锛欻TML 鏂囨。
+         text/css锛欳SS 鏍峰紡琛�
+         text/javascript锛欽avaScript 鑴氭湰
+         搴旂敤绋嬪簭绫诲瀷锛�
+         application/json锛欽SON 鏁版嵁
+         application/xml锛歑ML 鏁版嵁
+         application/pdf锛歅DF 鏂囨。
+         application/octet-stream锛氫簩杩涘埗鏁版嵁娴�
+         application/x-www-form-urlencoded锛歎RL 缂栫爜鐨勮〃鍗曟暟鎹�
+         application/zip锛歓IP 鍘嬬缉鏂囦欢
+         application/x-gzip锛欸ZIP 鍘嬬缉鏂囦欢
+         鍥剧墖绫诲瀷锛�
+         image/jpeg锛欽PEG 鍥惧儚
+         image/png锛歅NG 鍥惧儚
+         image/gif锛欸IF 鍥惧儚
+         image/svg+xml锛歋VG 鍥惧儚
+         闊抽/瑙嗛绫诲瀷锛�
+         audio/mpeg锛歁P3 闊抽
+         video/mp4锛歁P4 瑙嗛
+         video/mpeg锛歁PEG 瑙嗛
+         */
+        return newFixedLengthResponse(NanoHTTPD.Response.Status.OK, "application/octet-stream", new ByteArrayInputStream(by), by.length);
     }
 
 }

--
Gitblit v1.8.0