Additional HTTP Headers (#67)

* Allow Additional HTTP Headers

* Add AdditionalHeader Tests

* Use http.Header as AdditionalHeader type
diff --git a/whisk/client.go b/whisk/client.go
index d4e8afc..7b4862f 100644
--- a/whisk/client.go
+++ b/whisk/client.go
@@ -74,18 +74,19 @@
 }
 
 type Config struct {
-	Namespace        string // NOTE :: Default is "_"
-	Cert             string
-	Key              string
-	AuthToken        string
-	Host             string
-	BaseURL          *url.URL // NOTE :: Default is "openwhisk.ng.bluemix.net"
-	Version          string
-	Verbose          bool
-	Debug            bool // For detailed tracing
-	Insecure         bool
-	UserAgent        string
-	ApigwAccessToken string
+	Namespace         string // NOTE :: Default is "_"
+	Cert              string
+	Key               string
+	AuthToken         string
+	Host              string
+	BaseURL           *url.URL // NOTE :: Default is "openwhisk.ng.bluemix.net"
+	Version           string
+	Verbose           bool
+	Debug             bool // For detailed tracing
+	Insecure          bool
+	UserAgent         string
+	ApigwAccessToken  string
+	AdditionalHeaders http.Header
 }
 
 type ObfuscateSet struct {
@@ -283,6 +284,10 @@
 
 	req.Header.Add("User-Agent", c.Config.UserAgent)
 
+	for key := range c.Config.AdditionalHeaders {
+		req.Header.Add(key, c.Config.AdditionalHeaders.Get(key))
+	}
+
 	return req, nil
 }
 
@@ -778,5 +783,9 @@
 
 	req.Header.Add("User-Agent", c.Config.UserAgent)
 
+	for key := range c.Config.AdditionalHeaders {
+		req.Header.Add(key, c.Config.AdditionalHeaders.Get(key))
+	}
+
 	return req, nil
 }
diff --git a/whisk/client_test.go b/whisk/client_test.go
index 1752b40..ec27b63 100644
--- a/whisk/client_test.go
+++ b/whisk/client_test.go
@@ -140,3 +140,31 @@
 		assert.Contains(t, err.Error(), proxyhost, "Setting HTTPS_PROXY to '"+proxyhost+"' did not cause the CLI to use that proxy URL.")
 	}
 }
+
+func TestAdditionalHeaders(t *testing.T) {
+	config := GetValidConfigTest()
+	config.AdditionalHeaders = make(map[string][]string)
+	config.AdditionalHeaders.Add("Key1", "Value1")
+	config.AdditionalHeaders.Add("Key2", "Value2")
+
+	client, _ := NewClient(nil, config)
+	assert.NotNil(t, client)
+
+	newRequest, newRequestErr := client.NewRequest("GET", config.BaseURL.String(), nil, false)
+	assert.Nil(t, newRequestErr, "NewRequest for proxy test failed.")
+	if newRequestErr != nil {
+		fmt.Printf("NewRequest() error: %s\n", newRequestErr.Error())
+	}
+
+	assert.Equal(t, "Value1", newRequest.Header.Get("Key1"))
+	assert.Equal(t, "Value2", newRequest.Header.Get("Key2"))
+
+	newRequestUrl, newRequestUrlErr := client.NewRequestUrl("GET", config.BaseURL, nil, false, false, "", false)
+	assert.Nil(t, newRequestUrlErr, "NewRequest for proxy test failed.")
+	if newRequestUrlErr != nil {
+		fmt.Printf("NewRequest() error: %s\n", newRequestUrlErr.Error())
+	}
+
+	assert.Equal(t, "Value1", newRequestUrl.Header.Get("Key1"))
+	assert.Equal(t, "Value2", newRequestUrl.Header.Get("Key2"))
+}