Unikaj globalnych zmian openera urllib w testerach proxy
Trzymaj testy proxy urllib przy ich własnym openerze zamiast zastępować procesowe ustawienia domyślne routingu i limitów czasu.
from urllib.request import ProxyHandler, build_opener
def make_proxy_opener(proxy_uri):
return build_opener(ProxyHandler({
"http": proxy_uri,
"https": proxy_uri,
}))
opener = make_proxy_opener("http://proxy.example.net:8080")
# Use opener.open(destination, timeout=10) for this route.Wywołaj własną metodę open tego openera, gdy trasa należy do testu. Punkt końcowy HTTP z przykładu może pochodzić z Twojej usługi lub z listy proxy HTTP dla testów publicznych. Fragment ilustruje własność; nie definiuje pełnej polityki uwierzytelniania ani kondycji. Wszystkie programy obsługi specyficzne dla konta trzymaj podłączone do zamierzonego klienta.
urllib.request.install_opener() zmienia procesowe ustawienie domyślne używane przez późniejsze wywołania urlopen() na poziomie modułu. Tester przechodzący przez proxy może więc pozostawić niezwiązane żądania korzystające z jego ostatniego punktu końcowego. Tymczasowa instalacja i przywrócenie podczas sprzątania nadal pozwalają równoległym żądaniom działać podczas współdzielonej zmiany.
socket.setdefaulttimeout() podobnie zmienia ustawienia domyślne dla gniazd tworzonych później. Użyj limitu czasu na poziomie operacji, gdy tylko test ma go otrzymać.
Zamykaj odpowiedzi testu i utrzymuj wyniki konkretnymi: odpowiedź błędu HTTP nie jest automatycznie martwym nasłuchiwaczem proxy. Jeśli synchroniczny test urllib jest używany w usłudze asynchronicznej, przenieś blokującą pracę do odpowiedniego workera; ta decyzja wykonawcza nie czyni globalnej zmiany openera izolowaną.
Test powinien zwrócić swoją obserwację, nie zostawiając innej polityki sieciowej za sobą. Jego własny obiekt klienta i ograniczona operacja czynią tę granicę jawną.