2013-01-22 18 views
8

Nhiều thư viện bao gồm Expect: 100-continue trên tất cả các yêu cầu HTTP POST và PUT HTTP theo mặc định.Đầu đề rỗng "Mong đợi:" có ý nghĩa gì không?

Tôi dự định giảm độ trễ cảm nhận bằng cách xóa cơ chế 100 tiếp tục ở phía máy khách trên các yêu cầu mà tôi biết chi phí gửi dữ liệu ngay lập tức ít hơn chờ đợi một vòng cho 100 tiếp tục.

Tất nhiên tôi vẫn muốn tất cả các tính năng tuyệt vời khác của HTTP 1.1, do đó, tôi chỉ muốn tiêu đề Expect: 100-continue. Tôi có hai lựa chọn:

  • remove mong đợi tiêu đề hoàn toàn, hoặc
  • gửi rỗng mong đợi header, Expect:\r\n

Có bao giờ bất kỳ sự khác biệt giữa hai?

Bất kỳ phần mềm nào có thể bị hỏng đối với một hoặc khác?

Trả lời

9

Không có gì nên ngắt nếu bạn xóa tiêu đề Expect, nhưng tôi biết rằng Microsoft IIS đã gặp sự cố với 100 Continue trong quá khứ. Ví dụ: IIS5 always sends 100 continue responses. Vì vậy, tôi tự hỏi nếu ít nhất một số sử dụng của nó trong thư viện có thể là để làm việc xung quanh hành vi tương tự bị hỏng trong các máy chủ.

Nhiều thư viện dường như đặt tiêu đề này và sau đó không thực sự xử lý 100 Continue đúng cách - ví dụ: họ bắt đầu gửi yêu cầu ngay lập tức mà không cần chờ đợi 100 Continue và sau đó không xử lý thực tế là máy chủ có thể gửi lại bất kỳ mã lỗi HTTP nào trước khi họ gửi xong phần yêu cầu (phần đầu OK, đó là phần thứ hai bị hỏng - xem sau trong câu trả lời của tôi). Điều này khiến tôi tin rằng một số tác giả vừa sao chép từ những nơi khác mà không hiểu đầy đủ the subtleties.

Tôi không thể thấy bất kỳ lý do gì để bao gồm tiêu đề trống Expect - nếu bạn sẽ không bao gồm 100-continue (hoặc một số mệnh đề khác Expect) thì hãy bỏ qua tiêu đề hoàn toàn. Lý do duy nhất để bao gồm nó sẽ là để làm việc xung quanh máy chủ web bị hỏng, nhưng tôi không nhận thức được bất kỳ hành vi theo cách này. Cuối cùng, nếu bạn chỉ muốn giảm thời gian chờ khứ hồi, có vẻ như tôi sẽ không thực sự là không nhất quán với RFC chỉ đơn giản là bắt đầu truyền nội dung yêu cầu ngay lập tức. Bạn không phải chờ đợi vô thời hạn để gửi yêu cầu (theo số the RFC), vì vậy bạn đang xử lý thông số kỹ thuật - đó chỉ là thời gian chờ của bạn trước khi gửi đi là không. Bạn phải biết rằng các máy chủ có quyền tự do không gửi câu trả lời 100 Continue nếu họ đã nhận được một số phần yêu cầu, vì vậy bạn phải xử lý các máy chủ gửi 100 Continue, những máy chủ không gửi và đợi đầy đủ yêu cầu và những người gửi ngay bất kỳ mã lỗi HTTP nào (có thể là 417, nhưng nhiều khả năng là mã 4xx chung). Theo cách này, các yêu cầu ngắn của bạn không được có bất kỳ chi phí nào (ngoài tiêu đề Expect) nhưng bạn sẽ không phải đợi đến số 100 Continue. Tất nhiên, để phương pháp này hoạt động, bạn cần phải làm mọi thứ theo cách cho phép bạn ngắt yêu cầu ngay khi máy chủ trả về mã lỗi (ví dụ: IO không chặn với poll() hoặc select()).

Làm mọi thứ theo cách này có thể giúp giữ cho mã của bạn nhất quán hơn giữa các yêu cầu nhỏ và lớn trong khi giảm độ trễ. Nhược điểm là nó có lẽ không phải là những gì các tác giả RFC đã có trong tâm trí, ngay cả khi nó không rõ ràng vi phạm bất kỳ yêu cầu nào. Ngoài ra, nó có thể làm cho mã sau của bạn phức tạp hơn nếu bạn chưa làm IO không bị chặn hoặc tương tự.