diff --git a/docs/readme.md b/docs/readme.md index b97d175b..01516ae7 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -60,6 +60,30 @@ const retryingDbProfile = withRetrying(dbProfile, { const client = createClient(retryingDbProfile, 'my-awesome-program') ``` +## User agent randomization + +By default, `hafas-client` randomizes the client name that you pass into `createClient`, and sends it as [`User-Agent`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent) in a randomized form: + +```js +const createClient('hafas-client') +// … +const client = createClient(someProfile, 'my-awesome-program') + +await client.journeys(/* … */) +// User-Agent: my-awee70429some-pre70429ogram +await client.journeys(/* … */) +// User-Agent: my-awesom9bb8e2e-prog9bb8e2ram +``` + +You can turn this off by setting `profile.randomizeUserAgent` to `false`: + +```js +const client = createClient({ + ...someProfile, + randomizeUserAgent: false, +}, 'my-awesome-program') +``` + ## Logging requests You can use `profile.logRequest` and `profile.logResponse` to process the raw [Fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) and [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response), respectively. diff --git a/lib/default-profile.js b/lib/default-profile.js index a0ed5f11..2207c307 100644 --- a/lib/default-profile.js +++ b/lib/default-profile.js @@ -65,6 +65,7 @@ const defaultProfile = { salt: null, addChecksum: false, addMicMac: false, + randomizeUserAgent: true, logRequest, logResponse, diff --git a/lib/request.js b/lib/request.js index 5faf6293..d155ebbe 100644 --- a/lib/request.js +++ b/lib/request.js @@ -66,7 +66,6 @@ const randomizeUserAgent = (userAgent) => { const md5 = input => createHash('md5').update(input).digest() -// todo [breaking]: remove userAgent parameter const request = (ctx, userAgent, reqData) => { const {profile, opt} = ctx @@ -92,7 +91,9 @@ const request = (ctx, userAgent, reqData) => { 'Content-Type': 'application/json', 'Accept-Encoding': 'gzip, br, deflate', 'Accept': 'application/json', - 'user-agent': randomizeUserAgent(userAgent), + 'user-agent': profile.randomizeUserAgent + ? randomizeUserAgent(userAgent) + : userAgent, 'connection': 'keep-alive', // prevent excessive re-connecting }, redirect: 'follow', diff --git a/test/e2e/lib/util.js b/test/e2e/lib/util.js index f777dc64..fd01932d 100644 --- a/test/e2e/lib/util.js +++ b/test/e2e/lib/util.js @@ -43,6 +43,7 @@ if (process.env.VCR_MODE && !process.env.VCR_OFF) { const replayer = require('replayer') replayer.configure({ headerWhitelist: [ + // excludes User-Agent & Connection 'Content-Type', 'Accept-Encoding', 'Accept', ], includeHeaderValues: true,