2013-05-24 29 views
5

Là máy chủ HTTP 1.1, tôi trả lời yêu cầu GET với 200 mã trạng thái OK, sau đó bắt đầu gửi dữ liệu đến máy khách. Trong lần gửi này, lỗi xảy ra và tôi không thể hoàn thành.HTTP: lỗi trong khi trả lời sau 200 mã trạng thái OK

Tôi không thể gửi mã trạng thái mới làm mã trạng thái cuối cùng đã được gửi.

Tôi nên hành xử như thế nào để cho khách hàng biết đã xảy ra lỗi và tôi không thể tiếp tục yêu cầu HTTP này?

Tôi có thể nghĩ chỉ có một giải pháp: đóng socket, nhưng nó không hoàn hảo: nó phá vỡ tính năng tiếp tục, và không có giải thích rõ ràng về lỗi được đưa ra cho khách hàng.

Chuẩn HTTP dường như giả sử rằng máy chủ đã biết chính xác nội dung cần trả lời trước khi bắt đầu trả lời. Nhưng điều này không phải luôn luôn như vậy. Ví dụ: Tôi trả về một tệp rất lớn (vài GB) từ đĩa và tôi nhận được lỗi IO tại một số điểm trong khi đọc tệp. Ví dụ tương tự với một bãi chứa DB lớn.

Tôi không thể xây dựng toàn bộ phản hồi của mình trong bộ nhớ, sau đó gửi nó.

Tiêu chuẩn HTTP 1.1 giúp sử dụng như vậy với mã hóa chuyển đoạn: Tôi thậm chí không cần biết kích thước cuối cùng trước khi bắt đầu gửi trả lời. Vì vậy, việc sử dụng này không bị loại trừ khỏi HTTP 1.1.

+3

Có một tiêu đề Content-Length, khách hàng nên biết những gì số lượng dữ liệu nó là vụ phải nhận. Không thể nghĩ ra bất kỳ cách nào khác, nhưng tôi thừa nhận tôi không bao giờ kiểm tra xem có xảy ra sự cố sau khi tệp được truyền đi hay không, không có tiêu đề http "kết thúc truyền" nào mà tôi đã biết. Tôi sẽ đặt cược máy chủ không quan tâm anyway, đó là kinh doanh của khách hàng HTTP để xác minh, sau khi tất cả nó là khách hàng yêu cầu tài nguyên ban đầu. –

+0

_know_ bạn có nội dung trước khi gửi '200'. Có, bộ đệm tiêu thụ nhiều tài nguyên hơn (chủ yếu là bộ nhớ), nhưng sửa những thứ này. Và nhiều 'GB' hét lên với tôi' http' có thể là phương tiện giao thông không phù hợp .... – Wrikken

+0

@Piotr Wadas: Tiêu đề Nội dung Độ dài không thể trả lại nếu chúng tôi không biết kích thước trả lời trước. Mã hóa chuyển chunked tồn tại cho mục đích cụ thể đó, nhưng dường như không cung cấp một cách để nói "có một lỗi bây giờ". – user1409932

Trả lời

1

cuối cùng tôi đã tìm thấy một giải pháp khả thi cho việc này: HTTP 1.1 Trailer headers.

Trong phần thân được mã hóa chunked, HTTP 1.1 cho phép người gửi thêm dữ liệu sau đoạn cuối cùng (trống), dưới dạng một khối tiêu đề. Các đặc điểm kỹ thuật gợi ý một số trường hợp sử dụng như tính toán trên bay một md5 của cơ thể, và gửi nó sau khi cơ thể để khách hàng có thể kiểm tra tính toàn vẹn của nó.

Tôi nghĩ rằng nó có thể được sử dụng để báo cáo lỗi, ngay cả khi tôi không tìm thấy bất kỳ điều gì về loại sử dụng này.

Những vấn đề tôi thấy với điều này là:

  • này đòi hỏi phải sử dụng mã hóa chunked (nhưng nó không nhiều của một vấn đề)
  • trailer hỗ trợ có lẽ là rất thấp:
    • server-side (nó có thể được bỏ qua bằng cách tạo mã hóa chunked theo cách thủ công, nhưng vì nó được áp dụng sau khi mã hóa nội dung (gzip), nó sẽ yêu cầu nhiều lần thực hiện lại)
    • phía máy khách (lỗi chỉ được sửa trong 2010 in curl ví dụ)
    • và trên proxy (mà sau đó có thể mất các trailer nếu không được thực hiện đúng cách)