Merge lp:~stevenk/launchpad/send-host-header-during-getremotebug into lp:launchpad

Proposed by Steve Kowalik on 2012-11-01
Status: Merged
Approved by: William Grant on 2012-11-01
Approved revision: no longer in the source branch.
Merged at revision: 16222
Proposed branch: lp:~stevenk/launchpad/send-host-header-during-getremotebug
Merge into: lp:launchpad
Diff against target: 152 lines (+32/-34)
2 files modified
lib/lp/bugs/externalbugtracker/base.py (+11/-19)
lib/lp/bugs/externalbugtracker/tests/test_externalbugtracker.py (+21/-15)
To merge this branch: bzr merge lp:~stevenk/launchpad/send-host-header-during-getremotebug
Reviewer Review Type Date Requested Status
William Grant code 2012-11-01 Approve on 2012-11-01
Review via email: mp+132447@code.launchpad.net

Description of the Change

Always send a Host header when we talk to remote bug trackers, so we can make use of virtually hosted bug trackers.

I have refactored some tests and destroyed what I considered pointless comments to claw back LoC.

To post a comment you must log in.
William Grant (wgrant) :
review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/bugs/externalbugtracker/base.py'
2--- lib/lp/bugs/externalbugtracker/base.py 2012-06-29 08:40:05 +0000
3+++ lib/lp/bugs/externalbugtracker/base.py 2012-11-01 04:48:20 +0000
4@@ -1,4 +1,4 @@
5-# Copyright 2009-2011 Canonical Ltd. This software is licensed under the
6+# Copyright 2009-2012 Canonical Ltd. This software is licensed under the
7 # GNU Affero General Public License version 3 (see the file LICENSE).
8
9 """External bugtrackers."""
10@@ -27,6 +27,7 @@
11
12 import urllib
13 import urllib2
14+from urlparse import urlparse
15
16 from zope.interface import implements
17
18@@ -48,10 +49,6 @@
19 BATCH_SIZE_UNLIMITED = 0
20
21
22-#
23-# Errors.
24-#
25-
26 class BugWatchUpdateError(Exception):
27 """Base exception for when we fail to update watches for a tracker."""
28
29@@ -96,10 +93,6 @@
30 """Launchpad couldn't authenticate with the remote bugtracker."""
31
32
33-#
34-# Warnings.
35-#
36-
37 class BugWatchUpdateWarning(Exception):
38 """An exception representing a warning.
39
40@@ -141,10 +134,6 @@
41 """Raised when a bug is marked private on the remote bugtracker."""
42
43
44-#
45-# Everything else.
46-#
47-
48 class ExternalBugTracker:
49 """Base class for an external bug tracker."""
50
51@@ -156,6 +145,7 @@
52
53 def __init__(self, baseurl):
54 self.baseurl = baseurl.rstrip('/')
55+ self.basehost = urlparse(baseurl).netloc
56 self.sync_comments = (
57 config.checkwatches.sync_comments and (
58 ISupportsCommentPushing.providedBy(self) or
59@@ -238,6 +228,11 @@
60 """
61 return None
62
63+ def _getHeaders(self):
64+ # For some reason, bugs.kde.org doesn't allow the regular urllib
65+ # user-agent string (Python-urllib/2.x) to access their bugzilla.
66+ return {'User-agent': LP_USER_AGENT, 'Host': self.basehost}
67+
68 def _fetchPage(self, page, data=None):
69 """Fetch a page from the remote server.
70
71@@ -250,16 +245,13 @@
72
73 def _getPage(self, page):
74 """GET the specified page on the remote HTTP server."""
75- # For some reason, bugs.kde.org doesn't allow the regular urllib
76- # user-agent string (Python-urllib/2.x) to access their
77- # bugzilla, so we send our own instead.
78- request = urllib2.Request("%s/%s" % (self.baseurl, page),
79- headers={'User-agent': LP_USER_AGENT})
80+ request = urllib2.Request(
81+ "%s/%s" % (self.baseurl, page), headers=self._getHeaders())
82 return self._fetchPage(request).read()
83
84 def _post(self, url, data):
85 """Post to a given URL."""
86- request = urllib2.Request(url, headers={'User-agent': LP_USER_AGENT})
87+ request = urllib2.Request(url, headers=self._getHeaders())
88 return self._fetchPage(request, data=data)
89
90 def _postPage(self, page, form, repost_on_redirect=False):
91
92=== modified file 'lib/lp/bugs/externalbugtracker/tests/test_externalbugtracker.py'
93--- lib/lp/bugs/externalbugtracker/tests/test_externalbugtracker.py 2012-01-01 02:58:52 +0000
94+++ lib/lp/bugs/externalbugtracker/tests/test_externalbugtracker.py 2012-11-01 04:48:20 +0000
95@@ -1,4 +1,4 @@
96-# Copyright 2010 Canonical Ltd. This software is licensed under the
97+# Copyright 2010-2012 Canonical Ltd. This software is licensed under the
98 # GNU Affero General Public License version 3 (see the file LICENSE).
99
100 """Test the externalbugtracker package."""
101@@ -13,6 +13,7 @@
102 from lp.bugs.externalbugtracker.base import (
103 BugTrackerConnectError,
104 ExternalBugTracker,
105+ LP_USER_AGENT,
106 )
107 from lp.bugs.externalbugtracker.debbugs import DebBugs
108 from lp.bugs.interfaces.externalbugtracker import (
109@@ -86,18 +87,12 @@
110 # When either sync_comments or sync_debbugs_comments is False
111 # (or both), the Debian Bugs external bug tracker will claim
112 # to not support any form of comment syncing.
113- self.pushConfig(
114- 'checkwatches', sync_comments=True, sync_debbugs_comments=False)
115- tracker = DebBugs(self.base_url)
116- self.assertFalse(tracker.sync_comments)
117- self.pushConfig(
118- 'checkwatches', sync_comments=False, sync_debbugs_comments=True)
119- tracker = DebBugs(self.base_url)
120- self.assertFalse(tracker.sync_comments)
121- self.pushConfig(
122- 'checkwatches', sync_comments=False, sync_debbugs_comments=False)
123- tracker = DebBugs(self.base_url)
124- self.assertFalse(tracker.sync_comments)
125+ for state in ((True, False), (False, True), (False, False)):
126+ self.pushConfig(
127+ 'checkwatches', sync_comments=state[0],
128+ sync_debbugs_comments=state[1])
129+ tracker = DebBugs(self.base_url)
130+ self.assertFalse(tracker.sync_comments)
131
132 def _makeFakePostForm(self, base_url, page=None):
133 """Create a fake `urllib2.urlopen` result."""
134@@ -168,5 +163,16 @@
135 with monkey_patch(urllib2, urlopen=raise404):
136 self.assertRaises(
137 BugTrackerConnectError,
138- bugtracker._post,
139- 'some-url', {'post-data': 'here'})
140+ bugtracker._post, 'some-url', {'post-data': 'here'})
141+
142+ def test_post_sends_host(self):
143+ # When posting, a Host header is sent.
144+ base_host = 'example.com'
145+ base_url = 'http://%s/' % base_host
146+ bugtracker = ExternalBugTracker(base_url)
147+ def assert_headers(request, data):
148+ self.assertContentEqual(
149+ [('User-agent', LP_USER_AGENT), ('Host', base_host)],
150+ request.header_items())
151+ with monkey_patch(urllib2, urlopen=assert_headers):
152+ bugtracker._post('some-url', {'post-data': 'here'})