HTTP服务增加OPTIONS配置项功能
This commit is contained in:
@@ -211,12 +211,14 @@
|
|||||||
如果addheader、setheader 的value值以request.parameters.开头则表示从request.parameters中获取对应的parameter值
|
如果addheader、setheader 的value值以request.parameters.开头则表示从request.parameters中获取对应的parameter值
|
||||||
如果addheader、setheader 的value值以request.headers.开头则表示从request.headers中获取对应的header值
|
如果addheader、setheader 的value值以request.headers.开头则表示从request.headers中获取对应的header值
|
||||||
例如下面例子是在Response输出header时添加两个header(一个addHeader, 一个setHeader)。
|
例如下面例子是在Response输出header时添加两个header(一个addHeader, 一个setHeader)。
|
||||||
|
options 节点: 设置了该节点却auto=true,当request的method=OPTIONS自动设置addheader、setheader并返回200状态码
|
||||||
-->
|
-->
|
||||||
<response>
|
<response>
|
||||||
<defcookie domain="" path=""/>
|
<defcookie domain="" path=""/>
|
||||||
<addheader name="Access-Control-Allow-Origin" value="request.headers.Origin" />
|
<addheader name="Access-Control-Allow-Origin" value="request.headers.Origin" />
|
||||||
<setheader name="Access-Control-Allow-Headers" value="request.headers.Access-Control-Request-Headers"/>
|
<setheader name="Access-Control-Allow-Headers" value="request.headers.Access-Control-Request-Headers"/>
|
||||||
<setheader name="Access-Control-Allow-Credentials" value="true"/>
|
<setheader name="Access-Control-Allow-Credentials" value="true"/>
|
||||||
|
<options auto="true" />
|
||||||
</response>
|
</response>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
|
|||||||
@@ -235,6 +235,10 @@ public class HttpPrepareServlet extends PrepareServlet<String, HttpContext, Http
|
|||||||
try {
|
try {
|
||||||
final String uri = request.getRequestURI();
|
final String uri = request.getRequestURI();
|
||||||
HttpServlet servlet;
|
HttpServlet servlet;
|
||||||
|
if (response.isAutoOptions() && "OPTIONS".equals(request.getMethod())) {
|
||||||
|
response.finish(200, null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (request.isWebSocket()) {
|
if (request.isWebSocket()) {
|
||||||
servlet = wsmappings.get(uri);
|
servlet = wsmappings.get(uri);
|
||||||
if (servlet == null && this.regWsArray != null) {
|
if (servlet == null && this.regWsArray != null) {
|
||||||
|
|||||||
@@ -125,17 +125,21 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
|
|||||||
|
|
||||||
private final String[][] defaultSetHeaders;
|
private final String[][] defaultSetHeaders;
|
||||||
|
|
||||||
|
private final boolean autoOptions;
|
||||||
|
|
||||||
private final HttpCookie defcookie;
|
private final HttpCookie defcookie;
|
||||||
|
|
||||||
public static ObjectPool<Response> createPool(AtomicLong creatCounter, AtomicLong cycleCounter, int max, Creator<Response> creator) {
|
public static ObjectPool<Response> createPool(AtomicLong creatCounter, AtomicLong cycleCounter, int max, Creator<Response> creator) {
|
||||||
return new ObjectPool<>(creatCounter, cycleCounter, max, creator, (x) -> ((HttpResponse) x).prepare(), (x) -> ((HttpResponse) x).recycle());
|
return new ObjectPool<>(creatCounter, cycleCounter, max, creator, (x) -> ((HttpResponse) x).prepare(), (x) -> ((HttpResponse) x).recycle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public HttpResponse(HttpContext context, HttpRequest request, String[][] defaultAddHeaders, String[][] defaultSetHeaders, HttpCookie defcookie) {
|
public HttpResponse(HttpContext context, HttpRequest request, String[][] defaultAddHeaders, String[][] defaultSetHeaders,
|
||||||
|
HttpCookie defcookie, boolean autoOptions) {
|
||||||
super(context, request);
|
super(context, request);
|
||||||
this.defaultAddHeaders = defaultAddHeaders;
|
this.defaultAddHeaders = defaultAddHeaders;
|
||||||
this.defaultSetHeaders = defaultSetHeaders;
|
this.defaultSetHeaders = defaultSetHeaders;
|
||||||
this.defcookie = defcookie;
|
this.defcookie = defcookie;
|
||||||
|
this.autoOptions = autoOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -185,6 +189,10 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
|
|||||||
this.servlet = servlet;
|
this.servlet = servlet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected boolean isAutoOptions() {
|
||||||
|
return this.autoOptions;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 增加Cookie值
|
* 增加Cookie值
|
||||||
*
|
*
|
||||||
@@ -439,6 +447,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
|
|||||||
if (isClosed()) return;
|
if (isClosed()) return;
|
||||||
if (this.recycleListener != null) this.output = obj;
|
if (this.recycleListener != null) this.output = obj;
|
||||||
if (obj == null || obj.isEmpty()) {
|
if (obj == null || obj.isEmpty()) {
|
||||||
|
this.contentLength = 0;
|
||||||
final ByteBuffer headbuf = createHeader();
|
final ByteBuffer headbuf = createHeader();
|
||||||
headbuf.flip();
|
headbuf.flip();
|
||||||
super.finish(headbuf);
|
super.finish(headbuf);
|
||||||
@@ -754,7 +763,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
|
|||||||
|
|
||||||
buffer.put(("Content-Type: " + (this.contentType == null ? "text/plain; charset=utf-8" : this.contentType) + "\r\n").getBytes());
|
buffer.put(("Content-Type: " + (this.contentType == null ? "text/plain; charset=utf-8" : this.contentType) + "\r\n").getBytes());
|
||||||
|
|
||||||
if (this.contentLength > 0) {
|
if (this.contentLength >= 0) {
|
||||||
buffer.put(("Content-Length: " + this.contentLength + "\r\n").getBytes());
|
buffer.put(("Content-Length: " + this.contentLength + "\r\n").getBytes());
|
||||||
}
|
}
|
||||||
if (!this.request.isKeepAlive()) {
|
if (!this.request.isKeepAlive()) {
|
||||||
|
|||||||
@@ -280,6 +280,8 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
});
|
});
|
||||||
final List<String[]> defaultAddHeaders = new ArrayList<>();
|
final List<String[]> defaultAddHeaders = new ArrayList<>();
|
||||||
final List<String[]> defaultSetHeaders = new ArrayList<>();
|
final List<String[]> defaultSetHeaders = new ArrayList<>();
|
||||||
|
boolean autoOptions = false;
|
||||||
|
|
||||||
HttpCookie defaultCookie = null;
|
HttpCookie defaultCookie = null;
|
||||||
String remoteAddrHeader = null;
|
String remoteAddrHeader = null;
|
||||||
if (config != null) {
|
if (config != null) {
|
||||||
@@ -342,10 +344,15 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
defaultCookie.setPath(path);
|
defaultCookie.setPath(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
AnyValue options = resps == null ? null : resps.getAnyValue("options");
|
||||||
|
autoOptions = options != null && options.getBoolValue("auto", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
final String[][] addHeaders = defaultAddHeaders.isEmpty() ? null : defaultAddHeaders.toArray(new String[defaultAddHeaders.size()][]);
|
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 String[][] setHeaders = defaultSetHeaders.isEmpty() ? null : defaultSetHeaders.toArray(new String[defaultSetHeaders.size()][]);
|
||||||
|
final boolean options = autoOptions;
|
||||||
|
|
||||||
final HttpCookie defCookie = defaultCookie;
|
final HttpCookie defCookie = defaultCookie;
|
||||||
final String addrHeader = remoteAddrHeader;
|
final String addrHeader = remoteAddrHeader;
|
||||||
AtomicLong createResponseCounter = new AtomicLong();
|
AtomicLong createResponseCounter = new AtomicLong();
|
||||||
@@ -353,7 +360,7 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
ObjectPool<Response> responsePool = HttpResponse.createPool(createResponseCounter, cycleResponseCounter, this.responsePoolSize, null);
|
ObjectPool<Response> responsePool = HttpResponse.createPool(createResponseCounter, cycleResponseCounter, this.responsePoolSize, null);
|
||||||
HttpContext httpcontext = new HttpContext(this.serverStartTime, this.logger, executor, rcapacity, bufferPool, responsePool,
|
HttpContext httpcontext = new HttpContext(this.serverStartTime, this.logger, executor, rcapacity, bufferPool, responsePool,
|
||||||
this.maxbody, this.charset, this.address, this.prepare, this.readTimeoutSecond, this.writeTimeoutSecond);
|
this.maxbody, this.charset, this.address, this.prepare, this.readTimeoutSecond, this.writeTimeoutSecond);
|
||||||
responsePool.setCreator((Object... params) -> new HttpResponse(httpcontext, new HttpRequest(httpcontext, addrHeader), addHeaders, setHeaders, defCookie));
|
responsePool.setCreator((Object... params) -> new HttpResponse(httpcontext, new HttpRequest(httpcontext, addrHeader), addHeaders, setHeaders, defCookie, options));
|
||||||
return httpcontext;
|
return httpcontext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user