Force requests to use IPv4 / IPv6

后端 未结 6 906
走了就别回头了
走了就别回头了 2020-12-01 14:58

How to force the requests library to use a specific internet protocol version for a get request? Or can this be achieved better with another method in Python? I

6条回答
  •  旧巷少年郎
    2020-12-01 15:24

    I took a similar approach to https://stackoverflow.com/a/33046939/5059062, but instead patched out the part in socket that makes DNS requests so it only does IPv6 or IPv4, for every request, which means this can be used in urllib just as effectively as in requests.

    This might be bad if your program also uses unix pipes and other such things, so I urge caution with 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>(.*?)(.*?)

    and without 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>(.*?)(.*?)

    Tested in 3.5.2

提交回复
热议问题