因为我们这里使用的是requests模块中的Session.request方法进行API调用,所以这里只分析requests模块中的url解析。
在requests/sessions.py中Session类的request方法,会根据传递传递参数初始化一个Request对象,并调用self.prepare_request方法对该对象进行处理,返回一个PreparedRequest对象,后面则是根据这个PreparedRequest对象进行请求的发送:
在prepare_request方法中,会调用PrepareRequest对象的prepare方法进行处理:
PreparedRequest的初始化方法定义为:
在requests/models.py中PreparedRequest类的prepare方法中,会调用self.prepare_url进行url解析
在requests/models.py中PreparedRequest类的prepare_url方法里,先调用parse_url进行url解析,返回对应的host、port、schema、path等信息,最后再通过urlunparse反向组装成新的url,并更新到self.url中
在urllib3/util/url.py中的parse_url方法里,最终返回一个Url对象:
在urllib3/util/url.py中的Url类的构造方法中,将host进行了小写处理: