Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Regex in response header seems not to work with V3 specification #433

Conversation

vcalatayud
Copy link

@vcalatayud vcalatayud commented Dec 19, 2022

Hi :)

I updated the pact version to 3 and now the issue seems to reproduce.

image

I'll post now the log with trace level.

@vcalatayud
Copy link
Author

The log:

Message: 
PactNet.Exceptions.PactFailureException : Pact verification failed

Stack Trace: 
InteropVerifierProvider.Execute() line 231
PactVerifierSource.Verify() line 102
EventApiTests.EnsureEventApiHonoursPactWithConsumer() line 45

Standard Output: 
Starting verification...
Pact verification failed

Verifier Output

Verifying a pact between Event API Consumer and Event API

any request
returns a response which
has status code 200 (OK)
includes headers
"regexheader" with value "consumervalue" (FAILED)
has a matching body (OK)

Failures:

  1. Verifying a pact between Event API Consumer and Event API - any request
    1.1) includes header 'regexheader' with value 'consumervalue'
    Expected header 'regexheader' to have value 'consumervalue' but was 'validprovidervalue'

There were 1 pact failures

Verifier Logs

2022-12-19T06:22:05.700438Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: pact_verifier: fetch_pacts(source=File(C:\projects\pact-net-4-fork\samples\EventApi\Consumer.Tests\pacts\Event API Consumer-Event API.json), consumers=[])
2022-12-19T06:22:05.700459Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: pact_verifier: fetch_pact(source=File(C:\projects\pact-net-4-fork\samples\EventApi\Consumer.Tests\pacts\Event API Consumer-Event API.json))
2022-12-19T06:22:05.700534Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: pact_models::file_utils: Attempt 0 of 3 to get a shared lock on '"C:\projects\pact-net-4-fork\samples\EventApi\Consumer.Tests\pacts\Event API Consumer-Event API.json"'
2022-12-19T06:22:05.700563Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: pact_models::file_utils: Got shared file lock
2022-12-19T06:22:05.700627Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: pact_models::file_utils: Releasing shared file lock
2022-12-19T06:22:05.700715Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: pact_models::pact: load_pact_from_json: found spec version V3 in metadata
2022-12-19T06:22:05.700721Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: pact_models::pact: load_pact_from_json: loading JSON as a request/response pact
2022-12-19T06:22:05.706294Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: pact_models::matchingrules: rule_type: regex, attributes: {"match":"regex","regex":"^[a-z]+$"}
2022-12-19T06:22:05.716090Z INFO ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_verifier: Running provider verification for 'any request'
2022-12-19T06:22:05.716103Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_verifier: Interaction to verify: RequestResponseInteraction { id: None, description: "any request", provider_states: [], request: Request { method: "GET", path: "/test-regex-in-response-header", query: None, headers: Some({"Accept": ["application/json"]}), body: Missing, matching_rules: MatchingRules { rules: {} }, generators: Generators { categories: {} } }, response: Response { status: 200, headers: Some({"regexheader": ["consumervalue"]}), body: Missing, matching_rules: MatchingRules { rules: {HEADER: MatchingRuleCategory { name: HEADER, rules: {DocPath { path_tokens: [Root, Field("regexheader"), Index(0)], expr: "$.regexheader[0]" }: RuleList { rules: [Regex("^[a-z]+$")], rule_logic: And, cascaded: false }} }} }, generators: Generators { categories: {} } } }
2022-12-19T06:22:05.716168Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_verifier: Verifying a HTTP interaction
2022-12-19T06:22:05.716198Z INFO ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_verifier::provider_client: Sending request to provider at http://localhost:9222/
2022-12-19T06:22:05.716201Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_verifier::provider_client: Provider details = ProviderInfo { name: "Event API", protocol: "http", host: "localhost", port: Some(9222), path: "/", transports: [ProviderTransport { transport: "http", port: Some(9222), path: Some("/"), scheme: None }] }
2022-12-19T06:22:05.716212Z INFO ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_verifier::provider_client: Sending request HTTP Request ( method: GET, path: /test-regex-in-response-header, query: None, headers: Some({"Accept": ["application/json"]}), body: Missing )
2022-12-19T06:22:05.716219Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_verifier::provider_client: body:

2022-12-19T06:22:05.716352Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: hyper::client::pool: checkout waiting for idle connection: ("http", localhost:9222)
2022-12-19T06:22:05.716392Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: reqwest::connect: starting new connection: http://localhost:9222/
2022-12-19T06:22:05.716421Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: hyper::client::connect::http: Http::connect; scheme=Some("http"), host=Some("localhost"), port=Some(Port(9222))
2022-12-19T06:22:05.723027Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: hyper::client::connect::http: connecting to [::1]:9222
2022-12-19T06:22:05.723718Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: mio::poll: registering event source with poller: token=Token(0), interests=READABLE | WRITABLE
2022-12-19T06:22:05.723780Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: hyper::client::connect::http: connected to [::1]:9222
2022-12-19T06:22:05.723845Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: hyper::client::conn: client handshake Http1
2022-12-19T06:22:05.723880Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: hyper::client::client: handshake complete, spawning background dispatcher task
2022-12-19T06:22:05.723999Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: want: poll_want: taker wants!
2022-12-19T06:22:05.724028Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: hyper::client::pool: checkout dropped for ("http", localhost:9222)
2022-12-19T06:22:05.818816Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: hyper::client::pool: put; add idle connection for ("http", localhost:9222)
2022-12-19T06:22:05.818834Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: hyper::client::pool: pooling idle connection for ("http", localhost:9222)
2022-12-19T06:22:05.818856Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: reqwest::async_impl::client: response '200 OK' for http://localhost:9222/test-regex-in-response-header
2022-12-19T06:22:05.818887Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_verifier::provider_client: Received native response: Response { url: Url { scheme: "http", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("localhost")), port: Some(9222), path: "/test-regex-in-response-header", query: None, fragment: None }, status: 200, headers: {"content-length": "0", "date": "Mon, 19 Dec 2022 06:22:05 GMT", "server": "Kestrel", "regexheader": "validprovidervalue"} }
2022-12-19T06:22:05.818968Z INFO ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_verifier::provider_client: Received response: HTTP Response ( status: 200, headers: Some({"date": ["Mon", "19 Dec 2022 06:22:05 GMT"], "server": ["Kestrel"], "regexheader": ["validprovidervalue"], "content-length": ["0"]}), body: Empty )
2022-12-19T06:22:05.818978Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_verifier::provider_client: body:

2022-12-19T06:22:05.819000Z INFO ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_matching: comparing to expected response: HTTP Response ( status: 200, headers: Some({"regexheader": ["consumervalue"]}), body: Missing )
2022-12-19T06:22:05.819040Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_matching: expected content type = '/', actual content type = '/'
2022-12-19T06:22:05.819342Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_models::path_exp: Calculating weight for path tokens '[Root, Field("regexheader"), Index(0)]' and path '["$", "Content-Type"]'
2022-12-19T06:22:05.819354Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_models::path_exp: Calculated weight (0, 3) for path '$.regexheader[0]' and '["$", "Content-Type"]'
2022-12-19T06:22:05.819369Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_matching: content type header matcher = 'RuleList { rules: [], rule_logic: And, cascaded: false }'
2022-12-19T06:22:05.819388Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_models::matchingrules: matcher_is_defined: for category body and path [] -> false
2022-12-19T06:22:05.819416Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_models::path_exp: Calculating weight for path tokens '[Root, Field("regexheader"), Index(0)]' and path '["$", "regexheader"]'
2022-12-19T06:22:05.819424Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_models::path_exp: Calculated weight (0, 3) for path '$.regexheader[0]' and '["$", "regexheader"]'
2022-12-19T06:22:05.819432Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_models::matchingrules: matcher_is_defined: for category header and path ["$", "regexheader"] -> false
2022-12-19T06:22:05.819445Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:verify_interaction{interaction="any request"}: pact_matching::matchers: String -> String: comparing 'consumervalue' to 'validprovidervalue' ==> false cascaded=false matcher=Equality
2022-12-19T06:22:05.829024Z WARN ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: pact_matching::metrics:

Please note:
We are tracking events anonymously to gather important usage statistics like Pact version and operating system. To disable tracking, set the 'PACT_DO_NOT_TRACK' environment variable to 'true'.

2022-12-19T06:22:05.829090Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: pact_matching::metrics: Sending event to GA - {"ec": "ProviderTest", "aid": "pact-net", "tid": "UA-117778936-1", "t": "event", "cid": "0aba82903bd92d9ba7dc82dfeacd0325", "aip": "true", "ds": "client", "v": "1", "cd2": "unknown", "an": "pact-net", "cd6": "pact_ffi", "cd7": "0.12.12", "av": "4.3.0.0", "cd3": "windows-x86_64", "el": "Pacts verified", "ea": "Completed", "ev": "1"}
2022-12-19T06:22:05.841198Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: hyper::client::pool: checkout waiting for idle connection: ("https", www.google-analytics.com)
2022-12-19T06:22:05.841247Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: reqwest::connect: starting new connection: https://www.google-analytics.com/
2022-12-19T06:22:05.841283Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: hyper::client::connect::http: Http::connect; scheme=Some("https"), host=Some("www.google-analytics.com"), port=None
2022-12-19T06:22:05.849583Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: hyper::client::connect::http: connecting to 216.239.34.178:443
2022-12-19T06:22:05.849900Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: mio::poll: registering event source with poller: token=Token(16777216), interests=READABLE | WRITABLE
2022-12-19T06:22:05.867165Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: hyper::client::connect::http: connected to 216.239.34.178:443
2022-12-19T06:22:05.867217Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: rustls::client::hs: No cached session for DnsName(DnsName(DnsName("www.google-analytics.com")))
2022-12-19T06:22:05.867334Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: rustls::client::hs: Not resuming any session
2022-12-19T06:22:05.867379Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: rustls::client::hs: Sending ClientHello Message {
version: TLSv1_0,
payload: Handshake {
parsed: HandshakeMessagePayload {
typ: ClientHello,
payload: ClientHello(
ClientHelloPayload {
client_version: TLSv1_2,
random: 6b60aac6fb9c0fbc9c9e95190c80c60ab208971600f0c40116fad8d97058018e,
session_id: 4acf7b7f4a2cdba7ac39e5e85698a9404b56a06fd0909003d8f173f494baf70f,
cipher_suites: [
TLS13_AES_256_GCM_SHA384,
TLS13_AES_128_GCM_SHA256,
TLS13_CHACHA20_POLY1305_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
TLS_EMPTY_RENEGOTIATION_INFO_SCSV,
],
compression_methods: [
Null,
],
extensions: [
SupportedVersions(
[
TLSv1_3,
TLSv1_2,
],
),
ECPointFormats(
[
Uncompressed,
],
),
NamedGroups(
[
X25519,
secp256r1,
secp384r1,
],
),
SignatureAlgorithms(
[
ECDSA_NISTP384_SHA384,
ECDSA_NISTP256_SHA256,
ED25519,
RSA_PSS_SHA512,
RSA_PSS_SHA384,
RSA_PSS_SHA256,
RSA_PKCS1_SHA512,
RSA_PKCS1_SHA384,
RSA_PKCS1_SHA256,
],
),
ExtendedMasterSecretRequest,
CertificateStatusRequest(
OCSP(
OCSPCertificateStatusRequest {
responder_ids: [],
extensions: ,
},
),
),
ServerName(
[
ServerName {
typ: HostName,
payload: HostName(
(
7777772e676f6f676c652d616e616c79746963732e636f6d,
DnsName(
"www.google-analytics.com",
),
),
),
},
],
),
SignedCertificateTimestampRequest,
KeyShare(
[
KeyShareEntry {
group: X25519,
payload: e3695938955ad53bb5997296bd88f041d705140cef6eb8fa1fbb87df9ebe2879,
},
],
),
PresharedKeyModes(
[
PSK_DHE_KE,
],
),
Protocols(
[
6832,
687474702f312e31,
],
),
SessionTicket(
Request,
),
],
},
),
},
encoded: 0100010803036b60aac6fb9c0fbc9c9e95190c80c60ab208971600f0c40116fad8d97058018e204acf7b7f4a2cdba7ac39e5e85698a9404b56a06fd0909003d8f173f494baf70f0014130213011303c02cc02bcca9c030c02fcca800ff010000ab002b00050403040303000b00020100000a00080006001d00170018000d00140012050304030807080608050804060105010401001700000005000501000000000000001d001b0000187777772e676f6f676c652d616e616c79746963732e636f6d00120000003300260024001d0020e3695938955ad53bb5997296bd88f041d705140cef6eb8fa1fbb87df9ebe2879002d000201010010000e000c02683208687474702f312e3100230000,
},
}
2022-12-19T06:22:05.906083Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: rustls::client::hs: We got ServerHello ServerHelloPayload {
legacy_version: TLSv1_2,
random: 917552a187ea6bcd6f4b2209ac9c95a66eb7ceae2544eb51fba5a375b393f34a,
session_id: 4acf7b7f4a2cdba7ac39e5e85698a9404b56a06fd0909003d8f173f494baf70f,
cipher_suite: TLS13_AES_256_GCM_SHA384,
compression_method: Null,
extensions: [
KeyShare(
KeyShareEntry {
group: X25519,
payload: 9311cf2acd31e630ed32e2fbdc8752dd238de8a16cb036c345f2a42fd8c68c1a,
},
),
SupportedVersions(
TLSv1_3,
),
],
}
2022-12-19T06:22:05.906150Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: rustls::client::hs: Using ciphersuite TLS13_AES_256_GCM_SHA384
2022-12-19T06:22:05.906180Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: rustls::client::tls13: Not resuming
2022-12-19T06:22:05.906185Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: rustls::client::client_conn: EarlyData rejected
2022-12-19T06:22:05.906402Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: rustls::conn: Dropping CCS
2022-12-19T06:22:05.906518Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: rustls::client::tls13: TLS1.3 encrypted extensions: [Protocols([6832])]
2022-12-19T06:22:05.906527Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: rustls::client::hs: ALPN protocol is Some(b"h2")
2022-12-19T06:22:05.906561Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: rustls::client::tls13: Server cert is [Certificate(b"0\x82\x05\xe70\x82\x04\xcf\xa0\x03\x02\x01\x02\x02\x104]\xc8"\xd7Q\x96\xd2\x12\xcd\xd3\xb5\x03\xd9\x8ee0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\00F1\x0b0\t\x06\x03U\x04\x06\x13\x02US1"0 \x06\x03U\x04\n\x13\x19Google Trust Services LLC1\x130\x11\x06\x03U\x04\x03\x13\nGTS CA 1C30\x1e\x17\r221128081614Z\x17\r230220081613Z0!1\x1f0\x1d\x06\x03U\x04\x03\x0c\x16*.google-analytics.com0Y0\x13\x06\x07*\x86H\xce=\x02\x01\x06\x08*\x86H\xce=\x03\x01\x07\x03B\0\x04\x9cM9_P!\xe2Yn\xdbn\xc7\xc5\n@\xf3R4\xd2.\x97A&T\xbb#\xb6\x01\x14~\x1d\x10:\xcf~\x89\x10\xc4\xba\xc4\xdc\xedMC\xd6\x921\xb4w\xcc\xbb\xd1\xd9|\xb4\t\x15\x7f\x83/\xfc\xe7\xa8\xa3\x82\x03\xbf0\x82\x03\xbb0\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x07\x800\x13\x06\x03U\x1d%\x04\x0c0\n\x06\x08+\x06\x01\x05\x05\x07\x03\x010\x0c\x06\x03U\x1d\x13\x01\x01\xff\x04\x020\00\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\xce\xe3\xb8s\x05\xf9\xef\xb3V\xc8Q\x85\x9a2\xad\xc9\x1b\xa4Q\xe20\x1f\x06\x03U\x1d#\x04\x180\x16\x80\x14\x8at\x7f\xaf\x85\xcd\xee\x95\xcd=\x9c\xd0\xe2F\x14\xf3q5\x1d'0j\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04^0\\0'\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x1bhttp://ocsp.pki.goog/gts1c301\x06\x08+\x06\x01\x05\x05\x070\x02\x86%http://pki.goog/repo/certs/gts1c3.der0\x82\x01o\x06\x03U\x1d\x11\x04\x82\x01f0\x82\x01b\x82\x16*.google-analytics.com\x82\x1bregion1.app-measurement.com\x82\x13app-measurement.com\x82\x14google-analytics.com\x82\x1cregion1.google-analytics.com\x82\x18ssl.google-analytics.com\x82\x18www.google-analytics.com\x82\x1cregion1.analytics.google.com\x82\x14googletagmanager.com\x82\x18www.googletagmanager.com\x82\nurchin.com\x82\x12service.urchin.com\x82\x08fps.goog\x82\n*.fps.goog\x82\x12googleoptimize.com\x82\x16www.googleoptimize.com0!\x06\x03U\x1d \x04\x1a0\x180\x08\x06\x06g\x81\x0c\x01\x02\x010\x0c\x06\n+\x06\x01\x04\x01\xd6y\x02\x05\x030<\x06\x03U\x1d\x1f\x0450301\xa0/\xa0-\x86+http://crls.pki.goog/gts1c3/zdATt0Ex_Fk.crl0\x82\x01\x04\x06\n+\x06\x01\x04\x01\xd6y\x02\x04\x02\x04\x81\xf5\x04\x81\xf2\0\xf0\0v\0z2\x8cT\xd8\xb7-\xb6 \xea8\xe0R\x1e\xe9\x84\x16p2\x13\x85M;\xd2+\xc1:W\xa3R\xebR\0\0\x01\x84\xbd\x85\xdcm\0\0\x04\x03\0G0E\x02!\0\xd6\xa8H\x9f\x93\xc4\x1e]o\xedu\xfd6\x7f\xa4\xe8\xca\xf3\xb4\xa6\x08Qa\x10l\xb78\x81\xe3\xdd\xc8\x1e\x02 \t}\xd0\xfa/\x10\x9as0-\xae]*\x19\xf1\x84\"?\xc1\xd6\xba#\xad\xbe4\x9d\xa3\xe9\x96\x0858\0v\0\xe8>\xd0\xda>\xf5\x0652\xe7W(\xbc\x89k\xc9\x03\xd3\xcb\xd1\x11k\xec\xebi\xe1w}m\x06\xbdn\0\0\x01\x84\xbd\x85\xdc%\0\0\x04\x03\0G0E\x02 l\x17\xd0\x86KV&\x89Y\xd1\xaf\x9f\xce\x0fd\xe2)\x87Ce\xdf(\xbd\xd8,\x9eFa\xe4P\xc2\xdb\x02!\0\xec\xeb$gp\x974\xddlv\x03\xe3\xb5\xe6\xa7\x884\x11\xcb\xe3%\xbc\xa2\x95x\xd1\x84\x04O\x9d\x86\x8e0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\0\x03\x82\x01\x01\0[2\xae\xcd\xbb\xe8\x87^\xf2{5\x17\xa5\x95\x12}\x9dT 7\xd2\xd6k\xbaO\xabj\x13\x88\x10\xda\xc3\xff\xb4\x80B\xbf\n9%\x04I\x0e\x18\xde\x9707D\xa5\x1e\xf9G\xdcXf\xf21\x7f\t\xa7\xd6\xd7G\x02\x112\x16\x99\x97a_\x02HI\x9e\xe4\xd0\xe2\xd6\xe1U,SHc\xcff\x14\xd6g-k\xe6\x97\x92\xab\xd3\x99\xd8\xdfew\xd1\x7fG\xb8%N0F6Z\x1d\x1eH:\xd0\xfa\xa2\xe7=\xd1\xca8mOo_\xa9\xbb\xd0\xc8I\xb9\x9e\xe0\xa6\x7f\x9b\xa4\x93\xe9\x8d\xf1\\2t+#l\x86\t\x0c\xa5\x993=7#>\xe4_\xe42\x8b\x1d,c\xb3\x0b\xd11\xcf\xa39\xce+\x14\x1fG\xe64\xaf\xc6\xb2\xf7\xa4n\xe4wJ\x1f\x9a\xdfw*5\xaf\xa9\x94J\r\xda\xb8c\x12S\x19\xd5\x91\x88\xb2JM\xf9\x92\\\x13\xef\xb6\xdc\xb8\xa1\x95GcT\"\xc5\x9a\xd9*X\xb4i\xe1L\x13=\xf3\xe3\x0ee\xab\xf4K\x14\x81\xbc\xff@a\x9e\xc7\xe8"), Certificate(b"0\x82\x05\x960\x82\x03~\xa0\x03\x02\x01\x02\x02\r\x02\x03\xbcSYk4\xc7\x18\xf5\x01Pf0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\00G1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\"0 \x06\x03U\x04\n\x13\x19Google Trust Services LLC1\x140\x12\x06\x03U\x04\x03\x13\x0bGTS Root R10\x1e\x17\r200813000042Z\x17\r270930000042Z0F1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\"0 \x06\x03U\x04\n\x13\x19Google Trust Services LLC1\x130\x11\x06\x03U\x04\x03\x13\nGTS CA 1C30\x82\x01\"0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\0\x03\x82\x01\x0f\00\x82\x01\n\x02\x82\x01\x01\0\xf5\x88\xdf\xe7b\x8c\x1e7\xf87B\x90\x7fl\x87\xd0\xfbe\x82%\xfd\xe8\xcbk\xa4\xffm\xe9Z#\xe2\x99\xf6\x1c\xe9\x92\x03\x99\x13|\t\n\x8a\xfaB\xd6^V$\xaaz3\x84\x1f\xd1\xe9i\xbb\xb9t\xecWLfh\x93w7US\xfe9\x10M\xb74\xbb_%w7;\x17\x94\xea<\xe5\x9d\xd5\xbc\xc3\xb4C\xeb.\xa7G\xef\xb0D\x11c\xd8\xb4A\x85\xddA0H\x93\x1b\xbf\xb7\xf6\xe0E\x02!\xe0\x96B\x17\xcf\xd9+eV4\x07&\x04\r\xa8\xfd}\xca.\xef\xeaH|7M?\0\x9f\x83\xdf\xefu\x84.yW\\\xfcWn\x1a\x96\xff\xfc\x8c\x9a\xa6\x99\xbe%\xd9\x7f\x96,\x06\xf7\x11*\x02\x80\x80\xebc\x18<PI\x87\xe5\x8a\xca_\x19+Y\x96\x81\0\xa0\xfbQ\xdb\xcaw\x0b\x0b\xc9\x96O\xefpI\xc7\\m \xfd\x99\xb4\xb4\xe2\xca.w\xfd-\xdc\x0b\xb6k\x13\x0c\x8c\x19+\x17\x96\x98\xb9\xf0\x8b\xf6\xa0'\xbb\xb6\xe3\x8dQ\x8f\xbd\xae\xc7\x9b\xb1\x89\x9d\x02\x03\x01\0\x01\xa3\x82\x01\x800\x82\x01|0\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x01\x860\x1d\x06\x03U\x1d%\x04\x160\x14\x06\x08+\x06\x01\x05\x05\x07\x03\x01\x06\x08+\x06\x01\x05\x05\x07\x03\x020\x12\x06\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\x01\x01\xff\x02\x01\00\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\x8at\x7f\xaf\x85\xcd\xee\x95\xcd=\x9c\xd0\xe2F\x14\xf3q5\x1d'0\x1f\x06\x03U\x1d#\x04\x180\x16\x80\x14\xe4\xaf+&q\x1a+H'\x85/Rf,\xef\xf0\x89\x13q>0h\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04\\0Z0&\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x1ahttp://ocsp.pki.goog/gtsr100\x06\x08+\x06\x01\x05\x05\x070\x02\x86$http://pki.goog/repo/certs/gtsr1.der04\x06\x03U\x1d\x1f\x04-0+0)\xa0'\xa0%\x86#http://crl.pki.goog/gtsr1/gtsr1.crl0W\x06\x03U\x1d \x04P0N08\x06\n+\x06\x01\x04\x01\xd6y\x02\x05\x030*0(\x06\x08+\x06\x01\x05\x05\x07\x02\x01\x16\x1chttps://pki.goog/repository/0\x08\x06\x06g\x81\x0c\x01\x02\x010\x08\x06\x06g\x81\x0c\x01\x02\x020\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\0\x03\x82\x02\x01\0\x89}\xac \\\x0c<\xbe\x9a\xa8W\x95\x1b\xb4\xae\xfa\xab\xa5rq\xb46\x95\xfd\xdf@\x11\x03L\xc2F\x14\xbb\x14$\xab\xf0Pq\"\xdb\xad\xc4n\x7f\xcf\xf1jo\xc8\x83\x1b\xd8\xce\x89_\x87l\x87\xb8\xa9\x0c\xa3\x9b\xa1b\x94\x93\x95\xdf[\xaef\x19\x0b\x02\x96\x9e\xfc\xb5\xe7\x10i>z\xcbFI_F\xe1A\xb1\xd7\x98Me4\0\x80\x1a?O\x9fl\x7fI\0\x81SA\xa4\x92!\x82\x82\x1a\xf1\xa3D[*P\x12\x13M\xc1S6\xf3B\x08\xafT\xfa\x8ewS\x1bd8'\x17\t\xbdX\xc9\x1b|9-[\xf3\xce\xd4\xed\x97\xdb\x14\x03\xbf\tS$\x1f\xc2\x0c\x04y\x98&\xf2a\xf1SR\xfdB\x8c\x1bf+?\x15\xa1\xbb\xff\xf6\x9b\xe3\x81\x9a\x01\x06q\x895($\xdd\xe1\xbd\xeb\x19-\xe1H\xcb=Y\x83Q\xb4t\xc6\x9d|\xc6\xb1\x86[\xaf\xcc4\xc4\xd3\xcc\xd4\x81\x11\x95\0\xa1\xf4\x12\"\x01\xfa\xb4\x83q\xaf\x8c\xb7\x8cs$\xac7S\xc2\0\x90?\x11\xfe\\\xed6\x94\x10;\xbd)\xae\xe2\xc7:b;lc\xd9\x80\xbfYq\xacc'\xb9L\x17\xa0\xda\xf6s\x15\xbf*\xde\x8f\xf3\xa5l2\x813\x03\xd0\x86Qq\x994\xba\x93\x8d]\xb5QX\xf7\xb2\x93\xe8\x01\xf6Y\xbeq\x9b\xfdM(\xce\xcfm\xc7\x16\xdc\xf7\xd1\xd6F\x9b\xa7\xcak\xe9w\x0f\xfd\xa0\xb6\x1b#\x83\x1d\x10\x1a\xd9\t\0\x84\xe0D\xd3\xa2u#\xb34\x86\xf6 \xb0\xa4^\x10\x1d\xe0RF\0\x9d\xb1\x0f\x1f!pQ\xf5\x9a\xdd\x06\xfcU\xf4+\x0e3w\xc3KB\xc2\xf1w\x13\xfcs\x80\x94\xeb\x1f\xbb7?\xce\x02*f\xb0s\x1d2\xa52l2\xb0\x8e\xe0\xc4#\xff[}Mep\xac+\x9b=\xce\xdb\xe0m\x8e2\x80\xbe\x96\x9f\x92c\xbc\x97\xbb]\xb9\xf4\xe1q^*\xe4\xef\x03\"\xb1\x8ae:\x8f\xc0\x93e\xd4\x85\xcd\x0f\x0f[\x83Y\x16G\x16-\x9c$:\xc8\x80\xa6&\x14\x85\x9b\xf67\x9b\xaco\xf9\xc5\xc3\x06Q\xf3\xe2\x7f\xc5\xb1\x10\xbaQ\xf4\xdd"), Certificate(b"0\x82\x05b0\x82\x04J\xa0\x03\x02\x01\x02\x02\x10w\xbd\rl\xdb6\xf9\x1a\xea!\x0f\xc4\xf0X\xd3\r0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\00W1\x0b0\t\x06\x03U\x04\x06\x13\x02BE1\x190\x17\x06\x03U\x04\n\x13\x10GlobalSign nv-sa1\x100\x0e\x06\x03U\x04\x0b\x13\x07Root CA1\x1b0\x19\x06\x03U\x04\x03\x13\x12GlobalSign Root CA0\x1e\x17\r200619000042Z\x17\r280128000042Z0G1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\"0 \x06\x03U\x04\n\x13\x19Google Trust Services LLC1\x140\x12\x06\x03U\x04\x03\x13\x0bGTS Root R10\x82\x02\"0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\0\x03\x82\x02\x0f\00\x82\x02\n\x02\x82\x02\x01\0\xb6\x11\x02\x8b\x1e\xe3\xa1w\x9b;\xdc\xbf\x94>\xb7\x95\xa7@<\xa1\xfd\x82\xf9}2\x06\x82q\xf6\xf6\x8c\x7f\xfb\xe8\xdb\xbcj.\x97\x97\xa3\x8cK\xf9+\xf6\xb1\xf9\xce\x84\x1d\xb1\xf9\xc5\x97\xde\xef\xb9\xf2\xa3\xe9\xbc\x12\x89^\xa7\xaaR\xab\xf8#'\xcb\xa4\xb1\x9cc\xdb\xd7\x99~\xf0\n^\xebh\xa6\xf4\xc6ZG\rM\x103\xe3N\xb1\x13\xa3\xc8\x18lK\xec\xfc\t\x90\xdf\x9dd)%#\x07\xa1\xb4\xd2=.\xe0\xcf\xd2\t\x87\xbb\xcdH\xf0M\xc2\xc2z\x88\x8a\xbb\xba\xcfY\x19\xd6\xaf\x8f\xb0\x07\xb0\x9e1\xf1\x82\xc1\xc0\xdf.\xa6ml\x19\x0e\xb5\xd8~&\x1aE\x03=\xb0y\xa4\x94(\xad\x0f\x7f&\xe5\xa8\x08\xfe\x96\xe8<h\x94S\xee\x83:\x88+\x15\x96\t\xb2\xe0z\x8c.u\xd6\x9c\xeb\xa7Vd\x8f\x96Oh\xae=\x97\xc2\x84\x8f\xc0\xbc@\xc0\x0b\\xbd\xf6\x87\xb35l\xac\x18P\x7f\x84\xe0L\xcd\x92\xd3 \xe93\xbcR\x99\xaf2\xb5)\xb3%\xb4H\xf9r\xe1\xcad\xf7\xe6\x82\x10\x8d\xe8\x9d\xc2\x8a\x88\xfa8f\x8a\xfcc\xf9\x01\xf9x\xfd{\w\xfav\x87\xfa\xec\xdf\xb1\x0ey\x95W\xb4\xbd&\xef\xd6\x01\xd1\xeb\x16\n\xbb\x8e\x0b\xb5\xc5\xc5\x8aU\xab\xd3\xac\xea\x91K)\xcc\x19\xa42%N\xf1eD\xd0\x02\xce\xaa\xceI\xb4\xea\x9f|\x83\xb0@{\xe7C\xab\xa7l\xa3\x8f}\x89\x81\xfaL\xa5\xff\xd5\x8e\xc3\xceK\xe0\xb5\xd8\xb3\x8eE\xcfv\xc0\xed@+\xfdS\x0f\xb0\xa7\xd5;\r\xb1\x8a\xa2\x03\xde1\xad\xccw\xeao{>\xd6\xdf\x91"\x12\xe6\xbe\xfa\xd82\xfc\x10c\x14Qr\xde]\xd6\x16\x93\xbd)h3\xef:f\xec\x07\x8a&\xdf\x13\xd7Wex'\xde^I\x14\0\xa2\0\x7f\x9a\xa8!\xb6\xa9\xb1\x95\xb0\xa5\xb9\r\x16\x11\xda\xc7lH<@\xe0~\rZ\xcdV<\xd1\x97\x05\xb9\xcbK\xed9K\x9c\xc4?\xd2U\x13n$\xb0\xd6q\xfa\xf4\xc1\xba\xcc\xed\x1b\xf5\xfe\x81A\xd8\0\x98=:\xc8\xaez\x987\x18\x05\x95\x02\x03\x01\0\x01\xa3\x82\x0180\x82\x0140\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x01\x860\x0f\x06\x03U\x1d\x13\x01\x01\xff\x04\x050\x03\x01\x01\xff0\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\xe4\xaf+&q\x1a+H'\x85/Rf,\xef\xf0\x89\x13q>0\x1f\x06\x03U\x1d#\x04\x180\x16\x80\x14{f\x1aE\r\x97\xca\x89P/}\x04\xcd4\xa8\xff\xfc\xfdK0\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04T0R0%\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x19http://ocsp.pki.goog/gsr10)\x06\x08+\x06\x01\x05\x05\x070\x02\x86\x1dhttp://pki.goog/gsr1/gsr1.crt02\x06\x03U\x1d\x1f\x04+0)0'\xa0%\xa0#\x86!http://crl.pki.goog/gsr1/gsr1.crl0;\x06\x03U\x1d \x044020\x08\x06\x06g\x81\x0c\x01\x02\x010\x08\x06\x06g\x81\x0c\x01\x02\x020\r\x06\x0b+\x06\x01\x04\x01\xd6y\x02\x05\x03\x020\r\x06\x0b+\x06\x01\x04\x01\xd6y\x02\x05\x03\x030\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\0\x03\x82\x01\x01\04\xa4\x1e\xb1(\xa3\xd0\xb4v\x17\xa61z!\xe9\xd1R>\xc8\xdbt\x16A\x88\xb8=5\x1d\xed\xe4\xff\x93\xe1\_\xab\xbb\xea|\xcf\xdb\xe4\r\xd1\x8bW\xf2&o[\xbe\x17Fh\x947okz\xc8\xc0\x187\xfa%Q\xac\xech\xbf\xb2\xc8I\xfdZ\x9a\xca\x01#\xac\x84\x80+\x02\x8c\x99\x97\xebIj\x8cu\xd7\xc7\xde\xb2\xc9\x97\x9fXHW\x0e5\xa1\xe4\x1a\xd6\xfdo\x83\x81o\xef\x8c\xcf\x97\xaf\xc0\x85*\xf0\xf5Ni\t\x91-\xe1h\xb8\xc1+s\xe9\xd4\xd9\xfc"\xc07\x1f\x0bf\x1dI\xed\x02U\x8fg\xe12\xd7\xd3&\xbfp\xe3=\xf4gm=|\xe54\x88\xe32\xfa\xa7n\x06jo\xbd\x8b\x91\xee\x16K\xe8;\xa9\xb37\xe7\xc3D\xa4~\xd8l\xd7\xc7F\xf5\x92\x9b\xe7\xd5!\xbef\x92\x19\x94Ul\xd4)\xb2\r\xc1f[\xe2wIH(\xed\x9d\xd7\x1a3rS\xb3\x825\xcfb\x8b\xc9$\x8b\xa5\xb79\x0c\xbb~*A\xbfR\xcf\xfc\xa2\x96\xb6\xc2\x82?")]
2022-12-19T06:22:05.907128Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: hyper::client::client: ALPN negotiated h2, updating pool
2022-12-19T06:22:05.907137Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: hyper::client::conn: client handshake Http2
2022-12-19T06:22:05.907154Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: h2::client: binding client connection
2022-12-19T06:22:05.907195Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: h2::client: client connection bound
2022-12-19T06:22:05.907246Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:FramedWrite::buffer{frame=Settings { flags: (0x0), enable_push: 0, initial_window_size: 2097152, max_frame_size: 16384 }}: h2::codec::framed_write: send frame=Settings { flags: (0x0), enable_push: 0, initial_window_size: 2097152, max_frame_size: 16384 }
2022-12-19T06:22:05.907258Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:FramedWrite::buffer{frame=Settings { flags: (0x0), enable_push: 0, initial_window_size: 2097152, max_frame_size: 16384 }}: h2::frame::settings: encoding SETTINGS; len=18
2022-12-19T06:22:05.907263Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:FramedWrite::buffer{frame=Settings { flags: (0x0), enable_push: 0, initial_window_size: 2097152, max_frame_size: 16384 }}: h2::frame::settings: encoding setting; val=EnablePush(0)
2022-12-19T06:22:05.907266Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:FramedWrite::buffer{frame=Settings { flags: (0x0), enable_push: 0, initial_window_size: 2097152, max_frame_size: 16384 }}: h2::frame::settings: encoding setting; val=InitialWindowSize(2097152)
2022-12-19T06:22:05.907277Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:FramedWrite::buffer{frame=Settings { flags: (0x0), enable_push: 0, initial_window_size: 2097152, max_frame_size: 16384 }}: h2::frame::settings: encoding setting; val=MaxFrameSize(16384)
2022-12-19T06:22:05.907286Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}:FramedWrite::buffer{frame=Settings { flags: (0x0), enable_push: 0, initial_window_size: 2097152, max_frame_size: 16384 }}: h2::codec::framed_write: encoded settings rem=27
2022-12-19T06:22:05.907335Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: h2::proto::streams::flow_control: inc_window; sz=65535; old=0; new=65535
2022-12-19T06:22:05.907342Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: h2::proto::streams::flow_control: inc_window; sz=65535; old=0; new=65535
2022-12-19T06:22:05.907345Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: h2::proto::streams::prioritize: Prioritize::new; flow=FlowControl { window_size: Window(65535), available: Window(65535) }
2022-12-19T06:22:05.907363Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: h2::proto::streams::recv: set_target_connection_window; target=5242880; available=65535, reserved=0
2022-12-19T06:22:05.907385Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: hyper::client::client: handshake complete, spawning background dispatcher task
2022-12-19T06:22:05.907464Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: want: poll_want: taker wants!
2022-12-19T06:22:05.907472Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: hyper::client::pool: put; add idle connection for ("https", www.google-analytics.com)
2022-12-19T06:22:05.907482Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: hyper::client::pool: pooling idle connection for ("https", www.google-analytics.com)
2022-12-19T06:22:05.907496Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: hyper::client::pool: checkout dropped for ("https", www.google-analytics.com)
2022-12-19T06:22:05.984586Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: reqwest::async_impl::client: response '200 OK' for https://www.google-analytics.com/collect
2022-12-19T06:22:05.984668Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: h2::proto::streams::streams: drop_stream_ref; stream=Stream { id: StreamId(1), state: State { inner: Closed(EndStream) }, is_counted: false, ref_count: 1, next_pending_send: None, is_pending_send: false, send_flow: FlowControl { window_size: Window(65305), available: Window(0) }, requested_send_capacity: 0, buffered_send_data: 0, send_task: Some(Waker { data: 0x24cf7da87c0, vtable: 0x7ffc60e4cdf0 }), pending_send: Deque { indices: None }, next_pending_send_capacity: None, is_pending_send_capacity: false, send_capacity_inc: true, next_open: None, is_pending_open: false, is_pending_push: false, next_pending_accept: None, is_pending_accept: false, recv_flow: FlowControl { window_size: Window(2097117), available: Window(2097117) }, in_flight_recv_data: 35, next_window_update: None, is_pending_window_update: false, reset_at: None, next_reset_expire: None, pending_recv: Deque { indices: None }, recv_task: None, pending_push_promises: Queue { indices: None, _p: PhantomData }, content_length: Remaining(0) }
2022-12-19T06:22:05.984684Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: h2::proto::streams::recv: auto-release closed stream (StreamId(1)) capacity: 35
2022-12-19T06:22:05.984688Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: h2::proto::streams::recv: release_connection_capacity; size=35, connection in_flight_data=35
2022-12-19T06:22:05.984690Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: h2::proto::streams::counts: transition_after; stream=StreamId(1); state=State { inner: Closed(EndStream) }; is_closed=true; pending_send_empty=true; buffered_send_data=0; num_recv=0; num_send=0
2022-12-19T06:22:05.992022Z DEBUG ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: pact_plugin_driver::plugin_manager: Shutting down all plugins
2022-12-19T06:22:05.992037Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: pact_plugin_driver::plugin_manager: shutdown_plugins ThreadId(1): Waiting on PLUGIN_REGISTER lock
2022-12-19T06:22:05.992041Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: pact_plugin_driver::plugin_manager: shutdown_plugins ThreadId(1): Got PLUGIN_REGISTER lock
2022-12-19T06:22:05.992044Z TRACE ThreadId(01) pactffi_verifier_execute{handle=0x24cf7b723a0}: pact_plugin_driver::plugin_manager: shutdown_plugins ThreadId(1): Releasing PLUGIN_REGISTER lock

@vcalatayud
Copy link
Author

For some reason it is comparing the values:
image

With V2 it was using the regex:
image

@mefellows
Copy link
Member

Thanks. I think raising this is a PR is slightly confusing, as you're not looking to incorporate this change in the code right?

It is helpful for a repro for an issue though, so perhaps we ought to convert this to an issue?

@mefellows mefellows added the bug Indicates an unexpected problem or unintended behavior label Dec 19, 2022
@vcalatayud
Copy link
Author

This is the contract generated with V2, which works:

{
  "consumer": {
    "name": "Event API Consumer"
  },
  "interactions": [
    {
      "description": "any request",
      "request": {
        "headers": {
          "Accept": "application/json"
        },
        "method": "GET",
        "path": "/test-regex-in-response-header"
      },
      "response": {
        "headers": {
          "regexheader": "consumervalue"
        },
        "matchingRules": {
          "$.header.$.regexheader[0]": {
            "match": "regex",
            "regex": "^[a-z]+$"
          }
        },
        "status": 200
      }
    }
  ],
  "metadata": {
    "pactRust": {
      "ffi": "0.3.11",
      "models": "0.4.5"
    },
    "pactSpecification": {
      "version": "2.0.0"
    }
  },
  "provider": {
    "name": "Event API"
  }
}

And this is the contract generated with V3:

{
  "consumer": {
    "name": "Event API Consumer"
  },
  "interactions": [
    {
      "description": "any request",
      "request": {
        "headers": {
          "Accept": "application/json"
        },
        "method": "GET",
        "path": "/test-regex-in-response-header"
      },
      "response": {
        "headers": {
          "regexheader": "consumervalue"
        },
        "matchingRules": {
          "header": {
            "$.regexheader[0]": {
              "combine": "AND",
              "matchers": [
                {
                  "match": "regex",
                  "regex": "^[a-z]+$"
                }
              ]
            }
          }
        },
        "status": 200
      }
    }
  ],
  "metadata": {
    "pactRust": {
      "ffi": "0.3.11",
      "models": "0.4.5"
    },
    "pactSpecification": {
      "version": "3.0.0"
    }
  },
  "provider": {
    "name": "Event API"
  }
}

@vcalatayud
Copy link
Author

They only differ in the way to describe the matching rules

V2:

"matchingRules": {
          "$.header.$.regexheader[0]": {
            "match": "regex",
            "regex": "^[a-z]+$"
          }
        },

V3:

"matchingRules": {
          "header": {
            "$.regexheader[0]": {
              "combine": "AND",
              "matchers": [
                {
                  "match": "regex",
                  "regex": "^[a-z]+$"
                }
              ]
            }
          }
        },

@vcalatayud
Copy link
Author

If I manually remove the "[0]" from the V3 contract then it gets correctly verified. So this also works:

"matchingRules": {
          "header": {
            "$.regexheader": {
              "combine": "AND",
              "matchers": [
                {
                  "match": "regex",
                  "regex": "^[a-z]+$"
                }
              ]
            }
          }
        },

@mefellows
Copy link
Member

I'll need my dear friend @uglyog to help me with this one. Does this look like a bug, and if so, should we move it to pact-reference?

@rholshausen
Copy link

Looks like a bug in the pact_models crate

@mefellows
Copy link
Member

Created an upstream issue to track this here: pact-foundation/pact-reference#238

@mefellows
Copy link
Member

This is a duplicate of #420 I think.

@adamrodger
Copy link
Contributor

Closing as we're not looking to merge this. The issue is covered under #420

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Indicates an unexpected problem or unintended behavior
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants