def getresponse(self, _=False, **kwargs): '''Retrieve the response''' # Check to see if the cassette has a response for this request. If so, # then return it if self.cassette.can_play_response_for(self._vcr_request): log.info( "Playing response for {0} from cassette".format( self._vcr_request ) ) response = self.cassette.play_response(self._vcr_request) return VCRHTTPResponse(response) else: if self.cassette.write_protected and self.cassette.filter_request( self._vcr_request ): raise CannotOverwriteExistingCassetteException( "No match for the request (%r) was found. " "Can't overwrite existing cassette (%r) in " "your current record mode (%r)." % (self._vcr_request, self.cassette._path, self.cassette.record_mode) ) # Otherwise, we should send the request, then get the response # and return it. log.info( "{0} not in cassette, sending to real server".format( self._vcr_request ) ) # This is imported here to avoid circular import. # TODO(@IvanMalison): Refactor to allow normal import. from vcr.patch import force_reset with force_reset(): self.real_connection.request( method=self._vcr_request.method, url=self._url(self._vcr_request.uri), body=self._vcr_request.body, headers=self._vcr_request.headers, ) # get the response response = self.real_connection.getresponse() # put the response into the cassette response = { 'status': { 'code': response.status, 'message': response.reason }, 'headers': serialize_headers(response), 'body': {'string': response.read()}, } self.cassette.append(self._vcr_request, response) return VCRHTTPResponse(response)
def __init__(self, *args, **kwargs): if six.PY3: kwargs.pop('strict', None) # apparently this is gone in py3 # need to temporarily reset here because the real connection # inherits from the thing that we are mocking out. Take out # the reset if you want to see what I mean :) from vcr.patch import force_reset with force_reset(): self.real_connection = self._baseclass(*args, **kwargs)
def test_nesting_context_managers_by_checking_references_of_http_connection(): original = httplib.HTTPConnection with Cassette.use(path="test"): first_cassette_HTTPConnection = httplib.HTTPConnection with Cassette.use(path="test"): second_cassette_HTTPConnection = httplib.HTTPConnection assert second_cassette_HTTPConnection is not first_cassette_HTTPConnection with Cassette.use(path="test"): assert httplib.HTTPConnection is not second_cassette_HTTPConnection with force_reset(): assert httplib.HTTPConnection is original assert httplib.HTTPConnection is second_cassette_HTTPConnection assert httplib.HTTPConnection is first_cassette_HTTPConnection
def test_nesting_context_managers_by_checking_references_of_http_connection(): original = httplib.HTTPConnection with Cassette.use(path='test'): first_cassette_HTTPConnection = httplib.HTTPConnection with Cassette.use(path='test'): second_cassette_HTTPConnection = httplib.HTTPConnection assert second_cassette_HTTPConnection is not first_cassette_HTTPConnection with Cassette.use(path='test'): assert httplib.HTTPConnection is not second_cassette_HTTPConnection with force_reset(): assert httplib.HTTPConnection is original assert httplib.HTTPConnection is second_cassette_HTTPConnection assert httplib.HTTPConnection is first_cassette_HTTPConnection
def getresponse(self, _=False, **kwargs): """Retrieve the response""" # Check to see if the cassette has a response for this request. If so, # then return it if self.cassette.can_play_response_for(self._vcr_request): log.info("Playing response for {} from cassette".format( self._vcr_request)) response = self.cassette.play_response(self._vcr_request) return VCRHTTPResponse(response) else: if self.cassette.write_protected and self.cassette.filter_request( self._vcr_request): raise CannotOverwriteExistingCassetteException( cassette=self.cassette, failed_request=self._vcr_request) # Otherwise, we should send the request, then get the response # and return it. log.info("{} not in cassette, sending to real server".format( self._vcr_request)) # This is imported here to avoid circular import. # TODO(@IvanMalison): Refactor to allow normal import. from vcr.patch import force_reset with force_reset(): self.real_connection.request( method=self._vcr_request.method, url=self._url(self._vcr_request.uri), body=self._vcr_request.body, headers=self._vcr_request.headers, ) # get the response response = self.real_connection.getresponse() # put the response into the cassette response = { "status": { "code": response.status, "message": response.reason }, "headers": serialize_headers(response), "body": { "string": response.read() }, } self.cassette.append(self._vcr_request, response) return VCRHTTPResponse(response)
def test_urllib3_force_reset(): cpool = urllib3.connectionpool http_original = cpool.HTTPConnection https_original = cpool.HTTPSConnection verified_https_original = cpool.VerifiedHTTPSConnection with vcr.use_cassette(path="test"): first_cassette_HTTPConnection = cpool.HTTPConnection first_cassette_HTTPSConnection = cpool.HTTPSConnection first_cassette_VerifiedHTTPSConnection = cpool.VerifiedHTTPSConnection with force_reset(): assert cpool.HTTPConnection is http_original assert cpool.HTTPSConnection is https_original assert cpool.VerifiedHTTPSConnection is verified_https_original assert cpool.HTTPConnection is first_cassette_HTTPConnection assert cpool.HTTPSConnection is first_cassette_HTTPSConnection assert cpool.VerifiedHTTPSConnection is first_cassette_VerifiedHTTPSConnection
def test_urllib3_force_reset(): cpool = urllib3.connectionpool http_original = cpool.HTTPConnection https_original = cpool.HTTPSConnection verified_https_original = cpool.VerifiedHTTPSConnection with vcr.use_cassette(path='test'): first_cassette_HTTPConnection = cpool.HTTPConnection first_cassette_HTTPSConnection = cpool.HTTPSConnection first_cassette_VerifiedHTTPSConnection = cpool.VerifiedHTTPSConnection with force_reset(): assert cpool.HTTPConnection is http_original assert cpool.HTTPSConnection is https_original assert cpool.VerifiedHTTPSConnection is verified_https_original assert cpool.HTTPConnection is first_cassette_HTTPConnection assert cpool.HTTPSConnection is first_cassette_HTTPSConnection assert cpool.VerifiedHTTPSConnection is first_cassette_VerifiedHTTPSConnection
def __init__(self, *args, **kwargs): kwargs.pop("strict", None) # need to temporarily reset here because the real connection # inherits from the thing that we are mocking out. Take out # the reset if you want to see what I mean :) from vcr.patch import force_reset with force_reset(): self.real_connection = self._baseclass(*args, **kwargs) # Make sure to set those attributes as it seems `AWSHTTPConnection` does not # set them, making the connection to fail ! self.real_connection.assert_hostname = kwargs.get("assert_hostname", False) self.real_connection.cert_reqs = kwargs.get("cert_reqs", "CERT_NONE") self._sock = None
def connect(self, *args, **kwargs): """ httplib2 uses this. Connects to the server I'm assuming. Only pass to the baseclass if we don't have a recorded response and are not write-protected. """ if hasattr(self, '_vcr_request') and \ self.cassette.can_play_response_for(self._vcr_request): # We already have a response we are going to play, don't # actually connect return if self.cassette.write_protected: # Cassette is write-protected, don't actually connect return from vcr.patch import force_reset with force_reset(): return self.real_connection.connect(*args, **kwargs)
def initialize(self, *args, **kwargs): from vcr.patch import force_reset with force_reset(): self.real_client = self._baseclass(*args, **kwargs)
def test_one(self): with force_reset(): self.no_decoration() with force_reset(): self.test_two() assert httplib.HTTPConnection != _HTTPConnection
def __new__(cls, *args, **kwargs): from vcr.patch import force_reset with force_reset(): return super(_VCRAsyncClient, cls).__new__(cls, *args, **kwargs)
def fetch_impl(self, request, callback): headers = dict(request.headers) if request.user_agent: headers.setdefault('User-Agent', request.user_agent) # TODO body_producer, header_callback, and streaming_callback are not # yet supported. unsupported_call = ( request.body_producer is not None or request.header_callback is not None or request.streaming_callback is not None ) if unsupported_call: response = HTTPResponse( request, 599, error=Exception( "The request (%s) uses AsyncHTTPClient functionality " "that is not yet supported by VCR.py. Please make the " "request outside a VCR.py context." % repr(request) ), ) return callback(response) vcr_request = Request( request.method, request.url, request.body, headers, ) if self.cassette.can_play_response_for(vcr_request): vcr_response = self.cassette.play_response(vcr_request) headers = httputil.HTTPHeaders() recorded_headers = vcr_response['headers'] if isinstance(recorded_headers, dict): recorded_headers = recorded_headers.items() for k, vs in recorded_headers: for v in vs: headers.add(k, v) response = HTTPResponse( request, code=vcr_response['status']['code'], reason=vcr_response['status']['message'], headers=headers, buffer=BytesIO(vcr_response['body']['string']), ) return callback(response) else: if self.cassette.write_protected and self.cassette.filter_request( vcr_request ): response = HTTPResponse( request, 599, error=CannotOverwriteExistingCassetteException( "No match for the request (%r) was found. " "Can't overwrite existing cassette (%r) in " "your current record mode (%r)." % (vcr_request, self.cassette._path, self.cassette.record_mode) ), ) return callback(response) def new_callback(response): headers = [ (k, response.headers.get_list(k)) for k in response.headers.keys() ] vcr_response = { 'status': { 'code': response.code, 'message': response.reason, }, 'headers': headers, 'body': {'string': response.body}, } self.cassette.append(vcr_request, vcr_response) return callback(response) from vcr.patch import force_reset with force_reset(): self.real_client.fetch_impl(request, new_callback)
def close(self): from vcr.patch import force_reset with force_reset(): self.real_client.close()