ho preso un approccio simile a https://stackoverflow.com/a/33046939/5059062, ma invece patchato la parte in socket
che rende le richieste DNS in modo che solo fa IPv6 o IPv4, per ogni richiesta, il che significa che questo può essere utilizzato in urllib
altrettanto efficacemente come in requests
.
Potrebbe non essere corretto se il programma utilizza anche pipe unix e altre cose simili, quindi raccomando cautela con monkeypatching.
import requests
import socket
from unittest.mock import patch
import re
orig_getaddrinfo = socket.getaddrinfo
def getaddrinfoIPv6(host, port, family=0, type=0, proto=0, flags=0):
return orig_getaddrinfo(host=host, port=port, family=socket.AF_INET6, type=type, proto=proto, flags=flags)
def getaddrinfoIPv4(host, port, family=0, type=0, proto=0, flags=0):
return orig_getaddrinfo(host=host, port=port, family=socket.AF_INET, type=type, proto=proto, flags=flags)
with patch('socket.getaddrinfo', side_effect=getaddrinfoIPv6):
r = requests.get('http://ip6.me')
print('ipv6: '+re.search(r'\+3>(.*?)</',r.content.decode('utf-8')).group(1))
with patch('socket.getaddrinfo', side_effect=getaddrinfoIPv4):
r = requests.get('http://ip6.me')
print('ipv4: '+re.search(r'\+3>(.*?)</',r.content.decode('utf-8')).group(1))
e senza requests
:
import urllib.request
import socket
from unittest.mock import patch
import re
orig_getaddrinfo = socket.getaddrinfo
def getaddrinfoIPv6(host, port, family=0, type=0, proto=0, flags=0):
return orig_getaddrinfo(host=host, port=port, family=socket.AF_INET6, type=type, proto=proto, flags=flags)
def getaddrinfoIPv4(host, port, family=0, type=0, proto=0, flags=0):
return orig_getaddrinfo(host=host, port=port, family=socket.AF_INET, type=type, proto=proto, flags=flags)
with patch('socket.getaddrinfo', side_effect=getaddrinfoIPv6):
r = urllib.request.urlopen('http://ip6.me')
print('ipv6: '+re.search(r'\+3>(.*?)</',r.read().decode('utf-8')).group(1))
with patch('socket.getaddrinfo', side_effect=getaddrinfoIPv4):
r = urllib.request.urlopen('http://ip6.me')
print('ipv4: '+re.search(r'\+3>(.*?)</',r.read().decode('utf-8')).group(1))
Testato 3.5.2
Siamo spiacenti, ho ancora una risposta IPv4. Ho provato 'print (requests.get ('https://icanhazip.com') .text)'. – ominug
Purtroppo, non ho accesso a nulla con ipv6 al momento; Ho aggiunto una dichiarazione di stampa e una dichiarazione di connessione solo per assicurarmi che non mi sia sfuggito qualcosa di come si parla di monkeypatching dell'oggetto HTTPConnection – Foon
Ok, l'ho provato di nuovo. Il metodo di connessione non viene chiamato. – ominug