2014-11-18 36 views
5

Tôi có thiếu thứ gì đó ở đây hay đây là lỗi trong CookieContainer?Lỗi CookieContainer nghiêm trọng?

tôi thêm 3 cookie để container và sau đó tôi gọi hàm GetCookieHeader cho 2 url:

CookieContainer cc = new CookieContainer(); 

cc.Add(new Cookie("Cookie1", "1", "/a", "test.com")); 
cc.Add(new Cookie("Cookie2", "2", "https://stackoverflow.com/a/0/", "test.com")); 
cc.Add(new Cookie("Cookie3", "3", "https://stackoverflow.com/a/1/", "test.com")); 

var result1 = cc.GetCookieHeader(new Uri("http://test.com/a/1/list")); 
Assert.AreEqual("Cookie3=3; Cookie1=1", result1); 

var result2 = cc.GetCookieHeader(new Uri("http://test.com/a/0/list")); 
Assert.AreEqual("Cookie2=2; Cookie1=1", result2); 

Vấn đề là sự khẳng định cuối cùng mà ném một ngoại lệ như các tiêu đề trở lại chỉ là "Cookie2 = 2 ". Tôi không thấy bất kỳ lý do tại sao cookie Cookie1 được bỏ qua ở đó - theo RFC6265 nó sẽ trả lại hai cookie tương tự như xác nhận đầu tiên ở trên, phải không?

Một vài nhận xét:

  • Các cookie là tất cả trong container vì vậy nó không phải là thêm đó là vấn đề mà các chức năng GetHeader.

  • Hành vi này vẫn giữ nguyên khi thêm 4, 5 v.v. cookie: Chỉ một đường dẫn khớp với cookie được thêm gần đây sẽ bao gồm cookie cho đường dẫn cơ sở!

  • Thay đổi hành vi khi xóa tất cả "a" trong đường dẫn và chỉ sử dụng "/", "/ 0 /" và "/ 1 /" làm đường dẫn cho 3 cookie và "http://test.com/1/list" và "http://test.com/0/list" các url xác nhận). Tất cả các xác nhận sau đó thành công - tôi sẽ mong đợi cùng một hành vi với "a"!

PS: Hãy để tôi thêm phần có liên quan từ spec:

Yêu cầu-đường path-trận một cookie-con đường đưa ra nếu ít nhất một trong các điều kiện sau giữ:

- Đường dẫn cookie và đường dẫn yêu cầu giống hệt nhau.

- Đường dẫn cookie là tiền tố của đường dẫn yêu cầu và ký tự cuối cùng của đường dẫn cookie là% x2F ("/").

- Đường dẫn cookie là tiền tố của đường dẫn yêu cầu và ký tự đầu tiên của đường dẫn yêu cầu không được bao gồm trong đường dẫn cookie là ký tự% x2F ("/").

Vì vậy, với tôi điều này rõ ràng là một lỗi ...?

+2

Tôi khuyên bạn nên đơn giản hóa việc kiểm tra bằng cách xóa nội dung không cần thiết. Thật khó để hiểu ý bạn là gì. – usr

+0

Tôi đã cố gắng chia mã trên một số dòng khác để làm cho nó dễ đọc hơn. Nhưng không có gì không cần thiết trong nó vì vậy tôi không thể xóa bất cứ điều gì. – srudin

+2

Rút ngắn URL và tên. Xóa cookie JSESSIONID.Tại thời điểm này, người đọc phải tìm ra sự khác biệt 1 bit giữa các URL ... – usr

Trả lời

2

Tôi tin rằng tôi đã tìm thấy sự cố. Trong lớp System.Net.CookieContainer trong hàm InternalGetCookies (Uri) xung quanh các dòng 700-730 có một phép lặp qua các đường dẫn. Sau khi tìm thấy đường dẫn đầu tiên, các cookie đó được thêm vào và lặp lại sau đó bị ngắt và chỉ các giá trị cho "/" được bổ sung thêm!

Nói cách khác: Bạn chỉ nhận được cookie từ đường dẫn khớp đầu tiên và các cookie từ "/". Với tôi đây là một hành vi sai trái rõ ràng và do đó một lỗi - hoặc tôi không hiểu RFC tôi đã đề cập ở trên.

+0

Cảm ơn Jeroen - không tìm thấy bài đăng này. Vâng, rất có thể sẽ giống nhau. Tôi sẽ đóng cái này. – srudin

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