Requests: рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЖрдИрдкреА рдХреЛ рдмрд╛рдВрдзрдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 27 рдЬрдире░ 2012  ┬╖  15рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: psf/requests

рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЖрдИрдкреА рдХреЛ рд╕реНрд░реЛрдд рдкрддреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдзреНрдп рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ (рдПрдХрд╛рдзрд┐рдХ рдЖрдИрдкреА рдкрддреЗ рд╡рд╛рд▓реЗ рдореЗрдЬрдмрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП)ред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

import socket
import urllib2
true_socket = socket.socket

def make_bound_socket(source_ip):
    def bound_socket(*a, **k):
        sock = true_socket(*a, **k)
        sock.bind((source_ip, 0))
        return sock
    return bound_socket

socket.socket = make_bound_socket('<some source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

socket.socket = make_bound_socket('<some other source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

рдпрджрд┐ рджреЛ рд╕реНрд░реЛрдд рдЖрдИрдкреА рдирдВрдмрд░реЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЯреНрд░реИрдлрд╝рд┐рдХ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдИрдкреА рдирдВрдмрд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдореВрд▓ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЗрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирдВрдмрд░реЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рднреА 15 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рджрд┐рд▓рдЪрд╕реНрдкред рдЖрдк рдЙрдкрдпреЛрдЧ рдХреА рдХрд▓реНрдкрдирд╛ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ?

^ рд╢рд╛рдЬрд╝реЛ/urllib3#9

рд▓рдХреНрд╖реНрдп рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рджреЗрд╢ рд╕реЗ рдЬреБрдбрд╝реЗ рдЖрдИрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд░реЙрд▓рд░ рд▓рд┐рдЦрдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреАрдЖрдИ рд╕реНрддрд░ рдкрд░ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ Host рд╢реАрд░реНрд╖рд▓реЗрдЦ рд╡рд╛рд▓реЗ IP рдХреЛ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рднреЗрдЬ рд╕рдХрддреЗ?

рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рд╡реЗрдм рд╕рд░реНрд╡рд░ рд▓реЙрдЧ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдИрдкреА рд╣реЛрдирд╛ рд╣реИ (рдЬрд┐рдпреЛрдЖрдИрдкреА рдЬреИрд╕реЗ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рджреЗрд╢ рдореЗрдВ рдЙрд▓рдЯрд╛ рд╣реЛрдирд╛)ред

рдореИрдВ рдЕрдиреБрд╕рд░рдг рдирд╣реАрдВ рдХрд░рддрд╛ред

>>> requests.get('http://184.106.67.239', headers={'host': 'ci.kennethreitz.com'})
<Response [200]>
import socket
import urllib2
true_socket = socket.socket

def make_bound_socket(source_ip):
    def bound_socket(*a, **k):
        sock = true_socket(*a, **k)
        sock.bind((source_ip, 0))
        return sock
    return bound_socket

socket.socket = make_bound_socket('<some source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

socket.socket = make_bound_socket('<some other source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

рдпрджрд┐ рджреЛ рд╕реНрд░реЛрдд рдЖрдИрдкреА рдирдВрдмрд░реЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЯреНрд░реИрдлрд╝рд┐рдХ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдИрдкреА рдирдВрдмрд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдореВрд▓ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЗрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирдВрдмрд░реЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред

рдЗрд╕рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк urlib3 рдХреЗ HttpConnectionPool рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрд╣рд╛рдВ рдирдпрд╛ httplib/http.client HttpConnections рдХрд╛рддрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк source_address рдореЗрдВ рдЬрд╛ рд╕рдХреЗрдВред рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд░реЛрдз рдореЙрдбрд▓ рдореЗрдВ рдЗрд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Google рд╕реЗ рдпрд╣рд╛рдВ рдЖрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ: https://github.com/shazow/urllib3/issues/9#issuecomment -15871420

рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрд╣ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╡реАрдкреАрдПрди рдХреЗ рдЕрдВрджрд░ рдореЗрдЬрдмрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдХрд╛рдлреА рдЬрд░реВрд░реА рд╣реИред

рд╡рд░реНрддрдорд╛рди рдФрд░ рджреВрд░рд╕реНрде рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдХрд┐рд╕реА рдХреЛ рдЕрдХреНрд╕рд░ рд╡реАрдкреАрдПрди рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдкрд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдЖрдИрдкреА рд╕реЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдпрд╛ рд░реВрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВред рдпрд╣ рдХрдо рд╕реЗ рдХрдо Mac рдкрд░ NetExtender рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдХрдИ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬреИрд╕реЗ ssh рдФрд░ рдХрд░реНрд▓ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ IP рдХреЛ рдЙрдкрдпреЛрдЧ/рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред

@petri рдЖрдкрдХрд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ рдпрд╣ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЕрдиреБрд░реЛрдз рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рджрд╛рдпрд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЗрдиреЗрде рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред =)

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдо рдЗрд╕реЗ рдореБрдЦреНрдп рдЕрдиреБрд░реЛрдз рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдЗрд╕реЗ рдЕрднреА рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдмрд╣реБрдд рдХрдард┐рди рднреА рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЪрд░реНрдЪрд╛ рдХрд╡рд░ рдХрд░рддреА рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред

рдЕрдЪреНрдЫрд╛ - рдореБрдЭреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдЙрд╕ рддрд░рд╣ рдХреЗ рддрдВрддреНрд░ рд╕реЗ рдЕрд╡рдЧрдд рдирд╣реАрдВ рдерд╛ред рдзрдиреНрдпрд╡рд╛рдж!

import socket
import urllib2
true_socket = socket.socket

def make_bound_socket(source_ip):
    def bound_socket(*a, **k):
        sock = true_socket(*a, **k)
        sock.bind((source_ip, 0))
        return sock
    return bound_socket

socket.socket = make_bound_socket('<some source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

socket.socket = make_bound_socket('<some other source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

рдпрджрд┐ рджреЛ рд╕реНрд░реЛрдд рдЖрдИрдкреА рдирдВрдмрд░реЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЯреНрд░реИрдлрд╝рд┐рдХ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдИрдкреА рдирдВрдмрд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдореВрд▓ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЗрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирдВрдмрд░реЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдмрд╕ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдореИрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЛ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдЦрдВрдЧрд╛рд▓ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рдерд╛ рдЬрд┐рд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред

https://toolbelt.readthedocs.io/en/latest/adapters.html#sourceaddressadapter рдореМрдЬреВрдж рд╣реИ рдФрд░ рд╣реИрдХ рд╕реЗ рдмрд╣реБрдд рдХрдо рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

iLaus picture iLaus  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jakul picture jakul  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

8key picture 8key  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Gonzalliz picture Gonzalliz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

thadeusb picture thadeusb  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ