added eurekaclient; flags for oauth plugin
diff --git a/eurekaclient/eureka-client.json b/eurekaclient/eureka-client.json
new file mode 100644
index 0000000..9f18ea1
--- /dev/null
+++ b/eurekaclient/eureka-client.json
@@ -0,0 +1,15 @@
+{
+	"instance":{
+		"app": "microgateway",
+		"vipAddress": "microgateway",
+		"dataCenterInfo":{
+		  "name": "MyOwn"
+		},
+		"port": {}
+	},
+	"eureka":{
+		"host": "localhost",
+		"port": 8761,
+		"servicePath": "/eureka/apps/"
+	}	
+}
\ No newline at end of file
diff --git a/eurekaclient/index.js b/eurekaclient/index.js
new file mode 100644
index 0000000..49d1969
--- /dev/null
+++ b/eurekaclient/index.js
@@ -0,0 +1,82 @@
+'use strict';
+/**
+ * This plugin integrate with Eureka and gets the target
+ * endpoint dynamically. 
+ */
+
+var debug = require('debug')('plugin:eurekeclient');
+var util = require('util');
+var os = require('os');
+var config = require('./eureka-client.json');
+
+const lookup = require('./servicelookup.json');
+const port = 8000;
+const Eureka = require('eureka-js-client').Eureka;
+
+
+function getIPAddr() {
+  var interfaces = os.networkInterfaces();
+  var addresses = [];
+  for (var k in interfaces) {
+      for (var k2 in interfaces[k]) {
+          var address = interfaces[k][k2];
+          if (address.family === 'IPv4' && !address.internal) {
+              addresses.push(address.address);
+          }
+      }
+  }
+  return addresses[0];  
+}
+
+config.instance.hostName = os.hostname();
+config.instance.ipAddr = getIPAddr();
+config.instance.port["$"] = port;
+config.instance.port["@enabled"] = true;
+config.instance.dataCenterInfo["@class"] = "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo";
+
+const client = new Eureka(config);
+
+client.start();
+
+module.exports.init = function (config, logger, stats) {
+
+  function getAppName(url) {
+    for (var index in lookup) {
+      if (url.includes(lookup[index].uri) || url == lookup[index].uri) {
+        return {
+                  app: lookup[index].app,
+                  secure: lookup[index].secure
+               };
+      }
+    }
+    return "";
+  }
+
+  function getTarget(app, secure) {
+    var instances = client.getInstancesByAppId(app);
+
+    for (var index in instances) {
+      if (instances[index].status == "UP") {
+        return (secure == true) ? {"hostName": instances[index].hostName, "port": instances[index].securePort["$"]} : {"hostName": instances[index].hostName, "port":instances[index].port["$"]};
+      }
+    }
+    return "";
+  }
+
+  return {
+    onrequest: function(req, res, next) {
+      var appInfo = getAppName(req.url);
+      var endpoint = getTarget(appInfo.app, appInfo.secure);
+
+      req.targetHostname = endpoint.hostName;
+      req.targetPort = endpoint.port;
+      req.targetPath = req.url;
+      if (appInfo.secure) {
+        req.targetSecure = true;
+      } else {
+        req.targetSecure = false;
+      }
+      next();
+    }   
+  };
+}
diff --git a/eurekaclient/package.json b/eurekaclient/package.json
new file mode 100644
index 0000000..c3443bd
--- /dev/null
+++ b/eurekaclient/package.json
@@ -0,0 +1,14 @@
+{
+  "name": "eurekaclient",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "eureka-js-client": "^4.3.0"
+  }
+}
diff --git a/eurekaclient/servicelookup.json b/eurekaclient/servicelookup.json
new file mode 100644
index 0000000..958dfe4
--- /dev/null
+++ b/eurekaclient/servicelookup.json
@@ -0,0 +1 @@
+[{"uri": "/book", "app": "BOOK", "secure": false},{"uri":"/httpbin", "app": "BOOK", "secure": false}]
\ No newline at end of file
diff --git a/index.js b/index.js
index 5540030..01f90dd 100644
--- a/index.js
+++ b/index.js
@@ -11,5 +11,6 @@
   'quota-memory':require('./quota-memory'),
   spikearrest:require('./spikearrest'),
   'transform-uppercase':require('./transform-uppercase'),
-  accesscontrol:require('./accesscontrol')
+  accesscontrol:require('./accesscontrol'),
+  eurekaclient:require('./eurekaclient')
 }
diff --git a/oauth/index.js b/oauth/index.js
index 1e4162b..9521cee 100644
--- a/oauth/index.js
+++ b/oauth/index.js
@@ -3,7 +3,7 @@
 var debug = require('debug')('plugin:oauth');
 var url = require('url');
 var jwt = require('jsonwebtoken');
-var request = require('request');
+var requestLib = require('request');
 var _ = require('lodash');
 
 const authHeaderRegex = /Bearer (.+)/;
@@ -15,14 +15,39 @@
 module.exports.init = function (config, logger, stats) {
 
   var apiKeyCache = {};
+  var request = config.request ? requestLib.defaults(config.request) : requestLib;
 
   var middleware = function (req, res, next) {
 
     var authHeaderName = config['authorization-header'] ? config['authorization-header'] : 'authorization';
     var apiKeyHeaderName = config['api-key-header'] ? config['api-key-header'] : 'x-api-key';
     var keepAuthHeader = config['keep-authorization-header'] || false;
+    //support for enabling oauth or api key only
+    var oauth_only = config['allowOAuthOnly'] || false;
+    var apikey_only = config['allowAPIKeyOnly'] || false;
+    //
     var apiKey;
 
+    //support for enabling oauth or api key only
+    if (oauth_only) {
+      if (!req.headers['authorization']) {
+        debug('missing_authorization');
+        return sendError(req, res, next, logger, stats, 'missing_authorization', 'Missing Authorization header');
+      } else {
+        var header = authHeaderRegex.exec(req.headers['authorization']);
+        if (!header || header.length < 2) {
+          debug('Invalid Authorization Header');
+          return sendError(req, res, next, logger, stats, 'invalid_request', 'Invalid Authorization header');
+        }
+      }
+    }
+    else if (apikey_only) {
+      if (req.headers[authHeaderName]) {
+        debug('Invalid Authorization Type');
+        return sendError(req, res, next, logger, stats, 'invalid_auth', 'Invalid Authorization type');        
+      }
+    }
+    //leaving rest of the code same to ensure backward compatibility
     if (!req.headers[authHeaderName]) {
       if (apiKey = req.headers[apiKeyHeaderName]) {
         exchangeApiKeyForToken(req, res, next, config, logger, stats, middleware, apiKey);