def test_redirect(self): from_url = "http://example.com/a.html" to_url = "http://example.com/b.html" h = HTTPRedirectHandler() o = h.parent = MockOpener() # ordinary redirect behaviour for code in 301, 302, 303, 307, "refresh": for data in None, "blah\nblah\n": method = getattr(h, "http_error_%s" % code) req = Request(from_url, data) req.add_header("Nonsense", "viking=withhold") req.add_unredirected_header("Spam", "spam") req.origin_req_host = "example.com" # XXX try: method(req, MockFile(), code, "Blah", MockHeaders({"location": to_url})) except urllib2.HTTPError: # 307 in response to POST requires user OK self.assert_(code == 307 and data is not None) self.assert_(o.req.get_full_url() == to_url) try: self.assert_(o.req.get_method() == "GET") except AttributeError: self.assert_(not o.req.has_data()) self.assert_(o.req.headers["Nonsense"] == "viking=withhold") self.assert_(not o.req.headers.has_key("Spam")) self.assert_(not o.req.unredirected_hdrs.has_key("Spam")) # loop detection def redirect(h, req, url=to_url): h.http_error_302(req, MockFile(), 302, "Blah", MockHeaders({"location": url})) # Note that the *original* request shares the same record of # redirections with the sub-requests caused by the redirections. # detect infinite loop redirect of a URL to itself req = Request(from_url) req.origin_req_host = "example.com" count = 0 try: while 1: redirect(h, req, "http://example.com/") count = count + 1 except urllib2.HTTPError: # don't stop until max_repeats, because cookies may introduce state self.assert_(count == HTTPRedirectHandler.max_repeats) # detect endless non-repeating chain of redirects req = Request(from_url) req.origin_req_host = "example.com" count = 0 try: while 1: redirect(h, req, "http://example.com/%d" % count) count = count + 1 except urllib2.HTTPError: self.assert_(count == HTTPRedirectHandler.max_redirections)
def test_referer(self): h = HTTPRefererProcessor() o = h.parent = MockOpener() # normal case url = "http://example.com/" req = Request(url) r = MockResponse(200, "OK", {}, "", url) newr = h.http_response(req, r) self.assert_(r is newr) self.assert_(h.referer == url) newreq = h.http_request(req) self.assert_(req is newreq) self.assert_(req.unredirected_hdrs["Referer"] == url) # don't clobber existing Referer ref = "http://set.by.user.com/" req.add_unredirected_header("Referer", ref) newreq = h.http_request(req) self.assert_(req is newreq) self.assert_(req.unredirected_hdrs["Referer"] == ref)
def test_http(self): h = AbstractHTTPHandler() o = h.parent = MockOpener() url = "http://example.com/" for method, data in [("GET", None), ("POST", "blah")]: req = Request(url, data, {"Foo": "bar"}) req.add_unredirected_header("Spam", "eggs") http = MockHTTPClass() r = h.do_open(http, req) # result attributes r.read; r.readline # wrapped MockFile methods r.info; r.geturl # addinfourl methods r.code, r.msg == 200, "OK" # added from MockHTTPClass.getreply() hdrs = r.info() hdrs.get; hdrs.has_key # r.info() gives dict from .getreply() self.assert_(r.geturl() == url) self.assert_(http.host == "example.com") self.assert_(http.level == 0) self.assert_(http.method == method) self.assert_(http.selector == "/") http.req_headers.sort() self.assert_(http.req_headers == [ ("Connection", "close"), ("Foo", "bar"), ("Spam", "eggs")]) self.assert_(http.data == data) # check socket.error converted to URLError http.raise_on_endheaders = True self.assertRaises(urllib2.URLError, h.do_open, http, req) # check adding of standard headers o.addheaders = [("Spam", "eggs")] for data in "", None: # POST, GET req = Request("http://example.com/", data) r = MockResponse(200, "OK", {}, "") newreq = h.do_request_(req) if data is None: # GET self.assert_(not req.unredirected_hdrs.has_key("Content-length")) self.assert_(not req.unredirected_hdrs.has_key("Content-type")) else: # POST # No longer true, due to workarouhd for buggy httplib # in Python versions < 2.4: #self.assert_(req.unredirected_hdrs["Content-length"] == "0") self.assert_(req.unredirected_hdrs["Content-type"] == "application/x-www-form-urlencoded") # XXX the details of Host could be better tested self.assert_(req.unredirected_hdrs["Host"] == "example.com") self.assert_(req.unredirected_hdrs["Spam"] == "eggs") # don't clobber existing headers req.add_unredirected_header("Content-length", "foo") req.add_unredirected_header("Content-type", "bar") req.add_unredirected_header("Host", "baz") req.add_unredirected_header("Spam", "foo") newreq = h.do_request_(req) self.assert_(req.unredirected_hdrs["Content-length"] == "foo") self.assert_(req.unredirected_hdrs["Content-type"] == "bar") self.assert_(req.unredirected_hdrs["Host"] == "baz") self.assert_(req.unredirected_hdrs["Spam"] == "foo")
def test_http(self): h = AbstractHTTPHandler() o = h.parent = MockOpener() url = "http://example.com/" for method, data in [("GET", None), ("POST", "blah")]: req = Request(url, data, {"Foo": "bar"}) req.add_unredirected_header("Spam", "eggs") http = MockHTTPClass() r = h.do_open(http, req) # result attributes r.read r.readline # wrapped MockFile methods r.info r.geturl # addinfourl methods r.code, r.msg == 200, "OK" # added from MockHTTPClass.getreply() hdrs = r.info() hdrs.get hdrs.has_key # r.info() gives dict from .getreply() self.assert_(r.geturl() == url) self.assert_(http.host == "example.com") self.assert_(http.level == 0) self.assert_(http.method == method) self.assert_(http.selector == "/") http.req_headers.sort() self.assert_( http.req_headers == [("Connection", "close"), ("Foo", "bar"), ("Spam", "eggs")]) self.assert_(http.data == data) # check socket.error converted to URLError http.raise_on_endheaders = True self.assertRaises(urllib2.URLError, h.do_open, http, req) # check adding of standard headers o.addheaders = [("Spam", "eggs")] for data in "", None: # POST, GET req = Request("http://example.com/", data) r = MockResponse(200, "OK", {}, "") newreq = h.do_request_(req) if data is None: # GET self.assert_( not req.unredirected_hdrs.has_key("Content-length")) self.assert_(not req.unredirected_hdrs.has_key("Content-type")) else: # POST # No longer true, due to workarouhd for buggy httplib # in Python versions < 2.4: #self.assert_(req.unredirected_hdrs["Content-length"] == "0") self.assert_(req.unredirected_hdrs["Content-type"] == "application/x-www-form-urlencoded") # XXX the details of Host could be better tested self.assert_(req.unredirected_hdrs["Host"] == "example.com") self.assert_(req.unredirected_hdrs["Spam"] == "eggs") # don't clobber existing headers req.add_unredirected_header("Content-length", "foo") req.add_unredirected_header("Content-type", "bar") req.add_unredirected_header("Host", "baz") req.add_unredirected_header("Spam", "foo") newreq = h.do_request_(req) self.assert_(req.unredirected_hdrs["Content-length"] == "foo") self.assert_(req.unredirected_hdrs["Content-type"] == "bar") self.assert_(req.unredirected_hdrs["Host"] == "baz") self.assert_(req.unredirected_hdrs["Spam"] == "foo")