)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"dc158ff04f649a1b1514a3964a174a5295485a24","unresolved":false,"context_lines":[{"line_number":26,"context_line":"unable to figure out why the drop happened. Most likely coverage"},{"line_number":27,"context_line":"simply lied about the previous percentages and getting rid of"},{"line_number":28,"context_line":"import webob permitted it a better analysis. So, we add some"},{"line_number":29,"context_line":"unrelated tests to bump coverage percentages up."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"This version also adds comments rather than docstrings, because"},{"line_number":32,"context_line":"they need to source as context."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"AAAAQn%2F%2F3DU%3D","line":29,"updated":"2013-07-21 14:58:05.000000000","message":"please don\u0027t add unrelated changes to this patch. If this change has to be reverted then we\u0027ll also lose the useful tests that were added.","commit_id":"35e03d0014626b499b6864f956b772e7cb38e77a"}],"keystoneclient/middleware/auth_token.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"6e1c3bc3c7642678f446988a1060204c550200da","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class MiniResp(object):"},{"line_number":255,"context_line":"    def __init__(self, msg, env, hdrs):"},{"line_number":256,"context_line":"        if env[\u0027REQUEST_METHOD\u0027] \u003d\u003d \u0027HEAD\u0027:"},{"line_number":257,"context_line":"            self.body \u003d [\u0027\u0027]"},{"line_number":258,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FhjU%3D","line":255,"updated":"2013-06-28 15:07:00.000000000","message":"make headers optional and initialize it to an empty list if it\u0027s not provided\n\ni\u0027d also suggest naming these a little more verbosely... \u0027hdrs\u0027, especially, is needlessly shorthand","commit_id":"c02cda1b9463980f1a8a361aa1f3c38e29b56447"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4a6610d6d95dfdffa936a9ec38f4a6e3863dd562","unresolved":false,"context_lines":[{"line_number":483,"context_line":""},{"line_number":484,"context_line":"        except ServiceError as e:"},{"line_number":485,"context_line":"            self.LOG.critical(\u0027Unable to obtain admin token: %s\u0027 % e)"},{"line_number":486,"context_line":"            resp \u003d MiniResp(\u0027503: Unable to obtain admin token\u0027, env, [])"},{"line_number":487,"context_line":"            start_response(\u0027503 Service Unavailable\u0027, resp.headers)"},{"line_number":488,"context_line":"            return resp.body"},{"line_number":489,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fjyc%3D","line":486,"updated":"2013-06-27 19:43:18.000000000","message":"Before this change, it looks like the server would just respond with a 503 and no body explaining the problem. We shouldn\u0027t be giving an attacker any information if we can avoid it, so I suggest change this so that the body doesn\u0027t have any extra info like it did before.","commit_id":"c02cda1b9463980f1a8a361aa1f3c38e29b56447"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"100111b02b539d171d9264d0e878acf49e321003","unresolved":false,"context_lines":[{"line_number":483,"context_line":""},{"line_number":484,"context_line":"        except ServiceError as e:"},{"line_number":485,"context_line":"            self.LOG.critical(\u0027Unable to obtain admin token: %s\u0027 % e)"},{"line_number":486,"context_line":"            resp \u003d MiniResp(\u0027503: Unable to obtain admin token\u0027, env, [])"},{"line_number":487,"context_line":"            start_response(\u0027503 Service Unavailable\u0027, resp.headers)"},{"line_number":488,"context_line":"            return resp.body"},{"line_number":489,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FjrY%3D","line":486,"in_reply_to":"AAAAPn%2F%2Fjsc%3D","updated":"2013-06-27 20:13:20.000000000","message":"I\u0027m fine with imitating the generic service unavailable body as it was before","commit_id":"c02cda1b9463980f1a8a361aa1f3c38e29b56447"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"87f4cd069af88fee1186686be7248cd7bfbed1df","unresolved":false,"context_lines":[{"line_number":483,"context_line":""},{"line_number":484,"context_line":"        except ServiceError as e:"},{"line_number":485,"context_line":"            self.LOG.critical(\u0027Unable to obtain admin token: %s\u0027 % e)"},{"line_number":486,"context_line":"            resp \u003d MiniResp(\u0027503: Unable to obtain admin token\u0027, env, [])"},{"line_number":487,"context_line":"            start_response(\u0027503 Service Unavailable\u0027, resp.headers)"},{"line_number":488,"context_line":"            return resp.body"},{"line_number":489,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fjsc%3D","line":486,"in_reply_to":"AAAAPn%2F%2Fjyc%3D","updated":"2013-06-27 20:09:50.000000000","message":"It was my impression WebOb provided stock bodies. Look at this:\n\n\u003e\u003e\u003e import webob.exc\n\u003e\u003e\u003e resp \u003d webob.exc.HTTPServiceUnavailable()\n\u003e\u003e\u003e env \u003d {}\n\u003e\u003e\u003e def sr(s, h):\n...     pass\n... \n\u003e\u003e\u003e env[\u0027REQUEST_METHOD\u0027]\u003d\u0027GET\u0027\n\u003e\u003e\u003e body \u003d resp(env, sr)\n\u003e\u003e\u003e body\n[\u0027503 Service Unavailable\\n\\nThe server is currently unavailable. Please try again at a later time.\\n\\n   \u0027]\n\u003e\u003e\u003e \n\nI can make the text imitate the generic service unavailable body as it was before, if it wins your approval.","commit_id":"c02cda1b9463980f1a8a361aa1f3c38e29b56447"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4a6610d6d95dfdffa936a9ec38f4a6e3863dd562","unresolved":false,"context_lines":[{"line_number":546,"context_line":""},{"line_number":547,"context_line":"        \"\"\""},{"line_number":548,"context_line":"        headers \u003d [(\u0027WWW-Authenticate\u0027, \u0027Keystone uri\u003d\\\u0027%s\\\u0027\u0027 % self.auth_uri)]"},{"line_number":549,"context_line":"        resp \u003d MiniResp(\u0027401: Authentication required\u0027, env, headers)"},{"line_number":550,"context_line":"        start_response(\u0027401 Unauthorized\u0027, resp.headers)"},{"line_number":551,"context_line":"        return resp.body"},{"line_number":552,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FjyQ%3D","line":549,"updated":"2013-06-27 19:43:18.000000000","message":"why adding the 401: to the body here?","commit_id":"c02cda1b9463980f1a8a361aa1f3c38e29b56447"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"87f4cd069af88fee1186686be7248cd7bfbed1df","unresolved":false,"context_lines":[{"line_number":546,"context_line":""},{"line_number":547,"context_line":"        \"\"\""},{"line_number":548,"context_line":"        headers \u003d [(\u0027WWW-Authenticate\u0027, \u0027Keystone uri\u003d\\\u0027%s\\\u0027\u0027 % self.auth_uri)]"},{"line_number":549,"context_line":"        resp \u003d MiniResp(\u0027401: Authentication required\u0027, env, headers)"},{"line_number":550,"context_line":"        start_response(\u0027401 Unauthorized\u0027, resp.headers)"},{"line_number":551,"context_line":"        return resp.body"},{"line_number":552,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FjsE%3D","line":549,"in_reply_to":"AAAAPn%2F%2FjyQ%3D","updated":"2013-06-27 20:09:50.000000000","message":"Sure, I can drop it. Anyone who analyzes this with a desktop browser deserves what he gets anyway, and tools like curl show the status just fine.","commit_id":"c02cda1b9463980f1a8a361aa1f3c38e29b56447"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"957c0d649ed20bd0b8435fd8b540b32ba59fd4e8","unresolved":false,"context_lines":[{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class MiniResp(object):"},{"line_number":255,"context_line":"    def __init__(self, error_message, env, headers\u003d[]):"},{"line_number":256,"context_line":"        if env[\u0027REQUEST_METHOD\u0027] \u003d\u003d \u0027HEAD\u0027:"},{"line_number":257,"context_line":"            self.body \u003d [\u0027\u0027]"},{"line_number":258,"context_line":"        else:"},{"line_number":259,"context_line":"            self.body \u003d [error_message]"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAP3%2F%2F9OE%3D","line":256,"updated":"2013-07-08 16:01:09.000000000","message":"for completeness, this could be:\n\n  if env[\u0027REQUEST_METHOD\u0027] in [\u0027DELETE\u0027, \u0027HEAD\u0027, \u0027OPTIONS\u0027]:","commit_id":"38264fe995298fd29aeabebecd598d62807b326f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2928e202d7a6f5560bc902a47913130800515322","unresolved":false,"context_lines":[{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class MiniResp(object):"},{"line_number":255,"context_line":"    def __init__(self, error_message, env, headers\u003d[]):"},{"line_number":256,"context_line":"        if env[\u0027REQUEST_METHOD\u0027] \u003d\u003d \u0027HEAD\u0027:"},{"line_number":257,"context_line":"            self.body \u003d [\u0027\u0027]"},{"line_number":258,"context_line":"        else:"},{"line_number":259,"context_line":"            self.body \u003d [error_message]"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAP3%2F%2F5Xc%3D","line":256,"in_reply_to":"AAAAP3%2F%2F8fE%3D","updated":"2013-07-09 16:05:18.000000000","message":"I actually questioned myself right after I wrote that and researched it myself. Forgot to post back! You\u0027re entirely correct.","commit_id":"38264fe995298fd29aeabebecd598d62807b326f"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"4a51f7b43ee949342b0cb49c68ac95607e82ab70","unresolved":false,"context_lines":[{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class MiniResp(object):"},{"line_number":255,"context_line":"    def __init__(self, error_message, env, headers\u003d[]):"},{"line_number":256,"context_line":"        if env[\u0027REQUEST_METHOD\u0027] \u003d\u003d \u0027HEAD\u0027:"},{"line_number":257,"context_line":"            self.body \u003d [\u0027\u0027]"},{"line_number":258,"context_line":"        else:"},{"line_number":259,"context_line":"            self.body \u003d [error_message]"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAP3%2F%2F8fE%3D","line":256,"in_reply_to":"AAAAP3%2F%2F9OE%3D","updated":"2013-07-08 19:55:40.000000000","message":"Not at all. Any of DELETE and OPTIONS may return a body in case of an error, whereas HEAD \"MUST NOT return message-body\", according to RFC-2616 9.5. The clause 9.2 discusses entity-body and response body for OPTIONS. The clause 9.7 discusses how 204 (and no body) is returned from DELETE. Anyhow, HEAD is special this way and the test accounts for its unique property.","commit_id":"38264fe995298fd29aeabebecd598d62807b326f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"dc158ff04f649a1b1514a3964a174a5295485a24","unresolved":false,"context_lines":[{"line_number":254,"context_line":"class MiniResp(object):"},{"line_number":255,"context_line":"    def __init__(self, error_message, env, headers\u003d[]):"},{"line_number":256,"context_line":"        # The HEAD method is unique: it must never return a body, even if"},{"line_number":257,"context_line":"        # it reports an error (RFC-2616 clause 9.5). We relieve callers"},{"line_number":258,"context_line":"        # from varying the error responses depending on the method."},{"line_number":259,"context_line":"        if env[\u0027REQUEST_METHOD\u0027] \u003d\u003d \u0027HEAD\u0027:"},{"line_number":260,"context_line":"            self.body \u003d [\u0027\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAQn%2F%2F3Do%3D","line":257,"updated":"2013-07-21 14:58:05.000000000","message":"I think you mean section 9.4 here and not 9.5, 9.5 is POST: http://tools.ietf.org/html/rfc2616#section-9.5","commit_id":"35e03d0014626b499b6864f956b772e7cb38e77a"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"fc3919f928879ccd9e2f984e36da7e716ec3fd49","unresolved":false,"context_lines":[{"line_number":254,"context_line":"class MiniResp(object):"},{"line_number":255,"context_line":"    def __init__(self, error_message, env, headers\u003d[]):"},{"line_number":256,"context_line":"        # The HEAD method is unique: it must never return a body, even if"},{"line_number":257,"context_line":"        # it reports an error (RFC-2616 clause 9.5). We relieve callers"},{"line_number":258,"context_line":"        # from varying the error responses depending on the method."},{"line_number":259,"context_line":"        if env[\u0027REQUEST_METHOD\u0027] \u003d\u003d \u0027HEAD\u0027:"},{"line_number":260,"context_line":"            self.body \u003d [\u0027\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAQn%2F%2Frvw%3D","line":257,"in_reply_to":"AAAAQn%2F%2F3Do%3D","updated":"2013-07-25 04:46:24.000000000","message":"Done","commit_id":"35e03d0014626b499b6864f956b772e7cb38e77a"}],"tests/test_auth_token_middleware.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"957c0d649ed20bd0b8435fd8b540b32ba59fd4e8","unresolved":false,"context_lines":[{"line_number":970,"context_line":"        }"},{"line_number":971,"context_line":"        self.set_middleware(conf\u003dconf)"},{"line_number":972,"context_line":"        self.middleware(req.environ, self.start_fake_response)"},{"line_number":973,"context_line":"        self.assertEqual(self.response_status, 401)"},{"line_number":974,"context_line":""},{"line_number":975,"context_line":"    def test_request_invalid_uuid_token(self):"},{"line_number":976,"context_line":"        req \u003d webob.Request.blank(\u0027/\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAP3%2F%2F9ME%3D","line":973,"updated":"2013-07-08 16:01:09.000000000","message":"the WWW-Authenticate header is the most important part of this response... not sure why it\u0027s not tested here?","commit_id":"38264fe995298fd29aeabebecd598d62807b326f"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"4a51f7b43ee949342b0cb49c68ac95607e82ab70","unresolved":false,"context_lines":[{"line_number":970,"context_line":"        }"},{"line_number":971,"context_line":"        self.set_middleware(conf\u003dconf)"},{"line_number":972,"context_line":"        self.middleware(req.environ, self.start_fake_response)"},{"line_number":973,"context_line":"        self.assertEqual(self.response_status, 401)"},{"line_number":974,"context_line":""},{"line_number":975,"context_line":"    def test_request_invalid_uuid_token(self):"},{"line_number":976,"context_line":"        req \u003d webob.Request.blank(\u0027/\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAP3%2F%2F8SE%3D","line":973,"in_reply_to":"AAAAP3%2F%2F9ME%3D","updated":"2013-07-08 19:55:40.000000000","message":"Done","commit_id":"38264fe995298fd29aeabebecd598d62807b326f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"957c0d649ed20bd0b8435fd8b540b32ba59fd4e8","unresolved":false,"context_lines":[{"line_number":1220,"context_line":""},{"line_number":1221,"context_line":"    # Usually we supply a signed_dir with pre-installed certificates,"},{"line_number":1222,"context_line":"    # so invocation of /usr/bin/openssl succeeds. This time we give it"},{"line_number":1223,"context_line":"    # an empty directory, so it fails."},{"line_number":1224,"context_line":"    def test_request_no_token_dummy(self):"},{"line_number":1225,"context_line":"        cert_dir \u003d os.path.join(self.base_dir, \u0027certs\u0027)"},{"line_number":1226,"context_line":"        os.mkdir(cert_dir)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAP3%2F%2F9Ls%3D","line":1223,"updated":"2013-07-08 16:01:09.000000000","message":"should be a docstr?","commit_id":"38264fe995298fd29aeabebecd598d62807b326f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2928e202d7a6f5560bc902a47913130800515322","unresolved":false,"context_lines":[{"line_number":1220,"context_line":""},{"line_number":1221,"context_line":"    # Usually we supply a signed_dir with pre-installed certificates,"},{"line_number":1222,"context_line":"    # so invocation of /usr/bin/openssl succeeds. This time we give it"},{"line_number":1223,"context_line":"    # an empty directory, so it fails."},{"line_number":1224,"context_line":"    def test_request_no_token_dummy(self):"},{"line_number":1225,"context_line":"        cert_dir \u003d os.path.join(self.base_dir, \u0027certs\u0027)"},{"line_number":1226,"context_line":"        os.mkdir(cert_dir)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAP3%2F%2F5Xs%3D","line":1223,"in_reply_to":"AAAAP3%2F%2F8eU%3D","updated":"2013-07-09 16:05:18.000000000","message":"the summary line in a docstr can be rendered by nose, etc, instead of the method name of the the test itself. further, it\u0027s a multiline comment that explains the method, so it seems natural it should be a docstring rather than a class level inline comment","commit_id":"38264fe995298fd29aeabebecd598d62807b326f"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"4a51f7b43ee949342b0cb49c68ac95607e82ab70","unresolved":false,"context_lines":[{"line_number":1220,"context_line":""},{"line_number":1221,"context_line":"    # Usually we supply a signed_dir with pre-installed certificates,"},{"line_number":1222,"context_line":"    # so invocation of /usr/bin/openssl succeeds. This time we give it"},{"line_number":1223,"context_line":"    # an empty directory, so it fails."},{"line_number":1224,"context_line":"    def test_request_no_token_dummy(self):"},{"line_number":1225,"context_line":"        cert_dir \u003d os.path.join(self.base_dir, \u0027certs\u0027)"},{"line_number":1226,"context_line":"        os.mkdir(cert_dir)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAP3%2F%2F8eU%3D","line":1223,"in_reply_to":"AAAAP3%2F%2F9Ls%3D","updated":"2013-07-08 19:55:40.000000000","message":"A docstr for a test? I do not understand how that is supposed to be of use. I thought it was a debugging aid, so you could print it.","commit_id":"38264fe995298fd29aeabebecd598d62807b326f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"357bec2173e1f1742b97298dd421d413a13b1e08","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"            \u0027auth_protocol\u0027: \u0027http\u0027,"},{"line_number":1012,"context_line":"            \u0027auth_admin_prefix\u0027: \u0027/testadmin\u0027,"},{"line_number":1013,"context_line":"        }"},{"line_number":1014,"context_line":"        self.middleware \u003d auth_token.AuthProtocol(self.fake_app, conf)"},{"line_number":1015,"context_line":"        body \u003d self.middleware(req.environ, self.start_fake_response)"},{"line_number":1016,"context_line":"        self.assertEqual(self.response_status, 401)"},{"line_number":1017,"context_line":"        self.assertEqual(self.response_headers[\u0027WWW-Authenticate\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2FmUM%3D","line":1014,"updated":"2013-07-26 19:58:40.000000000","message":"I don\u0027t understand this change... why can\u0027t we use self.set_middleware here like everywhere else?","commit_id":"a8162b75538f20d203d171d428c7f88c34b382cd"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"af9364c588dcca2f9a06e4160768f448462a99a2","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"            \u0027auth_protocol\u0027: \u0027http\u0027,"},{"line_number":1012,"context_line":"            \u0027auth_admin_prefix\u0027: \u0027/testadmin\u0027,"},{"line_number":1013,"context_line":"        }"},{"line_number":1014,"context_line":"        self.middleware \u003d auth_token.AuthProtocol(self.fake_app, conf)"},{"line_number":1015,"context_line":"        body \u003d self.middleware(req.environ, self.start_fake_response)"},{"line_number":1016,"context_line":"        self.assertEqual(self.response_status, 401)"},{"line_number":1017,"context_line":"        self.assertEqual(self.response_headers[\u0027WWW-Authenticate\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2FliA%3D","line":1014,"in_reply_to":"AAAAQn%2F%2FmKk%3D","updated":"2013-07-27 04:24:27.000000000","message":"Your wish is my command.","commit_id":"a8162b75538f20d203d171d428c7f88c34b382cd"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e11c839721484eefa3d64cf7c8b3ff849454c4c1","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"            \u0027auth_protocol\u0027: \u0027http\u0027,"},{"line_number":1012,"context_line":"            \u0027auth_admin_prefix\u0027: \u0027/testadmin\u0027,"},{"line_number":1013,"context_line":"        }"},{"line_number":1014,"context_line":"        self.middleware \u003d auth_token.AuthProtocol(self.fake_app, conf)"},{"line_number":1015,"context_line":"        body \u003d self.middleware(req.environ, self.start_fake_response)"},{"line_number":1016,"context_line":"        self.assertEqual(self.response_status, 401)"},{"line_number":1017,"context_line":"        self.assertEqual(self.response_headers[\u0027WWW-Authenticate\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2FmKk%3D","line":1014,"in_reply_to":"AAAAQn%2F%2FmN0%3D","updated":"2013-07-26 21:01:44.000000000","message":"suggest change set_middleware to allow a new optional parameter so that it won\u0027t set conf[\u0027http_handler\u0027], then call set_middleware with that new parameter.","commit_id":"a8162b75538f20d203d171d428c7f88c34b382cd"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"e9dbe845f6b53b82f700830f268dc845e735bd2d","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"            \u0027auth_protocol\u0027: \u0027http\u0027,"},{"line_number":1012,"context_line":"            \u0027auth_admin_prefix\u0027: \u0027/testadmin\u0027,"},{"line_number":1013,"context_line":"        }"},{"line_number":1014,"context_line":"        self.middleware \u003d auth_token.AuthProtocol(self.fake_app, conf)"},{"line_number":1015,"context_line":"        body \u003d self.middleware(req.environ, self.start_fake_response)"},{"line_number":1016,"context_line":"        self.assertEqual(self.response_status, 401)"},{"line_number":1017,"context_line":"        self.assertEqual(self.response_headers[\u0027WWW-Authenticate\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2FmN0%3D","line":1014,"in_reply_to":"AAAAQn%2F%2FmUM%3D","updated":"2013-07-26 20:42:51.000000000","message":"AuthProtocol.__init__ has a branch dealing with absent conf[\u0027http_handler\u0027], which is not otherwise tested because set_middleware() always sets http_handler. It either test that by bypassing set_middleware(), or always use set_middleware() and cut that from AuthProtocol. I didn\u0027t dare to do the latter.","commit_id":"a8162b75538f20d203d171d428c7f88c34b382cd"}]}
