This commit is contained in:
@@ -237,7 +237,10 @@
|
||||
如果addheader、setheader 的value值以request.headers.开头则表示从request.headers中获取对应的header值
|
||||
例如下面例子是在Response输出header时添加两个header(一个addHeader, 一个setHeader)。
|
||||
options 节点: 设置了该节点且auto=true,当request的method=OPTIONS自动设置addheader、setheader并返回200状态码
|
||||
date 节点: 设置了该节点且auto=true,返回response会包含Date头信息,默认为auto=true
|
||||
date 节点: 设置了该节点且period有值(单位:毫秒);返回response会包含Date头信息,默认为period=0
|
||||
period=0表示实时获取当前时间;
|
||||
period<0表示不设置date;
|
||||
period>0表示定时获取时间; 设置1000表示每秒刷新Date时间
|
||||
-->
|
||||
<response>
|
||||
<contenttype plain="text/plain; charset=utf-8" json="application/json; charset=utf-8"/>
|
||||
@@ -246,7 +249,7 @@
|
||||
<setheader name="Access-Control-Allow-Headers" value="request.headers.Access-Control-Request-Headers"/>
|
||||
<setheader name="Access-Control-Allow-Credentials" value="true"/>
|
||||
<options auto="true" />
|
||||
<date auto="true" />
|
||||
<date period="0" />
|
||||
</response>
|
||||
<!--
|
||||
【节点在<server>中唯一】
|
||||
|
||||
@@ -134,7 +134,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
|
||||
|
||||
private final boolean autoOptions;
|
||||
|
||||
private final boolean autoDate;
|
||||
private final Supplier<String> dateSupplier;
|
||||
|
||||
private final HttpCookie defcookie;
|
||||
|
||||
@@ -151,7 +151,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
|
||||
public HttpResponse(HttpContext context, HttpRequest request,
|
||||
String plainContentType, String jsonContentType,
|
||||
String[][] defaultAddHeaders, String[][] defaultSetHeaders,
|
||||
HttpCookie defcookie, boolean autoOptions, boolean autoDate, List< HttpRender> renders) {
|
||||
HttpCookie defcookie, boolean autoOptions, Supplier<String> dateSupplier, List< HttpRender> renders) {
|
||||
super(context, request);
|
||||
this.plainContentType = plainContentType == null || plainContentType.isEmpty() ? "text/plain; charset=utf-8" : plainContentType;
|
||||
this.jsonContentType = jsonContentType == null || jsonContentType.isEmpty() ? "application/json; charset=utf-8" : jsonContentType;
|
||||
@@ -161,7 +161,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
|
||||
this.defaultSetHeaders = defaultSetHeaders;
|
||||
this.defcookie = defcookie;
|
||||
this.autoOptions = autoOptions;
|
||||
this.autoDate = autoDate;
|
||||
this.dateSupplier = dateSupplier;
|
||||
this.renders = renders;
|
||||
this.hasRender = renders != null && !renders.isEmpty();
|
||||
this.onlyoneHttpRender = renders != null && renders.size() == 1 ? renders.get(0) : null;
|
||||
@@ -874,7 +874,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
|
||||
buffer.put(("Content-Type: " + (this.contentType == null ? this.plainContentType : this.contentType) + "\r\n").getBytes());
|
||||
}
|
||||
buffer.put(serverNameBytes);
|
||||
if (autoDate) buffer.put(("Date: " + RFC_1123_DATE_TIME.format(java.time.ZonedDateTime.now(ZONE_GMT)) + "\r\n").getBytes());
|
||||
if (dateSupplier != null) buffer.put(("Date: " + dateSupplier.get() + "\r\n").getBytes());
|
||||
buffer.put(this.request.isKeepAlive() ? connectAliveBytes : connectCloseBytes);
|
||||
|
||||
if (this.defaultAddHeaders != null) {
|
||||
|
||||
@@ -8,8 +8,13 @@ package org.redkale.net.http;
|
||||
import java.lang.reflect.Field;
|
||||
import java.net.HttpCookie;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.text.*;
|
||||
import java.time.ZoneId;
|
||||
import static java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.*;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.logging.Level;
|
||||
import org.redkale.net.*;
|
||||
import org.redkale.net.sncp.Sncp;
|
||||
@@ -26,6 +31,10 @@ import org.redkale.util.*;
|
||||
*/
|
||||
public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpResponse, HttpServlet> {
|
||||
|
||||
private ScheduledThreadPoolExecutor dateScheduler;
|
||||
|
||||
private String currDateString;
|
||||
|
||||
public HttpServer() {
|
||||
this(System.currentTimeMillis(), ResourceFactory.root());
|
||||
}
|
||||
@@ -43,6 +52,15 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
||||
super.init(config);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroy(final AnyValue config) throws Exception {
|
||||
super.destroy(config);
|
||||
if (this.dateScheduler != null) {
|
||||
this.dateScheduler.shutdownNow();
|
||||
this.dateScheduler = null;
|
||||
}
|
||||
}
|
||||
|
||||
public List<HttpServlet> getHttpServlets() {
|
||||
return this.prepare.getServlets();
|
||||
}
|
||||
@@ -295,7 +313,7 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
||||
final List<String[]> defaultAddHeaders = new ArrayList<>();
|
||||
final List<String[]> defaultSetHeaders = new ArrayList<>();
|
||||
boolean autoOptions = false;
|
||||
boolean autoDate = true;
|
||||
int datePeriod = 0;
|
||||
String plainContentType = null;
|
||||
String jsonContentType = null;
|
||||
HttpCookie defaultCookie = null;
|
||||
@@ -369,7 +387,7 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
||||
autoOptions = options != null && options.getBoolValue("auto", false);
|
||||
|
||||
AnyValue dates = resps == null ? null : resps.getAnyValue("date");
|
||||
autoDate = dates == null || dates.getBoolValue("auto", true);
|
||||
datePeriod = dates == null ? 0 : dates.getIntValue("period", 0);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -378,10 +396,30 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
||||
final String[][] addHeaders = defaultAddHeaders.isEmpty() ? null : defaultAddHeaders.toArray(new String[defaultAddHeaders.size()][]);
|
||||
final String[][] setHeaders = defaultSetHeaders.isEmpty() ? null : defaultSetHeaders.toArray(new String[defaultSetHeaders.size()][]);
|
||||
final boolean options = autoOptions;
|
||||
final boolean adate = autoDate;
|
||||
Supplier<String> dateSupplier0 = null;
|
||||
if (datePeriod == 0) {
|
||||
final ZoneId gmtZone = ZoneId.of("GMT");
|
||||
dateSupplier0 = () -> RFC_1123_DATE_TIME.format(java.time.ZonedDateTime.now(gmtZone));
|
||||
} else if (datePeriod > 0) {
|
||||
if (this.dateScheduler == null) {
|
||||
this.dateScheduler = new ScheduledThreadPoolExecutor(1, (Runnable r) -> {
|
||||
final Thread t = new Thread(r, "HTTP:" + port + "-DateSchedule-Thread");
|
||||
t.setDaemon(true);
|
||||
return t;
|
||||
});
|
||||
final DateFormat gmtDateFormat = new SimpleDateFormat("EEE, dd-MMM-yyyy HH:mm:ss z", Locale.ENGLISH);
|
||||
gmtDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
|
||||
currDateString = gmtDateFormat.format(new Date());
|
||||
this.dateScheduler.scheduleAtFixedRate(() -> {
|
||||
currDateString = gmtDateFormat.format(new Date());
|
||||
}, 1000 - System.currentTimeMillis() % 1000, datePeriod, TimeUnit.MILLISECONDS);
|
||||
dateSupplier0 = () -> currDateString;
|
||||
}
|
||||
}
|
||||
|
||||
final HttpCookie defCookie = defaultCookie;
|
||||
final String addrHeader = remoteAddrHeader;
|
||||
final Supplier<String> dateSupplier = dateSupplier0;
|
||||
AtomicLong createResponseCounter = new AtomicLong();
|
||||
AtomicLong cycleResponseCounter = new AtomicLong();
|
||||
ObjectPool<Response> responsePool = HttpResponse.createPool(createResponseCounter, cycleResponseCounter, this.responsePoolSize, null);
|
||||
@@ -389,7 +427,7 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
||||
rcapacity, bufferPool, responsePool, this.maxbody, this.charset, this.address, this.resourceFactory,
|
||||
this.prepare, this.aliveTimeoutSeconds, this.readTimeoutSeconds, this.writeTimeoutSeconds);
|
||||
responsePool.setCreator((Object... params) -> new HttpResponse(httpcontext, new HttpRequest(httpcontext, addrHeader),
|
||||
plainType, jsonType, addHeaders, setHeaders, defCookie, options, adate, ((HttpPrepareServlet) prepare).renders));
|
||||
plainType, jsonType, addHeaders, setHeaders, defCookie, options, dateSupplier, ((HttpPrepareServlet) prepare).renders));
|
||||
return httpcontext;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user