]> granicus.if.org Git - python/commitdiff
Fix Issue8572 - httplib getheader() throws error instead of default
authorSenthil Kumaran <orsenthil@gmail.com>
Mon, 2 Aug 2010 11:04:58 +0000 (11:04 +0000)
committerSenthil Kumaran <orsenthil@gmail.com>
Mon, 2 Aug 2010 11:04:58 +0000 (11:04 +0000)
Doc/library/http.client.rst
Lib/http/client.py
Lib/test/test_httplib.py

index a29e3644a554a11b9952386a16aaa9f6ec2f36d9..be4b28a1022c5920f2d1c05cc06bbe04b3baeba9 100644 (file)
@@ -466,7 +466,8 @@ statement.
 .. method:: HTTPResponse.getheader(name, default=None)
 
    Get the contents of the header *name*, or *default* if there is no matching
-   header.
+   header. If *default* is an iterator other than a string, then the return
+   value will be a string consisting of items of the iterator joined by comma.
 
 
 .. method:: HTTPResponse.getheaders()
index e4a9c079d9326f678b47afaa0bd23fc1281e7143..d1d2bb9e060d65cf64ee71790b8ff6506a94fe53 100644 (file)
@@ -602,7 +602,11 @@ class HTTPResponse(io.RawIOBase):
     def getheader(self, name, default=None):
         if self.headers is None:
             raise ResponseNotReady()
-        return ', '.join(self.headers.get_all(name, default))
+        headers = self.headers.get_all(name) or default
+        if isinstance(headers, str) or not hasattr(headers, '__iter__'):
+            return headers
+        else:
+            return ', '.join(headers)
 
     def getheaders(self):
         """Return list of (header, value) tuples."""
index cf3a4024af4b88f51052047a7acaabaa84cf505c..e9d24ba541c64f36b399c9a44cc6374753378fb7 100644 (file)
@@ -442,9 +442,46 @@ class RequestBodyTest(TestCase):
         self.assertEqual("5", message.get("content-length"))
         self.assertEqual(b'body\xc1', f.read())
 
+
+class HTTPResponseTest(TestCase):
+
+    def setUp(self):
+        body = "HTTP/1.1 200 Ok\r\nMy-Header: first-value\r\nMy-Header: \
+                second-value\r\n\r\nText"
+        sock = FakeSocket(body)
+        self.resp = client.HTTPResponse(sock)
+        self.resp.begin()
+
+    def test_getting_header(self):
+        header = self.resp.getheader('My-Header')
+        self.assertEqual(header, 'first-value, second-value')
+
+        header = self.resp.getheader('My-Header', 'some default')
+        self.assertEqual(header, 'first-value, second-value')
+
+    def test_getting_nonexistent_header_with_string_default(self):
+        header = self.resp.getheader('No-Such-Header', 'default-value')
+        self.assertEqual(header, 'default-value')
+
+    def test_getting_nonexistent_header_with_iterable_default(self):
+        header = self.resp.getheader('No-Such-Header', ['default', 'values'])
+        self.assertEqual(header, 'default, values')
+
+        header = self.resp.getheader('No-Such-Header', ('default', 'values'))
+        self.assertEqual(header, 'default, values')
+
+    def test_getting_nonexistent_header_without_default(self):
+        header = self.resp.getheader('No-Such-Header')
+        self.assertEqual(header, None)
+
+    def test_getting_header_defaultint(self):
+        header = self.resp.getheader('No-Such-Header',default=42)
+        self.assertEqual(header, 42)
+
 def test_main(verbose=None):
     support.run_unittest(HeaderTests, OfflineTest, BasicTest, TimeoutTest,
-                         HTTPSTimeoutTest, RequestBodyTest, SourceAddressTest)
+                         HTTPSTimeoutTest, RequestBodyTest, SourceAddressTest,
+                         HTTPResponseTest)
 
 if __name__ == '__main__':
     test_main()