Skip to content

Commit

Permalink
wip: demonstrate how we can log request/responses from consumer side
Browse files Browse the repository at this point in the history
  • Loading branch information
mefellows committed Jun 9, 2020
1 parent ec503fd commit 8f53e29
Showing 1 changed file with 51 additions and 0 deletions.
51 changes: 51 additions & 0 deletions src/httpPact.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { PactOptions, PactOptionsComplete } from "./dsl/options"
import { Server } from "@pact-foundation/pact-node/src/server"
import VerificationError from "./errors/verificationError"
import ConfigurationError from "./errors/configurationError"
import { ClientRequest, RequestOptions, IncomingMessage } from "http"

/**
* Creates a new {@link PactProvider}.
Expand Down Expand Up @@ -59,6 +60,56 @@ export class Pact {
logger.level(this.opts.logLevel as LogLevels)
serviceFactory.logLevel(this.opts.logLevel)

// TODO: extract out of here
// TODO: update pact-node user-agent so that internal requests can be easily ignored/differentiated
// TODO: compare with registered interactions, and improve error messaging if expected calls aren't coming through
if (this.opts.logLevel === "trace") {
const http = require("http")
const originalRequest = http.request

http.request = (options: RequestOptions, cb: any): ClientRequest => {
const requestBodyChunks: Buffer[] = []
const responseBodyChunks: Buffer[] = []

const hijackedCalback = (res: any) => {
logger.trace("outgoing request", {
...options,
body: Buffer.concat(requestBodyChunks).toString("utf8"),
})

if (cb) {
return cb(res)
}
}

const clientRequest: ClientRequest = originalRequest(
options,
hijackedCalback
)
const oldWrite = clientRequest.write.bind(clientRequest)

clientRequest.write = (chunk: any) => {
requestBodyChunks.push(Buffer.from(chunk))
return oldWrite(chunk)
}

clientRequest.on("response", (incoming: IncomingMessage) => {
incoming.on("readable", () => {
responseBodyChunks.push(Buffer.from(incoming.read()))
})
incoming.on("end", () => {
logger.trace({
body: Buffer.concat(responseBodyChunks).toString("utf8"),
headers: incoming.headers,
statusCode: incoming.statusCode,
})
})
})

return clientRequest
}
}

this.createServer(config)
}

Expand Down

0 comments on commit 8f53e29

Please sign in to comment.