2015-09-28 72 views
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); 
     } 
    } 
} 
+0

RFC 2616已被废弃。您可能需要阅读。 –

+0

谢谢,但我仍然不清楚'在发送100(继续)响应之前,原始服务器不能等待消息正文。“当前我的实现检查有效头并发送100或错误的请求 – user392919

回答

0

我觉得“肥水不等待请求体”是相当清楚的。身体不包括头部,所以我不知道你的困惑来自哪里...