def jenkins_request_with_headers(jenkins_server, req): """ We need to get the headers in addition to the body answer to get the location from them This function uses jenkins_request method from python-jenkins library with just the return call changed :param jenkins_server: The server to query :param req: The request to execute :return: Dict containing the response body (key body) and the headers coming along (headers) """ try: response = jenkins_server.jenkins_request(req) response_body = response.content response_headers = response.headers if response_body is None: raise jenkins.EmptyResponseException( "Error communicating with server[%s]: " "empty response" % jenkins_server.server) return {'body': response_body.decode('utf-8'), 'headers': response_headers} except HTTPError as e: # Jenkins's funky authentication means its nigh impossible to distinguish errors. if e.code in [401, 403, 500]: raise JenkinsException( 'Error in request. Possibly authentication failed [%s]: %s' % (e.code, e.msg) ) elif e.code == 404: raise jenkins.NotFoundException('Requested item could not be found') else: raise except socket.timeout as e: raise jenkins.TimeoutException('Error in request: %s' % e) except URLError as e: raise JenkinsException('Error in request: %s' % e.reason)
def jenkins_request_with_headers(self, jenkins_server, req, add_crumb=True): """ We need to get the headers in addition to the body answer to get the location from them This function is just a copy of the one present in python-jenkins library with just the return call changed :param jenkins_server: The server to query :param req: The request to execute :param add_crumb: Boolean to indicate if it should add crumb to the request :return: """ try: # if jenkins_server.auth: # req.add_header('Authorization', jenkins_server.auth) # if add_crumb: # jenkins_server.maybe_add_crumb(req) base64string = base64.b64encode( '%s:%s' % (self.connection.login, self.connection.password)) self.log.info("base64string -> %s", base64string) req.add_header("Authorization", "Basic %s" % base64string) response = urlopen(req, timeout=jenkins_server.timeout) response_body = response.read() response_headers = response.info() if response_body is None: raise jenkins.EmptyResponseException( "Error communicating with server[%s]: " "empty response" % jenkins_server.server) return { 'body': response_body.decode('utf-8'), 'headers': response_headers } except HTTPError as e: # Jenkins's funky authentication means its nigh impossible to # distinguish errors. if e.code in [401, 403, 500]: # six.moves.urllib.error.HTTPError provides a 'reason' # attribute for all python version except for ver 2.6 # Falling back to HTTPError.msg since it contains the # same info as reason raise JenkinsException( 'Error in request. ' + 'Possibly authentication failed [%s]: %s' % (e.code, e.msg)) elif e.code == 404: raise jenkins.NotFoundException( 'Requested item could not be found') else: raise except socket.timeout as e: raise jenkins.TimeoutException('Error in request: %s' % e) except URLError as e: # python 2.6 compatibility to ensure same exception raised # since URLError wraps a socket timeout on python 2.6. if str(e.reason) == "timed out": raise jenkins.TimeoutException('Error in request: %s' % e.reason) raise JenkinsException('Error in request: %s' % e.reason)
def test_return_empty_response(self, jenkins_mock): "Don't try to create crumb header from an empty response" jenkins_mock.side_effect = jenkins.EmptyResponseException("empty response") request = jenkins.requests.Request('GET', 'http://example.com/job/TestJob') self.j.maybe_add_crumb(request) self.assertEqual( jenkins_mock.call_args[0][0].url, self.make_url('crumbIssuer/api/json')) self.assertFalse(self.j.crumb) self.assertFalse('.crumb' in request.headers)
def test_return_empty_response(self, jenkins_mock): "Don't try to create crumb header from an empty response" jenkins_mock.side_effect = jenkins.EmptyResponseException( "empty response") request = jenkins.Request(self.make_url('job/TestJob')) self.j.maybe_add_crumb(request) self.assertEqual(jenkins_mock.call_args[0][0].get_full_url(), self.make_url('crumbIssuer/api/json')) self.assertFalse(self.j.crumb) self.assertFalse('.crumb' in request.headers) self._check_requests(jenkins_mock.call_args_list)
def _response_handler(self, response): # pragma: no cover '''Handle response objects''' # raise exceptions if occurred response.raise_for_status() headers = response.headers if (headers.get('content-length') is None and headers.get('transfer-encoding') is None and len(response.content) <= 0): # response body should only exist if one of these is provided raise jenkins.EmptyResponseException( "Error communicating with server[%s]: " "empty response" % self.server) # Response objects will automatically return unicode encoded # when accessing .text property return response
def jenkins_request_with_headers(jenkins_server, req): """ We need to get the headers in addition to the body answer to get the location from them This function uses jenkins_request method from python-jenkins library with just the return call changed :param jenkins_server: The server to query :param req: The request to execute :return: Dict containing the response body (key body) and the headers coming along (headers) """ try: response = jenkins_server.jenkins_request(req) response_body = response.content response_headers = response.headers if response_body is None: raise jenkins.EmptyResponseException( "Error communicating with server[%s]: " "empty response" % jenkins_server.server) return { 'body': response_body.decode('utf-8'), 'headers': response_headers } except HTTPError as e: # Jenkins's funky authentication means its nigh impossible to # distinguish errors. if e.code in [401, 403, 500]: # six.moves.urllib.error.HTTPError provides a 'reason' # attribute for all python version except for ver 2.6 # Falling back to HTTPError.msg since it contains the # same info as reason raise JenkinsException('Error in request. ' + 'Possibly authentication failed [%s]: %s' % (e.code, e.msg)) elif e.code == 404: raise jenkins.NotFoundException( 'Requested item could not be found') else: raise except socket.timeout as e: raise jenkins.TimeoutException('Error in request: %s' % e) except URLError as e: # python 2.6 compatibility to ensure same exception raised # since URLError wraps a socket timeout on python 2.6. if str(e.reason) == "timed out": raise jenkins.TimeoutException('Error in request: %s' % e.reason) raise JenkinsException('Error in request: %s' % e.reason)
def jenkins_open(self, req, add_crumb=True): '''Utility routine for opening an HTTP request to a Jenkins server. Extended over the original method to allow connections to SF with a cookie. ''' self.opener.addheaders = [('Cookie', 'auth_pubtkt=%s' % self.cookie)] try: if add_crumb: self.maybe_add_crumb(req) response = self.opener.open(req, timeout=self.timeout).read() if response is None: raise jenkins.EmptyResponseException( "Error communicating with server[%s]: " "empty response" % self.server) return response.decode('utf-8') except HTTPError as e: # Jenkins's funky authentication means its nigh impossible to # distinguish errors. if e.code in [401, 403, 500]: # six.moves.urllib.error.HTTPError provides a 'reason' # attribute for all python version except for ver 2.6 # Falling back to HTTPError.msg since it contains the # same info as reason raise jenkins.JenkinsException( 'Error in request. ' + 'Possibly authentication failed [%s]: %s' % (e.code, e.msg)) elif e.code == 404: raise jenkins.NotFoundException( 'Requested item could not be found') else: raise except socket.timeout as e: raise jenkins.TimeoutException('Error in request: %s' % (e)) except URLError as e: # python 2.6 compatibility to ensure same exception raised # since URLError wraps a socket timeout on python 2.6. if str(e.reason) == "timed out": raise jenkins.TimeoutException('Error in request: %s' % (e.reason)) raise jenkins.JenkinsException('Error in request: %s' % (e.reason))
class JenkinsOpenTest(JenkinsTestBase): @patch('jenkins.requests.Session.send', autospec=True) def test_simple(self, session_send_mock): data = {'foo': 'bar'} session_send_mock.side_effect = iter([ build_response_mock(200, self.crumb_data), build_response_mock(200, data), ]) request = jenkins.requests.Request('GET', self.make_url('job/TestJob')) response = self.j.jenkins_open(request) self.assertEqual(session_send_mock.call_args[0][1].url, self.make_url('job/TestJob')) self.assertEqual(response, json.dumps(data)) self.assertEqual(self.j.crumb, self.crumb_data) self.assertEqual(request.headers['.crumb'], self.crumb_data['crumb']) @patch('jenkins.requests.Session.send', autospec=True) def test_response_403(self, session_send_mock): request = jenkins.requests.Request('GET', self.make_url('job/TestJob')) session_send_mock.return_value = build_response_mock( 401, reason="basic auth failed") with self.assertRaises(jenkins.JenkinsException) as context_manager: self.j.jenkins_open(request, add_crumb=False) self.assertEqual( str(context_manager.exception), 'Error in request. Possibly authentication failed [401]: ' 'basic auth failed') self.assertEqual(session_send_mock.call_args[0][1].url, self.make_url('job/TestJob')) @patch('jenkins.requests.Session.send', autospec=True) def test_response_404(self, session_send_mock): request = jenkins.requests.Request('GET', self.make_url('job/TestJob')) session_send_mock.return_value = build_response_mock( 404, reason="basic auth failed") with self.assertRaises(jenkins.NotFoundException) as context_manager: self.j.jenkins_open(request, add_crumb=False) self.assertEqual(str(context_manager.exception), 'Requested item could not be found') self.assertEqual(session_send_mock.call_args[0][1].url, self.make_url('job/TestJob')) @patch('jenkins.requests.Session.send', autospec=True) def test_empty_response(self, session_send_mock): request = jenkins.requests.Request('GET', self.make_url('job/TestJob')) session_send_mock.return_value = build_response_mock( 401, reason="basic auth failed") with self.assertRaises(jenkins.JenkinsException) as context_manager: self.j.jenkins_open(request, False) self.assertEqual( str(context_manager.exception), 'Error in request. Possibly authentication failed [401]: ' 'basic auth failed') self.assertEqual(session_send_mock.call_args[0][1].url, self.make_url('job/TestJob')) @patch('jenkins.requests.Session.send', autospec=True) def test_response_501(self, session_send_mock): request = jenkins.requests.Request('GET', self.make_url('job/TestJob')) session_send_mock.return_value = build_response_mock( 501, reason="Not implemented") with self.assertRaises(jenkins.req_exc.HTTPError) as context_manager: self.j.jenkins_open(request, add_crumb=False) self.assertEqual(str(context_manager.exception), '501 Server Error: Not implemented for url: None') self.assertEqual(session_send_mock.call_args[0][1].url, self.make_url('job/TestJob')) @patch('jenkins.requests.Session.send', autospec=True) def test_timeout(self, session_send_mock): session_send_mock.side_effect = jenkins.URLError(reason="timed out") j = jenkins.Jenkins(self.make_url(''), 'test', 'test', timeout=1, resolve=False) request = jenkins.requests.Request('GET', self.make_url('job/TestJob')) with self.assertRaises(jenkins.JenkinsException) as context_manager: j.jenkins_open(request, add_crumb=False) self.assertEqual(str(context_manager.exception), 'Error in request: timed out') self.assertEqual(session_send_mock.call_args[0][1].url, self.make_url('job/TestJob')) @patch.object(jenkins.Jenkins, 'jenkins_open', return_value=json.dumps({'mode': 'NORMAL'})) @patch.object(jenkins.Jenkins, 'get_version', return_value="Version42") def test_wait_for_normal_op(self, version_mock, jenkins_mock): j = jenkins.Jenkins('http://example.com', 'test', 'test', resolve=False) self.assertTrue(j.wait_for_normal_op(0)) @patch.object(jenkins.Jenkins, 'jenkins_open', side_effect=jenkins.EmptyResponseException()) @patch.object(jenkins.Jenkins, 'get_version', side_effect=jenkins.EmptyResponseException()) def test_wait_for_normal_op__empty_response(self, version_mock, jenkins_mock): j = jenkins.Jenkins('http://example.com', 'test', 'test', resolve=False) self.assertFalse(j.wait_for_normal_op(0)) def test_wait_for_normal_op__negative_timeout(self): j = jenkins.Jenkins('http://example.com', 'test', 'test', resolve=False) with self.assertRaises(ValueError) as context_manager: j.wait_for_normal_op(-1) self.assertEqual(str(context_manager.exception), "Timeout must be >= 0 not -1")
class JenkinsOpenTest(JenkinsTestBase): @patch('jenkins.urlopen') def test_simple(self, jenkins_mock): data = {'foo': 'bar'} jenkins_mock.side_effect = [ get_mock_urlopen_return_value(self.crumb_data), get_mock_urlopen_return_value(data), ] request = jenkins.Request(self.make_url('job/TestJob')) response = self.j.jenkins_open(request) self.assertEqual(jenkins_mock.call_args[0][0].get_full_url(), self.make_url('job/TestJob')) self.assertEqual(response, json.dumps(data)) self.assertEqual(self.j.crumb, self.crumb_data) self.assertEqual(request.headers['.crumb'], self.crumb_data['crumb']) self._check_requests(jenkins_mock.call_args_list) @patch('jenkins.urlopen') def test_response_403(self, jenkins_mock): jenkins_mock.side_effect = jenkins.HTTPError( self.make_url('job/TestJob'), code=401, msg="basic auth failed", hdrs=[], fp=None) request = jenkins.Request(self.make_url('job/TestJob')) with self.assertRaises(jenkins.JenkinsException) as context_manager: self.j.jenkins_open(request, add_crumb=False) self.assertEqual( str(context_manager.exception), 'Error in request. Possibly authentication failed [401]: ' 'basic auth failed') self.assertEqual(jenkins_mock.call_args[0][0].get_full_url(), self.make_url('job/TestJob')) self._check_requests(jenkins_mock.call_args_list) @patch('jenkins.urlopen') def test_response_404(self, jenkins_mock): jenkins_mock.side_effect = jenkins.HTTPError( self.make_url('job/TestJob'), code=404, msg="basic auth failed", hdrs=[], fp=None) request = jenkins.Request(self.make_url('job/TestJob')) with self.assertRaises(jenkins.NotFoundException) as context_manager: self.j.jenkins_open(request, add_crumb=False) self.assertEqual(str(context_manager.exception), 'Requested item could not be found') self.assertEqual(jenkins_mock.call_args[0][0].get_full_url(), self.make_url('job/TestJob')) self._check_requests(jenkins_mock.call_args_list) @patch('jenkins.urlopen') def test_empty_response(self, jenkins_mock): jenkins_mock.return_value = Mock(**{'read.return_value': None}) request = jenkins.Request(self.make_url('job/TestJob')) with self.assertRaises(jenkins.JenkinsException) as context_manager: self.j.jenkins_open(request, False) self.assertEqual( str(context_manager.exception), 'Error communicating with server[{0}/]: ' 'empty response'.format(self.base_url)) self.assertEqual(jenkins_mock.call_args[0][0].get_full_url(), self.make_url('job/TestJob')) self._check_requests(jenkins_mock.call_args_list) @patch('jenkins.urlopen') def test_response_501(self, jenkins_mock): jenkins_mock.side_effect = jenkins.HTTPError( self.make_url('job/TestJob'), code=501, msg="Not implemented", hdrs=[], fp=None) request = jenkins.Request(self.make_url('job/TestJob')) with self.assertRaises(HTTPError) as context_manager: self.j.jenkins_open(request, add_crumb=False) self.assertEqual(str(context_manager.exception), 'HTTP Error 501: Not implemented') self.assertEqual(jenkins_mock.call_args[0][0].get_full_url(), self.make_url('job/TestJob')) self._check_requests(jenkins_mock.call_args_list) @patch('jenkins.urlopen') def test_timeout(self, jenkins_mock): jenkins_mock.side_effect = jenkins.URLError(reason="timed out") j = jenkins.Jenkins(self.make_url(''), 'test', 'test', timeout=1) request = jenkins.Request(self.make_url('job/TestJob')) with self.assertRaises(jenkins.JenkinsException) as context_manager: j.jenkins_open(request, add_crumb=False) self.assertEqual(str(context_manager.exception), 'Error in request: timed out') self.assertEqual(jenkins_mock.call_args[0][0].get_full_url(), self.make_url('job/TestJob')) self._check_requests(jenkins_mock.call_args_list) @patch.object(jenkins.Jenkins, 'jenkins_open', return_value=json.dumps({'mode': 'NORMAL'})) @patch.object(jenkins.Jenkins, 'get_version', return_value="Version42") def test_wait_for_normal_op(self, version_mock, jenkins_mock): j = jenkins.Jenkins('http://example.com', 'test', 'test') self.assertTrue(j.wait_for_normal_op(0)) @patch.object(jenkins.Jenkins, 'jenkins_open', side_effect=jenkins.EmptyResponseException()) @patch.object(jenkins.Jenkins, 'get_version', side_effect=jenkins.EmptyResponseException()) def test_wait_for_normal_op__empty_response(self, version_mock, jenkins_mock): j = jenkins.Jenkins('http://example.com', 'test', 'test') self.assertFalse(j.wait_for_normal_op(0)) def test_wait_for_normal_op__negative_timeout(self): j = jenkins.Jenkins('http://example.com', 'test', 'test') with self.assertRaises(ValueError) as context_manager: j.wait_for_normal_op(-1) self.assertEqual(str(context_manager.exception), "Timeout must be >= 0 not -1")