我开始实现一个示例服务器(在netty中)以支持100继续。 当我走过RCF2616第8.2.3节时,我有些困惑。它说
收到包含Expect请求标头的请求后 字段与" 100-continue"期望,原始服务器必须 要么以100(继续)状态响应并继续阅读 来自输入流,或使用最终状态代码进行响应。该 源服务器在发送之前不得等待请求体 100(继续)回复。如果它以最终状态响应 代码,它可以关闭传输连接或它可以继续 阅读并放弃其余的请求。它绝不是 如果返回最终状态代码,则执行请求的方法。
是什么意思?在发送100(继续)响应之前,原始服务器不得等待请求正文。 我的服务器是否应首先验证标头然后发送100(继续)状态代码或立即发送100状态代码?
请澄清http服务器的实际行为以支持100继续
目前这是我的channelRead
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof HttpRequest) {
HttpRequest req = (HttpRequest) msg;
request = req;
if (req.getMethod() != HttpMethod.POST) {
FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, METHOD_NOT_ALLOWED);
ctx.write(response).addListener(ChannelFutureListener.CLOSE);
} else {
boolean valid = false;
for (Map.Entry<String, String> header : req.headers()) {
if (header.getKey().equals("my-special-header")) {
valid = true;
break;
}
}
if (!valid) {
FullHttpResponse resp = new DefaultFullHttpResponse(HTTP_1_1, BAD_REQUEST);
ctx.write(resp).addListener(ChannelFutureListener.CLOSE);
} else {
if (HttpHeaders.is100ContinueExpected(request)) {
ctx.write(new DefaultFullHttpResponse(HTTP_1_1, CONTINUE));
}
}
}
} else if (msg instanceof LastHttpContent && msg != LastHttpContent.EMPTY_LAST_CONTENT) {
DefaultLastHttpContent content = (DefaultLastHttpContent) msg;
System.out.println("content read");
FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, content.content());
response.headers().set(CONTENT_TYPE, "text/plain");
response.headers().set(CONTENT_LENGTH, response.content().readableBytes());
boolean keepAlive =HttpHeaders.isKeepAlive(request);
if (!keepAlive) {
ctx.write(response).addListener(ChannelFutureListener.CLOSE);
} else {
response.headers().set(CONNECTION, Values.KEEP_ALIVE);
ctx.write(response);
}
}
}
答案 0 :(得分:0)
我认为“绝不能等待请求机构”非常清楚。身体不包括你的标题,所以我不确定你的混乱来自哪里......