示例服务器支持100-continue

时间:2015-09-28 05:13:43

标签: http http-headers netty

我开始实现一个示例服务器(在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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我认为“绝不能等待请求机构”非常清楚。身体不包括你的标题,所以我不确定你的混乱来自哪里......