2015-09-28 82 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

我覺得「肥水不等待請求體」是相當清楚的。身體不包括頭部,所以我不知道你的困惑來自哪裏...