2013-01-10 48 views
21

Hãy xem xét một yêu cầu HTTP lớn:Có thể chấp nhận máy chủ gửi phản hồi HTTP trước khi nhận được toàn bộ yêu cầu không?

POST /upload HTTP/1.1 
Content-Type: multipart/form-data 
Content-Length: 1048576 

... 

Các khách hàng bây giờ bắt đầu tải lên một megabyte dữ liệu, có thể mất một thời gian. Tuy nhiên, máy chủ xác định rằng ủy quyền HTTP là cần thiết, vì vậy nó quyết định nó sẽ phản hồi với HTTP 401 Unauthorized.

PHẢI đợi máy chủ cho đến khi nó nhận được toàn bộ yêu cầu (IE, tiêu đề + CRLF CRLF + Content-Length bytes) trước khi nó có thể phản hồi?

Trong điều kiện thực tế, hành vi đó có vi phạm bất kỳ trình duyệt nào không? Tuy nhiên, các trình duyệt có tiếp tục tải lên tệp hay không hoặc chúng sẽ ngừng truyền nếu chúng nhận được phản hồi 'sớm'?

Quan trọng hơn, trong trường hợp này, họ có thể xác thực thành công và bắt đầu lại tải lên (có bằng chứng xác thực) hay không đáng tin cậy để cắt tải lên như thế này?

+0

Bạn đã tìm ra câu trả lời chưa? –

+2

@DonghwanKim: Có, máy chủ HTTP hợp lệ để gửi phản hồi trước khi nhận được toàn bộ yêu cầu. Thật không may, [không có trình duyệt nào sẽ nhìn thấy phản hồi sớm và ngừng gửi yêu cầu] (http://stackoverflow.com/a/18370751/201952), chính nó có thể vi phạm RFC 2616 § 8.2.2. – josh3736

+0

Cảm ơn, rất tốt khi biết –

Trả lời

12

Nhìn vào RFC 2616 trong đó xác định các giao thức, tại Mục 8.2.2 Connections Giám sát cho Messages Lỗi Status, nó khẳng định

Một HTTP/1.1 (hoặc mới hơn) client gửi một thông điệp thân NÊN theo dõi kết nối mạng cho trạng thái lỗi trong khi đang truyền yêu cầu. Nếu khách hàng thấy một trạng thái lỗi, nó NÊN ngay lập tức ngừng truyền tải cơ thể.

Vì vậy, tôi sẽ nói rằng bạn có thể sử dụng để gửi lỗi 401. Và sau đó nhìn vào 10.4.2 401 Không được phép

Yêu cầu yêu cầu xác thực người dùng. Câu trả lời PHẢI bao gồm trường tiêu đề WWW-Authenticate (phần 14.47) có chứa một thách thức áp dụng cho tài nguyên được yêu cầu. Khách hàng CÓ THỂ lặp lại yêu cầu với trường tiêu đề Ủy quyền phù hợp

Các quốc gia mà khách hàng có thể thử lại với thông tin đăng nhập phù hợp.

Tôi chưa thực hiện bất kỳ thử nghiệm nào để xem cách trình duyệt thực sự hoạt động như thế nào.

+4

Tôi đã kết thúc [thử nghiệm hành vi này] (http://stackoverflow.com/a/18370751/201952) cho một vấn đề hơi khác và câu trả lời không phải là khá. Tất cả các trình duyệt sẽ không xử lý phản hồi sớm cho đến khi chúng hoàn tất việc gửi yêu cầu. – josh3736

+0

Được rồi, vì vậy RFC nói rằng khách hàng NÊN "ngừng truyền tải cơ thể". Nhưng máy chủ không thể biết được yêu cầu tiếp theo bắt đầu từ đâu, vì vậy máy khách "ngừng truyền" có nghĩa là ngắt kết nối, vì việc giữ liên tục đòi hỏi phải biết kết thúc yêu cầu. – DDS

+0

@DDS Câu trả lời đó sẽ trả lời một câu hỏi khác. Trình duyệt có thể cắt ngắn và thay thế bằng việc chấm dứt yêu cầu sớm không? –

Các vấn đề liên quan