2013-01-19 18 views
10

Sto scrivendo un test di riferimento per uno script di reindirizzamento.URL di query senza reindirizzamento in Go

I wisg il mio programma per interrogare determinati URL che reindirizza ad AppStore. Ma non desidero scaricare la pagina AppStore. Desidero solo registrare l'URL di reindirizzamento o l'errore.

Come si comunica a Vai all'URL della query senza seconda query di reindirizzamento?


UPDATE

Entrambe le risposte sono corrette, MA:

ho provato entrambe le soluzioni. Sto facendo un benchmarking. Eseguo 1 o più processi go con le routine 10 - 500 go. Esaminano l'URL in un ciclo. Anche il mio server è scritto in go. Segnala il numero di richieste ogni secondo.

  • Prima soluzione: http.DefaultTransport.RoundTrip - funziona lentamente, genera errori. I primi 4 secondi funzionano correttamente. Effettuando 300-500 query, le prestazioni scendono a 80 query al secondo.

scende poi a 0-5 interrogazione al secondo e queryies sceneggiatura iniziare a ricevere gli errori come

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. 

Credo che il collegamento riutilizzo che è chiuso.

  • Seconda soluzione: CheckRedirect field opere con prestazioni costanti. Non sono sicuro se riutilizza le connessioni o apre una nuova connessione per ogni richiesta. Creo client per ogni richiesta in un ciclo. È come si comporterà in una vita reale (ogni richiesta è una nuova connessione). C'è un modo per garantire che le connessioni siano chiuse dopo ogni query e non riutilizzate?

Ecco perché segnerò la seconda soluzione in quanto tale che rispondo alla mia domanda. Ma per la mia ricerca è molto importante che ogni query fosse una nuova connessione. Come posso assicurarmi con la seconda soluzione?

risposta

14

Per completezza, si può utilizzare un http.Client e non seguire i reindirizzamenti. http.Client ha un CheckRedirect field che è una funzione. Viene chiamato prima di seguire qualsiasi reindirizzamento.

Se questa funzione restituisce un errore, quindi httpClient.Do(...) sarà non seguire il reindirizzamento (vedi doFollowingRedirects() function in Go's source code) e invece restituisce un errore (il suo tipo concreto sarà url.Error, e il suo campo URL sarà il reindirizzamento a URL, alias il valore dell'intestazione Location, see this code).

È possibile vedere il mio gocrawl library per un esempio concreto di questo utilizzo.

+0

Grazie. È necessario garantire che la connessione venga chiusa dopo ogni richiesta?Desidero simulare un traffico enorme dai social network che deve essere reindirizzato in 1-5 minuti in base all'intestazione dell'agente. Quindi ogni utente esegue una query solo una volta e deve essere reindirizzato. (ovvero la connessione deve essere chiusa) – Max

+0

Non sono sicuro di voler creare un client personalizzato per uno strumento di test/benchmarking del carico. Suggerirei di usare qualcosa come Apache Bench (ab, http://httpd.apache.org/docs/2.2/programs/ab.html). – mna

+0

Conosco ab. Ma vorrei sapere Go networking migliore. Un corso così banale, così tante domande. Grazie – Max

19

È necessario utilizzare un http.Transport anziché un http.Client. Il trasporto è di livello inferiore e non segue i reindirizzamenti.

req, err := http.NewRequest("GET", "http://example.com/redirectToAppStore", nil) 
// ... 
resp, err := http.DefaultTransport.RoundTrip(req) 
Problemi correlati