You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by ja...@apache.org on 2018/09/11 13:45:28 UTC
[incubator-openwhisk-client-js] branch master updated: fix missing
pass-through of user-agent in namespace.list and .get,
and activation.get (#136)
This is an automated email from the ASF dual-hosted git repository.
jamesthomas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk-client-js.git
The following commit(s) were added to refs/heads/master by this push:
new 2934497 fix missing pass-through of user-agent in namespace.list and .get, and activation.get (#136)
2934497 is described below
commit 29344973dd0960f533f317cedf99726ce49083a0
Author: Nick Mitchell <st...@users.noreply.github.com>
AuthorDate: Tue Sep 11 09:45:25 2018 -0400
fix missing pass-through of user-agent in namespace.list and .get, and activation.get (#136)
also add a noUserAgent option, to prevent assigning a default user-agent
Fixes #135
---
README.md | 8 ++++
lib/activations.js | 2 +-
lib/client.js | 12 +++++-
lib/namespaces.js | 14 +++----
test/unit/activations.test.js | 17 ++++++++
test/unit/namespaces.test.js | 92 +++++++++++++++++++++++++++++++++++++++++++
6 files changed, 135 insertions(+), 10 deletions(-)
diff --git a/README.md b/README.md
index dd4a346..c0cdf52 100644
--- a/README.md
+++ b/README.md
@@ -123,6 +123,14 @@ option to the API calls themselves. For example, one might specify a
ow.actions.invoke({ 'User-Agent': 'myClient', name, params })
```
+In some cases, you may need to have *no* User-Agent header. To
+override the default header behavior, you may pass `noUserAgent: true`
+in your options structure, e.g.
+
+```javascript
+ow.actions.invoke({ noUserAgent: true, name, params })
+```
+
## Examples
### invoke action, blocking for result
diff --git a/lib/activations.js b/lib/activations.js
index 055d479..38bb042 100644
--- a/lib/activations.js
+++ b/lib/activations.js
@@ -30,7 +30,7 @@ class Activations extends BaseOperation {
const id = this.getActivation(options)
const namespace = this.namespace(options)
const urlPath = `namespaces/${namespace}/activations/${id}` + (path ? `/${path}` : '')
- return this.client.request('GET', urlPath)
+ return this.client.request('GET', urlPath, options)
}
getActivation (options) {
diff --git a/lib/client.js b/lib/client.js
index 7dd0982..180a5b9 100644
--- a/lib/client.js
+++ b/lib/client.js
@@ -67,6 +67,7 @@ class Client {
* @param {string} [options.apigw_token]
* @param {string} [options.apigw_space_guid]
* @param {Function} [options.auth_handler]
+ * @param {boolean} [options.noUserAgent]
*/
constructor (options) {
this.options = this.parseOptions(options || {})
@@ -98,7 +99,7 @@ class Client {
throw new Error(`${messages.INVALID_OPTIONS_ERROR} Missing either api or apihost parameters.`)
}
- return {apiKey: apiKey, api, ignoreCerts: ignoreCerts, namespace: options.namespace, apigwToken: apigwToken, apigwSpaceGuid: apigwSpaceGuid, authHandler: options.auth_handler}
+ return {apiKey: apiKey, api, ignoreCerts: ignoreCerts, namespace: options.namespace, apigwToken: apigwToken, apigwSpaceGuid: apigwSpaceGuid, authHandler: options.auth_handler, noUserAgent: options.noUserAgent}
}
urlFromApihost (apihost) {
@@ -120,7 +121,7 @@ class Client {
params (method, path, options) {
return this.authHeader().then(header => {
- return Object.assign({
+ const parms = Object.assign({
json: true,
method: method,
url: this.pathUrl(path),
@@ -130,6 +131,13 @@ class Client {
Authorization: header
}
}, options)
+
+ if (this.options.noUserAgent || parms.noUserAgent) {
+ // caller asked for no user agent?
+ parms.headers['User-Agent'] = undefined
+ }
+
+ return parms
})
}
diff --git a/lib/namespaces.js b/lib/namespaces.js
index e9d8a81..940dd49 100644
--- a/lib/namespaces.js
+++ b/lib/namespaces.js
@@ -6,15 +6,15 @@
const BaseOperation = require('./base_operation')
class Namespaces extends BaseOperation {
- list () {
- return this.client.request('GET', 'namespaces')
+ list (options) {
+ return this.client.request('GET', 'namespaces', options)
}
- get () {
- let actions = this.client.request('GET', 'namespaces/_/actions')
- let packages = this.client.request('GET', 'namespaces/_/packages')
- let triggers = this.client.request('GET', 'namespaces/_/triggers')
- let rules = this.client.request('GET', 'namespaces/_/rules')
+ get (options) {
+ let actions = this.client.request('GET', 'namespaces/_/actions', options)
+ let packages = this.client.request('GET', 'namespaces/_/packages', options)
+ let triggers = this.client.request('GET', 'namespaces/_/triggers', options)
+ let rules = this.client.request('GET', 'namespaces/_/rules', options)
return Promise
.all([actions, packages, triggers, rules])
.then(([actions, packages, triggers, rules]) => ({actions, packages, triggers, rules}))
diff --git a/test/unit/activations.test.js b/test/unit/activations.test.js
index 6058342..d0dd2b2 100644
--- a/test/unit/activations.test.js
+++ b/test/unit/activations.test.js
@@ -72,6 +72,23 @@ test('should retrieve an activation', t => {
return activations.get({name: activationId})
})
+test('should retrieve an activation passing through user-agent header', t => {
+ t.plan(3)
+ const ns = '_'
+ const client = {}
+ const activations = new Activations(client)
+ const activationId = 'random_id'
+ const userAgent = 'userAgentShouldPassThroughPlease'
+
+ client.request = (method, path, options) => {
+ t.is(method, 'GET')
+ t.is(path, `namespaces/${ns}/activations/${activationId}`)
+ t.is(options['User-Agent'], userAgent)
+ }
+
+ return activations.get({name: activationId, 'User-Agent': userAgent})
+})
+
test('should retrieve an activation using alt id parameter', t => {
t.plan(2)
const ns = '_'
diff --git a/test/unit/namespaces.test.js b/test/unit/namespaces.test.js
index 2b543ed..fab8a6a 100644
--- a/test/unit/namespaces.test.js
+++ b/test/unit/namespaces.test.js
@@ -4,6 +4,7 @@
'use strict'
const test = require('ava')
+const Client = require('../../lib/client')
const Namespaces = require('../../lib/namespaces')
test('should list all namespaces', t => {
@@ -18,6 +19,80 @@ test('should list all namespaces', t => {
return namespaces.list()
})
+test('should list all namespaces, passing through user-agent header', t => {
+ t.plan(3)
+ const client = {}
+ const userAgent = 'userAgentShouldPassThroughPlease'
+ client.request = (method, path, options) => {
+ t.is(method, 'GET')
+ t.is(path, `namespaces`)
+ t.is(options['User-Agent'], userAgent)
+ }
+
+ const namespaces = new Namespaces(client)
+ return namespaces.list({'User-Agent': userAgent})
+})
+
+test('should list all namespaces, NOT passing through user-agent header (variant 1)', t => {
+ t.plan(3)
+ const client = {}
+ const userAgent = 'userAgentShouldPassThroughPlease'
+ client.request = async (method, path, options) => {
+ t.is(method, 'GET')
+ t.is(path, `namespaces`)
+
+ const parms = await new Client({api: 'aaa', api_key: 'aaa'}).params(method, path, options)
+ t.is(parms.headers['User-Agent'], undefined)
+ }
+
+ const namespaces = new Namespaces(client)
+ return namespaces.list({'User-Agent': userAgent, noUserAgent: true})
+})
+
+test('should list all namespaces, NOT passing through user-agent header (variant 2)', t => {
+ t.plan(3)
+ const client = {}
+ const userAgent = 'userAgentShouldPassThroughPlease'
+ client.request = async (method, path, options) => {
+ t.is(method, 'GET')
+ t.is(path, `namespaces`)
+
+ const parms = await new Client({api: 'aaa', api_key: 'aaa', noUserAgent: true}).params(method, path, options)
+ t.is(parms.headers['User-Agent'], undefined)
+ }
+
+ const namespaces = new Namespaces(client)
+ return namespaces.list({'User-Agent': userAgent})
+})
+
+test('should list all namespaces, NOT passing through user-agent header (variant 3)', t => {
+ t.plan(3)
+ const client = {}
+ client.request = async (method, path, options) => {
+ t.is(method, 'GET')
+ t.is(path, `namespaces`)
+
+ const parms = await new Client({api: 'aaa', api_key: 'aaa', noUserAgent: true}).params(method, path, options)
+ t.is(parms.headers['User-Agent'], undefined)
+ }
+
+ const namespaces = new Namespaces(client)
+ return namespaces.list({})
+})
+
+test('should list all namespaces, NOT passing through user-agent header (variant 4)', t => {
+ t.plan(3)
+ const client = {}
+ client.request = (method, path, options) => {
+ t.is(method, 'GET')
+ t.is(path, `namespaces`)
+ t.is(options['User-Agent'], undefined)
+ }
+
+ const namespaces = new Namespaces(client)
+ return namespaces.list({noUserAgent: true})
+})
+
test('should retrieve namespace entities', t => {
t.plan(16)
const client = {}
@@ -32,3 +107,20 @@ test('should retrieve namespace entities', t => {
const namespaces = new Namespaces(client)
return namespaces.get()
})
+
+test('should retrieve namespace entities, passing through user-agent header', t => {
+ t.plan(20)
+ const client = {}
+ const userAgent = 'userAgentShouldPassThroughPlease'
+ client.request = (method, path, options) => {
+ t.is(method, 'GET')
+ let parts = path.split('/')
+ t.is(parts[0], 'namespaces')
+ t.is(parts[1], '_')
+ t.is(['actions', 'triggers', 'rules', 'packages'].indexOf(parts[2]) > -1, true)
+ t.is(options['User-Agent'], userAgent)
+ }
+
+ const namespaces = new Namespaces(client)
+ return namespaces.get({'User-Agent': userAgent})
+})