修改net

This commit is contained in:
wentch
2016-01-18 17:27:53 +08:00
parent 56303246c7
commit 4bd12b4aba
8 changed files with 175 additions and 21 deletions

View File

@@ -21,7 +21,7 @@ import java.util.logging.*;
* @param <R> Request的子类型
* @param <P> Response的子类型
*/
public abstract class PrepareServlet<C extends Context, R extends Request<C>, P extends Response<R>> extends Servlet<C, R, P> {
public abstract class PrepareServlet<C extends Context, R extends Request<C>, P extends Response<C, R>> extends Servlet<C, R, P> {
protected final AtomicLong executeCounter = new AtomicLong(); //执行请求次数

View File

@@ -18,9 +18,9 @@ import java.util.function.*;
* @param <R> Request的子类型
*/
@SuppressWarnings("unchecked")
public abstract class Response<R extends Request> {
public abstract class Response<C extends Context, R extends Request<C>> {
protected final Context context;
protected final C context;
protected final R request;
@@ -28,7 +28,7 @@ public abstract class Response<R extends Request> {
private boolean inited = true;
protected BiConsumer<R, Response<R>> recycleListener;
protected BiConsumer<R, Response<C, R>> recycleListener;
private final CompletionHandler finishHandler = new CompletionHandler<Integer, ByteBuffer>() {
@@ -84,7 +84,7 @@ public abstract class Response<R extends Request> {
};
protected Response(Context context, final R request) {
protected Response(C context, final R request) {
this.context = context;
this.request = request;
}
@@ -137,7 +137,7 @@ public abstract class Response<R extends Request> {
this.request.createtime = System.currentTimeMillis();
}
public void setRecycleListener(BiConsumer<R, Response<R>> recycleListener) {
public void setRecycleListener(BiConsumer<R, Response<C, R>> recycleListener) {
this.recycleListener = recycleListener;
}
@@ -224,7 +224,7 @@ public abstract class Response<R extends Request> {
});
}
public Context getContext() {
public C getContext() {
return context;
}
}

View File

@@ -18,7 +18,7 @@ import java.io.IOException;
* @param <R> Request的子类型
* @param <P> Response的子类型
*/
public abstract class Servlet<C extends Context, R extends Request<C>, P extends Response<R>> {
public abstract class Servlet<C extends Context, R extends Request<C>, P extends Response<C, R>> {
public void init(C context, AnyValue config) {
}

View File

@@ -23,7 +23,7 @@ import org.redkale.watch.*;
*
* @author zhangjx
*/
public final class HttpPrepareServlet extends PrepareServlet<HttpContext, HttpRequest, HttpResponse<HttpRequest>> {
public final class HttpPrepareServlet extends PrepareServlet<HttpContext, HttpRequest, HttpResponse> {
private final List<HttpServlet> servlets = new ArrayList<>();

View File

@@ -441,7 +441,7 @@ public class HttpRequest extends Request<HttpContext> {
return host;
}
protected static InetSocketAddress parseSocketAddress(String host) {
protected InetSocketAddress parseSocketAddress(String host) {
if (host == null || host.isEmpty()) return null;
int pos = host.indexOf(':');
String hostname = pos < 0 ? host : host.substring(0, pos);

View File

@@ -32,7 +32,7 @@ import org.redkale.util.*;
*
* @param <R> HttpRequest的子类型
*/
public class HttpResponse<R extends HttpRequest> extends Response<R> {
public class HttpResponse extends Response<HttpContext, HttpRequest> {
/**
* HttpResponse.finish 方法内调用
@@ -131,7 +131,7 @@ public class HttpResponse<R extends HttpRequest> extends Response<R> {
return new ObjectPool<>(creatCounter, cycleCounter, max, creator, (x) -> ((HttpResponse) x).prepare(), (x) -> ((HttpResponse) x).recycle());
}
public HttpResponse(Context context, R request, String[][] defaultAddHeaders, String[][] defaultSetHeaders, HttpCookie defcookie) {
public HttpResponse(HttpContext context, HttpRequest request, String[][] defaultAddHeaders, String[][] defaultSetHeaders, HttpCookie defcookie) {
super(context, request);
this.defaultAddHeaders = defaultAddHeaders;
this.defaultSetHeaders = defaultSetHeaders;
@@ -160,6 +160,12 @@ public class HttpResponse<R extends HttpRequest> extends Response<R> {
super.init(channel);
}
/**
* 获取状态码对应的状态描述
*
* @param status 状态码
* @return 状态描述
*/
protected String getHttpCode(int status) {
return httpCodes.get(status);
}
@@ -173,11 +179,11 @@ public class HttpResponse<R extends HttpRequest> extends Response<R> {
return v == null ? defValue : v;
}
@Override
public HttpContext getContext() {
return (HttpContext) context;
}
/**
* 增加Cookie值
*
* @param cookies
*/
public void addCookie(HttpCookie... cookies) {
if (this.cookies == null) {
this.cookies = cookies;
@@ -189,31 +195,65 @@ public class HttpResponse<R extends HttpRequest> extends Response<R> {
}
}
/**
* 将对象以JSON格式输出
*
* @param obj 输出对象
*/
public void finishJson(final Object obj) {
this.contentType = "text/plain; charset=utf-8";
finish(request.getJsonConvert().convertTo(context.getBufferSupplier(), obj));
}
/**
* 将对象以JSON格式输出
*
* @param convert 指定的JsonConvert
* @param obj 输出对象
*/
public void finishJson(final JsonConvert convert, final Object obj) {
this.contentType = "text/plain; charset=utf-8";
finish(convert.convertTo(context.getBufferSupplier(), obj));
}
/**
* 将对象以JSON格式输出
*
* @param type 指定的类型
* @param obj 输出对象
*/
public void finishJson(final Type type, final Object obj) {
this.contentType = "text/plain; charset=utf-8";
finish(request.getJsonConvert().convertTo(context.getBufferSupplier(), type, obj));
}
/**
* 将对象以JSON格式输出
*
* @param convert 指定的JsonConvert
* @param type 指定的类型
* @param obj 输出对象
*/
public void finishJson(final JsonConvert convert, final Type type, final Object obj) {
this.contentType = "text/plain; charset=utf-8";
finish(convert.convertTo(context.getBufferSupplier(), type, obj));
}
/**
* 将对象以JSON格式输出
*
* @param objs 输出对象
*/
public void finishJson(final Object... objs) {
this.contentType = "text/plain; charset=utf-8";
finish(request.getJsonConvert().convertTo(context.getBufferSupplier(), objs));
}
/**
* 将指定字符串以响应结果输出
*
* @param obj 输出内容
*/
public void finish(String obj) {
if (obj == null || obj.isEmpty()) {
final ByteBuffer headbuf = createHeader();
@@ -248,25 +288,50 @@ public class HttpResponse<R extends HttpRequest> extends Response<R> {
}
}
/**
* 以指定响应码附带内容输出
*
* @param status 响应码
* @param message 输出内容
*/
public void finish(int status, String message) {
this.status = status;
if (status != 200) super.refuseAlive();
finish(message);
}
/**
* 以304状态码输出
*
*/
public void finish304() {
super.finish(buffer304.duplicate());
}
/**
* 以404状态码输出
*
*/
public void finish404() {
super.finish(buffer404.duplicate());
}
/**
* 将指定ByteBuffer按响应结果输出
*
* @param buffer 输出内容
*/
@Override
public void finish(ByteBuffer buffer) {
finish(false, buffer);
}
/**
* 将指定ByteBuffer按响应结果输出
*
* @param kill 输出后是否强制关闭连接
* @param buffer 输出内容
*/
@Override
public void finish(boolean kill, ByteBuffer buffer) {
if (!this.headsended) {
@@ -283,11 +348,22 @@ public class HttpResponse<R extends HttpRequest> extends Response<R> {
}
}
/**
* 将指定ByteBuffer数组按响应结果输出
*
* @param buffers 输出内容
*/
@Override
public void finish(ByteBuffer... buffers) {
finish(false, buffers);
}
/**
* 将指定ByteBuffer数组按响应结果输出
*
* @param kill 输出后是否强制关闭连接
* @param buffers 输出内容
*/
@Override
public void finish(boolean kill, ByteBuffer... buffers) {
if (bufferHandler != null) {
@@ -316,6 +392,14 @@ public class HttpResponse<R extends HttpRequest> extends Response<R> {
}
}
/**
* 异步输出指定内容
*
* @param <A> 泛型
* @param buffer 输出内容
* @param attachment 异步回调参数
* @param handler 异步回调函数
*/
public <A> void sendBody(ByteBuffer buffer, A attachment, CompletionHandler<Integer, A> handler) {
if (!this.headsended) {
if (this.contentLength < 0) this.contentLength = buffer == null ? 0 : buffer.remaining();
@@ -331,10 +415,21 @@ public class HttpResponse<R extends HttpRequest> extends Response<R> {
}
}
/**
* 将指定文件按响应结果输出
*
* @param file 输出文件
*/
public <A> void finish(File file) throws IOException {
finishFile(file, null);
}
/**
* 将指定文件句柄或文件内容按响应结果输出若fileBody不为null则只输出fileBody内容
*
* @param file 输出文件
* @param fileBody 文件内容, 没有则输出file
*/
protected <A> void finishFile(final File file, ByteBuffer fileBody) throws IOException {
if (file == null || !file.isFile() || !file.canRead()) {
finish404();
@@ -465,6 +560,11 @@ public class HttpResponse<R extends HttpRequest> extends Response<R> {
return sb;
}
/**
* 跳过header的输出
* 通常应用场景是调用者的输出内容里已经包含了HTTP的响应头信息因此需要调用此方法避免重复输出HTTP响应头信息。
*
*/
public void skipHeader() {
this.headsended = true;
}
@@ -473,42 +573,94 @@ public class HttpResponse<R extends HttpRequest> extends Response<R> {
return this.header.duplicate();
}
/**
* 设置Header值
*
* @param name header名
* @param value header值
*/
public void setHeader(String name, Object value) {
this.header.setValue(name, String.valueOf(value));
}
/**
* 添加Header值
*
* @param name header名
* @param value header值
*/
public void addHeader(String name, Object value) {
this.header.addValue(name, String.valueOf(value));
}
/**
* 设置状态码
*
* @param status 状态码
*/
public void setStatus(int status) {
this.status = status;
}
/**
* 获取状态码
*
* @return 状态码
*/
public int getStatus() {
return this.status;
}
/**
* 获取 ContentType
*
* @return ContentType
*/
public String getContentType() {
return contentType;
}
/**
* 设置 ContentType
*
* @param contentType ContentType
*/
public void setContentType(String contentType) {
this.contentType = contentType;
}
/**
* 获取内容长度
*
* @return 内容长度
*/
public long getContentLength() {
return contentLength;
}
/**
* 设置内容长度
*
* @param contentLength 内容长度
*/
public void setContentLength(long contentLength) {
this.contentLength = contentLength;
}
/**
* 获取输出时的拦截器
*
* @return 拦截器
*/
protected BufferHandler getBufferHandler() {
return bufferHandler;
}
/**
* 设置输出时的拦截器
*
* @param bufferHandler 拦截器
*/
protected void setBufferHandler(BufferHandler bufferHandler) {
this.bufferHandler = bufferHandler;
}

View File

@@ -15,7 +15,7 @@ import org.redkale.util.*;
*
* @author zhangjx
*/
public abstract class HttpServlet extends Servlet<HttpContext, HttpRequest, HttpResponse<HttpRequest>> {
public abstract class HttpServlet extends Servlet<HttpContext, HttpRequest, HttpResponse> {
AnyValue _conf; //当前HttpServlet的配置

View File

@@ -14,10 +14,12 @@ import org.redkale.util.*;
/**
*
* <p> 详情见: http://www.redkale.org
* <p>
* 详情见: http://www.redkale.org
*
* @author zhangjx
*/
public final class SncpResponse extends Response<SncpRequest> {
public final class SncpResponse extends Response<SncpContext, SncpRequest> {
public static final int RETCODE_ILLSERVICEID = (1 << 10); //无效serviceid
@@ -43,7 +45,7 @@ public final class SncpResponse extends Response<SncpRequest> {
return null;
}
protected SncpResponse(Context context, SncpRequest request) {
protected SncpResponse(SncpContext context, SncpRequest request) {
super(context, request);
this.addrBytes = context.getServerAddress().getAddress().getAddress();
this.addrPort = context.getServerAddress().getPort();