2013-01-19 27 views
10

Tôi đang viết một bài kiểm tra điểm chuẩn cho tập lệnh chuyển hướng.URL truy vấn không có chuyển hướng trong Go

Tôi tìm kiếm chương trình của mình để truy vấn một số URL nhất định chuyển hướng đến AppStore. Nhưng tôi không muốn tải xuống trang AppStore. Tôi chỉ muốn đăng nhập URL chuyển hướng hoặc lỗi.

Làm cách nào để tôi chuyển đến Truy vấn URL mà không có truy vấn chuyển hướng thứ hai?


CẬP NHẬT

Cả hai câu trả lời đều đúng NHƯNG:

tôi đã cố gắng cả hai giải pháp. Tôi đang làm điểm chuẩn. Tôi chạy 1 hoặc nhiều quá trình đi với 10 - 500 thói quen đi. Họ truy vấn URL trong một vòng lặp. Máy chủ của tôi cũng được viết khi đang di chuyển. Nó báo cáo số lượng yêu cầu mỗi giây.

  • Giải pháp đầu tiên: http.DefaultTransport.RoundTrip - hoạt động chậm, phát sinh lỗi. 4 giây đầu tiên hoạt động tốt. Thực hiện 300-500 truy vấn sau đó hiệu suất giảm xuống 80 truy vấn mỗi giây.

Sau đó giảm xuống còn 0-5 truy vấn mỗi giây và queryies kịch bản bắt đầu nhận lỗi như

dial tcp IP:80: A connection attempt failed because the connected 
party did not properly respond after a period of time, or established 
connection failed because connected host has failed to respond. 

Tôi đoán nó kết nối tái sử dụng mà được đóng lại.

  • Giải pháp thứ hai: CheckRedirect field hoạt động với hiệu suất không đổi. Tôi không chắc chắn nếu nó tái sử dụng các kết nối hoặc nó sẽ mở ra một kết nối mới cho mọi yêu cầu. Tôi tạo client cho mọi yêu cầu trong một vòng lặp. Nó là cách nó sẽ hành xử trong một cuộc sống thực (mỗi yêu cầu là một kết nối mới). Có cách nào để đảm bảo rằng các kết nối được đóng sau mỗi truy vấn và không được sử dụng lại?

Đó là lý do tại sao tôi sẽ đánh dấu giải pháp thứ hai để trả lời câu hỏi của tôi. Nhưng đối với nghiên cứu của tôi, điều quan trọng là mỗi truy vấn là một kết nối mới. Làm thế nào tôi có thể đảm bảo với giải pháp thứ hai?

Trả lời

14

Đối với đầy đủ sake, bạn có thể sử dụng một http.Client và không làm theo chuyển hướng. http.Client có một số CheckRedirect field là một hàm. Nó được gọi trước khi theo dõi bất kỳ chuyển hướng nào.

Nếu hàm này trả về một lỗi, sau đó httpClient.Do(...) sẽ không theo chuyển hướng (xem doFollowingRedirects() function in Go's source code) và thay vào đó sẽ trả về một lỗi (loại bê tông của nó sẽ url.Error, và lĩnh vực URL của nó sẽ được chuyển hướng đến URL, aka giá trị tiêu đề Vị trí, see this code).

Bạn có thể xem gocrawl library của tôi để biết ví dụ cụ thể về việc sử dụng này.

+0

Cảm ơn. Có phải đảm bảo rằng kết nối được đóng sau mỗi yêu cầu không?Tôi muốn mô phỏng lưu lượng truy cập khổng lồ từ mạng xã hội phải được định hướng lại trong 1-5 phút dựa trên tiêu đề Tác nhân. Vì vậy, mỗi người dùng chỉ truy vấn một lần và phải được chuyển hướng. (đó là kết nối phải được đóng) – Max

+0

Tôi không chắc chắn tôi sẽ tạo ra một khách hàng tùy chỉnh cho một công cụ kiểm tra/đo điểm tải. Tôi sẽ đề nghị sử dụng một cái gì đó như Apache Bench (ab, http://httpd.apache.org/docs/2.2/programs/ab.html). – mna

+0

Tôi biết ab. Nhưng tôi muốn biết mạng Go tốt hơn. Một trường hợp tầm thường như vậy rất nhiều câu hỏi. Cảm ơn – Max

19

Bạn cần sử dụng http.Transport thay vì http.Client. Giao thông vận tải là cấp thấp hơn và không làm theo chuyển hướng.

req, err := http.NewRequest("GET", "http://example.com/redirectToAppStore", nil) 
// ... 
resp, err := http.DefaultTransport.RoundTrip(req) 
Các vấn đề liên quan