0
我开始实施示例服务器(以netty的形式)以支持100次继续。 当我通过RCF2616第8.2.3节时,我有些困惑。它说示例服务器支持100-继续
在接收其包括期望请求头 字段与“100-继续”期望,源服务器必须 或者与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);
}
}
}
RFC 2616已被废弃。您可能需要阅读。 –
谢谢,但我仍然不清楚'在发送100(继续)响应之前,原始服务器不能等待消息正文。“当前我的实现检查有效头并发送100或错误的请求 – user392919