pact-foundation / pact-mock_service

Provides a mock service for use with Pact
https://pact.io
MIT License
73 stars 69 forks source link

Pact mock server not returning proper CORS headers #72

Closed alagesann closed 6 years ago

alagesann commented 7 years ago

My Pact mock server is listening in different port from my tests and my pact mock server is running with following configuration:

const provider = pact({ consumer: 'myconsumer', provider: 'myprovider', port: 8989, cors: true, log: path.resolve(process.cwd(), 'logs', 'pact.log'), dir: path.resolve(process.cwd(), 'pacts'), logLevel: 'DEBUG', spec: 1 });

I request the above mock server using 'axios' and the request is matched with one of the interaction i have configured on the provider (as per pact.log). But response always throws error with CORS.

My pact log has following information: Received OPTIONS request for mock service administration endpoint POST /interactions. Returning CORS headers: {"Access-Control-Allow-Origin":"null","Access-Control-Allow-Headers":"x-pact-mock-service","Access-Control-Allow-Methods":"DELETE, POST, GET, HEAD, PUT, TRACE, CONNECT, PATCH"}.

why is Access-Control-Allow-Origin is null instead of '*'. ?

How can i disable CORS security completely with tests as the final resorts when i use webpack, npm and mocha based tests.?

bethesque commented 7 years ago

Your Http-Origin header appears to be empty: https://github.com/pact-foundation/pact-mock_service/blob/7d4fd1f8ec6b6f6f118aae56fe6373ebc4f83972/lib/pact/consumer/mock_service/cors_origin_header_middleware.rb#L26

bethesque commented 7 years ago

Here's some documentation on using CORS with the mock service. https://github.com/pact-foundation/pact-mock_service/wiki/Using-the-mock-service-with-CORS

alagesann commented 7 years ago

Why is http-origin header empty when pact mock service is created with cors enabled ( Please note pact mock service creation config above with cors: true). cors_origin_header_middleware adds the 'Access-Control-Allow-Origin with value of '*' when i create pact mock service with cors enabled. but thats not seems to work for me as i have cors enabled and Access-Control-Allow-Origin is still null.

bethesque commented 7 years ago
def add_cors_header env, response
  [response[0], response[1].merge('Access-Control-Allow-Origin' => env.fetch('HTTP_ORIGIN','*')), response[2]]
end

env.fetch will return the second argument if the given key is not found. As env.fetch('HTTP_ORIGIN','*') is returning nil, it suggests that you have an Http-Origin header set with an empty value.

alagesann commented 7 years ago

Thanks for clarifying it.

i am using mocha to fire my tests and for a react-action in testing, it logs the following request in pact.log:

I, [2017-07-17T11:34:55.421448 #15431] INFO -- : Received request GET /mydata?address=75001 D, [2017-07-17T11:34:55.421542 #15431] DEBUG -- : { "path": "/mydata", "query": "address=75001", "method": "get", "headers": { "Accept": "application/json", "Referer": "about:blank", "User-Agent": "Node.js (darwin; U; rv:v7.10.0) AppleWebKit/537.36 (KHTML, like Gecko)", "Accept-Language": "en", "Origin": "null", "Host": "localhost:8989", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive", "Version": "HTTP/1.1" } }

Here "Origin": "null" is populated automatically and even though request matches with the interaction and generates the pact file but the response is not returned from mock server. How do i resolve the issue now?

alagesann commented 7 years ago

My local nodejs was automatically populating the request header with origin null. Pact started working fine when i fixed it. Thanks for your time. @bethesque

bethesque commented 7 years ago

No worries, glad you've fixed it.