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