This commit is contained in:
Looly 2020-04-02 18:21:22 +08:00
parent 17be56a99c
commit f2b44605d0
6 changed files with 205 additions and 8 deletions

View File

@ -0,0 +1,32 @@
package cn.hutool.http.server;
import com.sun.net.httpserver.HttpExchange;
/**
* HttpServer公用对象提供HttpExchange包装和公用方法
*
* @author looly
* @since 5.2.6
*/
public class HttpServerBase {
final HttpExchange httpExchange;
/**
* 构造
*
* @param httpExchange {@link HttpExchange}
*/
public HttpServerBase(HttpExchange httpExchange) {
this.httpExchange = httpExchange;
}
/**
* 获取{@link HttpExchange}对象
*
* @return {@link HttpExchange}对象
*/
public HttpExchange getHttpExchange() {
return this.httpExchange;
}
}

View File

@ -28,9 +28,7 @@ import java.util.Map;
* @author looly
* @since 5.2.6
*/
public class HttpRequest {
private final HttpExchange httpExchange;
public class HttpServerRequest extends HttpServerBase{
private Map<String, HttpCookie> cookieCache;
@ -39,8 +37,8 @@ public class HttpRequest {
*
* @param httpExchange {@link HttpExchange}
*/
public HttpRequest(HttpExchange httpExchange) {
this.httpExchange = httpExchange;
public HttpServerRequest(HttpExchange httpExchange) {
super(httpExchange);
}
/**

View File

@ -0,0 +1,89 @@
package cn.hutool.http.server;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import com.sun.net.httpserver.HttpExchange;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* Http响应对象用于写出数据到客户端
*/
public class HttpServerResponse extends HttpServerBase{
/**
* 构造
*
* @param httpExchange {@link HttpExchange}
*/
public HttpServerResponse(HttpExchange httpExchange) {
super(httpExchange);
}
/**
* 发送HTTP状态码
*
* @param httpStatusCode HTTP状态码见HttpStatus
* @return this
*/
public HttpServerResponse send(int httpStatusCode) {
return send(httpStatusCode, 0);
}
/**
* 发送HTTP状态码
*
* @param httpStatusCode HTTP状态码见HttpStatus
* @param bodyLength 响应体长度默认0
* @return this
*/
public HttpServerResponse send(int httpStatusCode, long bodyLength) {
try {
this.httpExchange.sendResponseHeaders(httpStatusCode, bodyLength);
} catch (IOException e) {
throw new IORuntimeException(e);
}
return this;
}
/**
* 获取响应数据流
*
* @return 响应数据流
*/
public OutputStream getOut() {
return this.httpExchange.getResponseBody();
}
/**
* 写出数据到客户端
*
* @param data 数据
* @return this
*/
public HttpServerResponse write(byte[] data) {
write(new ByteArrayInputStream(data));
return this;
}
/**
* 写出数据到客户端
*
* @param in 数据流
* @return this
*/
public HttpServerResponse write(InputStream in) {
OutputStream out = null;
try {
out = getOut();
IoUtil.copy(in, out);
} finally {
IoUtil.close(out);
IoUtil.close(in);
}
return this;
}
}

View File

@ -1,6 +1,9 @@
package cn.hutool.http.server;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.http.server.action.Action;
import cn.hutool.http.server.handler.ActionHandler;
import cn.hutool.http.server.handler.RootHandler;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
@ -53,7 +56,7 @@ public class SimpleServer {
/**
* 增加请求处理规则
*
* @param path 路径
* @param path 路径
* @param handler 处理器
* @return this
*/
@ -62,6 +65,27 @@ public class SimpleServer {
return this;
}
/**
* 设置根目录默认的页面从root目录中读取解析返回
*
* @param root 路径
* @return this
*/
public SimpleServer setRoot(String root) {
return addHandler("/", new RootHandler(root));
}
/**
* 增加请求处理规则
*
* @param path 路径
* @param action 处理器
* @return this
*/
public SimpleServer addAction(String path, Action action) {
return addHandler(path, new ActionHandler(action));
}
/**
* 设置自定义线程池
*
@ -78,7 +102,7 @@ public class SimpleServer {
*
* @return {@link HttpServer}
*/
public HttpServer getRawServer(){
public HttpServer getRawServer() {
return this.server;
}
@ -87,7 +111,7 @@ public class SimpleServer {
*
* @return {@link InetSocketAddress}
*/
public InetSocketAddress getAddress(){
public InetSocketAddress getAddress() {
return this.server.getAddress();
}

View File

@ -0,0 +1,22 @@
package cn.hutool.http.server.action;
import cn.hutool.http.server.HttpServerRequest;
import cn.hutool.http.server.HttpServerResponse;
/**
* 请求处理接口<br>
* 当用户请求某个Path则调用相应Action的doAction方法
*
* @author Looly
* @since 5.2.6
*/
public interface Action {
/**
* 处理请求
*
* @param request 请求对象
* @param response 响应对象
*/
void doAction(HttpServerRequest request, HttpServerResponse response);
}

View File

@ -0,0 +1,32 @@
package cn.hutool.http.server.handler;
import cn.hutool.http.server.HttpServerRequest;
import cn.hutool.http.server.HttpServerResponse;
import cn.hutool.http.server.action.Action;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
/**
* Action处理器用于将HttpHandler转换为Action形式
*
* @author looly
* @since 5.2.6
*/
public class ActionHandler implements HttpHandler {
private final Action action;
/**
* 构造
*
* @param action Action
*/
public ActionHandler(Action action) {
this.action = action;
}
@Override
public void handle(HttpExchange httpExchange) {
action.doAction(new HttpServerRequest(httpExchange), new HttpServerResponse(httpExchange));
}
}