fix simple server

This commit is contained in:
Looly 2020-08-07 15:51:31 +08:00
parent 7b0e6dddc0
commit 76d6768790
8 changed files with 75 additions and 15 deletions

View File

@ -19,6 +19,7 @@
* 【core 】 修复BeanUtil.mapToBean中bean的class非空构造无法实例化问题 * 【core 】 修复BeanUtil.mapToBean中bean的class非空构造无法实例化问题
* 【core 】 修复NamedSql多个连续变量出现替换问题 * 【core 】 修复NamedSql多个连续变量出现替换问题
* 【core 】 修复Bean重名字段大小写区别获取数据出错的问题issue#I1QBQ4@Gitee * 【core 】 修复Bean重名字段大小写区别获取数据出错的问题issue#I1QBQ4@Gitee
* 【http 】 修复SimpleServer响应头无效问题issue#1006@Github
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------

View File

@ -10,7 +10,6 @@ import cn.hutool.http.ContentType;
import cn.hutool.http.Header; import cn.hutool.http.Header;
import cn.hutool.http.HttpStatus; import cn.hutool.http.HttpStatus;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpExchange;
@ -116,9 +115,6 @@ public class HttpServerResponse extends HttpServerBase {
* @return 响应头 * @return 响应头
*/ */
public Headers getHeaders() { public Headers getHeaders() {
if (false == this.isSendCode) {
sendOk();
}
return this.httpExchange.getResponseHeaders(); return this.httpExchange.getResponseHeaders();
} }
@ -356,10 +352,13 @@ public class HttpServerResponse extends HttpServerBase {
* @param fileName 文件名 * @param fileName 文件名
* @since 5.2.6 * @since 5.2.6
*/ */
public void write(InputStream in, String contentType, String fileName) { public void write(InputStream in, String contentType, String fileName) {
final Charset charset = ObjectUtil.defaultIfNull(this.charset, DEFAULT_CHARSET); final Charset charset = ObjectUtil.defaultIfNull(this.charset, DEFAULT_CHARSET);
setHeader("Content-Disposition", StrUtil.format("attachment;filename={}", URLUtil.encode(fileName, charset)));
setContentType(contentType); if(false == contentType.startsWith("text/")){
write(in); // 非文本类型数据直接走下载
setHeader(Header.CONTENT_DISPOSITION, StrUtil.format("attachment;filename={}", URLUtil.encode(fileName, charset)));
}
write(in, contentType);
} }
} }

View File

@ -8,6 +8,7 @@ import cn.hutool.http.server.handler.ActionHandler;
import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer; import com.sun.net.httpserver.HttpServer;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
@ -73,6 +74,16 @@ public class SimpleServer {
* @return this * @return this
*/ */
public SimpleServer setRoot(String root) { public SimpleServer setRoot(String root) {
return setRoot(new File(root));
}
/**
* 设置根目录默认的页面从root目录中读取解析返回
*
* @param root 路径
* @return this
*/
public SimpleServer setRoot(File root) {
return addAction("/", new RootAction(root)); return addAction("/", new RootAction(root));
} }

View File

@ -2,6 +2,7 @@ package cn.hutool.http.server.action;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.http.server.HttpServerRequest; import cn.hutool.http.server.HttpServerRequest;
import cn.hutool.http.server.HttpServerResponse; import cn.hutool.http.server.HttpServerResponse;
@ -18,7 +19,7 @@ public class RootAction implements Action {
public static final String DEFAULT_INDEX_FILE_NAME = "index.html"; public static final String DEFAULT_INDEX_FILE_NAME = "index.html";
private final String rootDir; private final File rootDir;
private final List<String> indexFileNames; private final List<String> indexFileNames;
/** /**
@ -27,6 +28,15 @@ public class RootAction implements Action {
* @param rootDir 网页根目录 * @param rootDir 网页根目录
*/ */
public RootAction(String rootDir) { public RootAction(String rootDir) {
this(new File(rootDir));
}
/**
* 构造
*
* @param rootDir 网页根目录
*/
public RootAction(File rootDir) {
this(rootDir, DEFAULT_INDEX_FILE_NAME); this(rootDir, DEFAULT_INDEX_FILE_NAME);
} }
@ -37,6 +47,17 @@ public class RootAction implements Action {
* @param indexFileNames 主页文件名列表 * @param indexFileNames 主页文件名列表
*/ */
public RootAction(String rootDir, String... indexFileNames) { public RootAction(String rootDir, String... indexFileNames) {
this(new File(rootDir), indexFileNames);
}
/**
* 构造
*
* @param rootDir 网页根目录
* @param indexFileNames 主页文件名列表
* @since 5.4.0
*/
public RootAction(File rootDir, String... indexFileNames) {
this.rootDir = rootDir; this.rootDir = rootDir;
this.indexFileNames = CollUtil.toList(indexFileNames); this.indexFileNames = CollUtil.toList(indexFileNames);
} }
@ -59,6 +80,7 @@ public class RootAction implements Action {
} }
} }
Console.log(file.getAbsolutePath());
response.send404("404 Not Found !"); response.send404("404 Not Found !");
} }
} }

View File

@ -1,13 +1,15 @@
package cn.hutool.http.server; package cn.hutool.http.server;
import cn.hutool.core.swing.DesktopUtil;
import cn.hutool.http.ContentType;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
public class BlankServerTest { public class BlankServerTest {
public static void main(String[] args) { public static void main(String[] args) {
HttpUtil.createServer(8888) HttpUtil.createServer(8888)
.addAction("/", (req, res)->{ .addAction("/", (req, res)-> res.write("Hello Hutool Server", ContentType.JSON.getValue()))
res.write("Hello Hutool Server");
})
.start(); .start();
DesktopUtil.browse("http://localhost:8888/");
} }
} }

View File

@ -1,5 +1,6 @@
package cn.hutool.http.server; package cn.hutool.http.server;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Console; import cn.hutool.core.lang.Console;
import cn.hutool.core.net.multipart.UploadFile; import cn.hutool.core.net.multipart.UploadFile;
import cn.hutool.http.ContentType; import cn.hutool.http.ContentType;
@ -9,8 +10,8 @@ public class SimpleServerTest {
public static void main(String[] args) { public static void main(String[] args) {
HttpUtil.createServer(8888) HttpUtil.createServer(8888)
// 设置默认根目录 // 设置默认根目录classpath/html
.setRoot("d:/test") .setRoot(FileUtil.file("html"))
// get数据测试返回请求的PATH // get数据测试返回请求的PATH
.addAction("/get", (request, response) -> .addAction("/get", (request, response) ->
response.write(request.getURI().toString(), ContentType.TEXT_PLAIN.toString()) response.write(request.getURI().toString(), ContentType.TEXT_PLAIN.toString())
@ -24,9 +25,12 @@ public class SimpleServerTest {
.addAction("/formTest", (request, response) -> .addAction("/formTest", (request, response) ->
response.write(request.getParams().toString(), ContentType.TEXT_PLAIN.toString()) response.write(request.getParams().toString(), ContentType.TEXT_PLAIN.toString())
) )
// 文件上传测试 // 文件上传测试
// http://localhost:8888/formTest?a=1&a=2&b=3 // http://localhost:8888/formForUpload.html
.addAction("/file", (request, response) -> { .addAction("/file", (request, response) -> {
Console.log("Upload file...");
Console.log(request.getParams());
final UploadFile[] files = request.getMultipart().getFiles("file"); final UploadFile[] files = request.getMultipart().getFiles("file");
// 传入目录默认读取HTTP头中的文件名然后创建文件 // 传入目录默认读取HTTP头中的文件名然后创建文件
for (UploadFile file : files) { for (UploadFile file : files) {

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>文件上传表单提交</title>
</head>
<body>
<h1>文件上传测试</h1>
<form action="file" method="post" enctype="multipart/form-data">
文件:<input type="file" name="file"><br>
<input type="submit" />
</form>
</body>
</html>

View File

@ -0,0 +1,7 @@
<!DOCTYPE html>
<html class="no-js">
<body>
<h1>Hutool</h1>
<h3>Simple Server of Hutool</h3>
</body>
</html>