mirror of
https://github.com/kevin1024/vcrpy.git
synced 2025-12-09 01:03:24 +00:00
Use Content-Type based approach for body matcher
When converting objects to body, dicts and sets order can change resulting in a different but same body. This fixes the issue by comparing the enclosed data in the body rather than the body itself while still allowing raw body matching with the raw_body matcher.
This commit is contained in:
@@ -144,7 +144,9 @@ The following options are available :
|
|||||||
- port (the port of the server receiving the request)
|
- port (the port of the server receiving the request)
|
||||||
- path (the path of the request)
|
- path (the path of the request)
|
||||||
- query (the query string of the request)
|
- query (the query string of the request)
|
||||||
- body (the entire request body)
|
- raw\_body (the entire request body as is)
|
||||||
|
- body (the entire request body unmarshalled by content-type
|
||||||
|
i.e. xmlrpc, json, form-urlencoded, falling back on raw\_body)
|
||||||
- headers (the headers of the request)
|
- headers (the headers of the request)
|
||||||
|
|
||||||
Backwards compatible matchers:
|
Backwards compatible matchers:
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ class VCR(object):
|
|||||||
'path': matchers.path,
|
'path': matchers.path,
|
||||||
'query': matchers.query,
|
'query': matchers.query,
|
||||||
'headers': matchers.headers,
|
'headers': matchers.headers,
|
||||||
|
'raw_body': matchers.raw_body,
|
||||||
'body': matchers.body,
|
'body': matchers.body,
|
||||||
}
|
}
|
||||||
self.record_mode = record_mode
|
self.record_mode = record_mode
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import json
|
||||||
|
from six.moves import urllib, xmlrpc_client
|
||||||
import logging
|
import logging
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -30,12 +32,29 @@ def query(r1, r2):
|
|||||||
return r1.query == r2.query
|
return r1.query == r2.query
|
||||||
|
|
||||||
|
|
||||||
def body(r1, r2):
|
def raw_body(r1, r2):
|
||||||
if hasattr(r1.body, 'read') and hasattr(r2.body, 'read'):
|
if hasattr(r1.body, 'read') and hasattr(r2.body, 'read'):
|
||||||
return r1.body.read() == r2.body.read()
|
return r1.body.read() == r2.body.read()
|
||||||
return r1.body == r2.body
|
return r1.body == r2.body
|
||||||
|
|
||||||
|
|
||||||
|
def body(r1, r2):
|
||||||
|
if hasattr(r1.body, 'read') and hasattr(r2.body, 'read'):
|
||||||
|
r1_body = r1.body.read()
|
||||||
|
r2_body = r2.body.read()
|
||||||
|
else:
|
||||||
|
r1_body = r1.body
|
||||||
|
r2_body = r2.body
|
||||||
|
if r1.headers.get('Content-Type') == r2.headers.get('Content-Type') == 'application/x-www-form-urlencoded':
|
||||||
|
return urllib.parse.parse_qs(r1_body) == urllib.parse.parse_qs(r2_body)
|
||||||
|
if r1.headers.get('Content-Type') == r2.headers.get('Content-Type') == 'application/json':
|
||||||
|
return json.loads(r1_body) == json.loads(r2_body)
|
||||||
|
if ('xmlrpc' in r1.headers.get('User-Agent', '') and 'xmlrpc' in r2.headers.get('User-Agent', '') and
|
||||||
|
r1.headers.get('Content-Type') == r2.headers.get('Content-Type') == 'text/xml'):
|
||||||
|
return xmlrpc_client.loads(r1_body) == xmlrpc_client.loads(r2_body)
|
||||||
|
return r1_body == r2_body
|
||||||
|
|
||||||
|
|
||||||
def headers(r1, r2):
|
def headers(r1, r2):
|
||||||
return r1.headers == r2.headers
|
return r1.headers == r2.headers
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user