diff --git a/.gitignore b/.gitignore
index 98d0aab..7c1ef6a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,5 @@
+.classpath
+.project
+.settings
target
jcurl-all.jar
diff --git a/pom.xml b/pom.xml
index e5de234..66df50a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -125,7 +125,7 @@
org.projectlombok
lombok
- 1.16.4
+ 1.18.12
org.slf4j
@@ -168,10 +168,15 @@
jopt-simple
4.9
+
+ org.apache.commons
+ commons-lang3
+ 3.10
+
commons-io
commons-io
- 2.4
+ 2.7
org.springframework
@@ -300,6 +305,11 @@
jetty-client
9.3.7.v20160115
+
+ oauth.signpost
+ signpost-core
+ 1.2.1.1
+
junit
junit
diff --git a/src/main/java/JCurl.java b/src/main/java/JCurl.java
index 3ef5121..1b874e4 100644
--- a/src/main/java/JCurl.java
+++ b/src/main/java/JCurl.java
@@ -43,6 +43,14 @@ public static void main(String[] args) throws Exception {
final OptionSpec headerSpec;
@NonNull
final OptionSpec engineOptionSpec;
+ @NonNull
+ final OptionSpec consumerKeySpec;
+ @NonNull
+ final OptionSpec consumerSecretSpec;
+ @NonNull
+ final OptionSpec userTokenSpec;
+ @NonNull
+ final OptionSpec userSecretSpec;
public JCurl() {
parser = new OptionParser();
@@ -67,6 +75,22 @@ public JCurl() {
)
.withRequiredArg()
.ofType(String.class);
+ consumerKeySpec = parser
+ .acceptsAll(asList("consumerKey", "ck"), "OAuth consumer key")
+ .withRequiredArg()
+ .ofType(String.class);
+ consumerSecretSpec = parser
+ .acceptsAll(asList("consumerSecret", "cs"), "OAuth consumer secret")
+ .withRequiredArg()
+ .ofType(String.class);
+ userTokenSpec = parser
+ .acceptsAll(asList("userToken", "ut"), "OAuth user token")
+ .withRequiredArg()
+ .ofType(String.class);
+ userSecretSpec = parser
+ .acceptsAll(asList("userSecret", "us"), "OAuth user secret")
+ .withRequiredArg()
+ .ofType(String.class);
}
public ResponseEntity execute(String... args) throws Exception {
@@ -109,6 +133,15 @@ public ResponseEntity execute(String... args) throws Exception {
}
}
+ if (optionSet.has("consumerKey") && optionSet.has("consumerSecret")) {
+ options.setOAuthConsumerCredentials(new OAuthConsumerCredentials(optionSet.valueOf(consumerKeySpec),
+ optionSet.valueOf(consumerSecretSpec)));
+ }
+ if (optionSet.has("userToken") && optionSet.has("userSecret")) {
+ options.setOAuthUserCredentials(
+ new OAuthUserCredentials(optionSet.valueOf(userTokenSpec), optionSet.valueOf(userSecretSpec)));
+ }
+
return engineType.getEngine().submit(options);
}
diff --git a/src/main/java/JCurlRequestOptions.java b/src/main/java/JCurlRequestOptions.java
index b00f67b..721024f 100644
--- a/src/main/java/JCurlRequestOptions.java
+++ b/src/main/java/JCurlRequestOptions.java
@@ -34,6 +34,8 @@ public class JCurlRequestOptions {
private boolean parallel = false;
private int count = 1;
private final Map headerMap = new TreeMap(String.CASE_INSENSITIVE_ORDER);
+ private OAuthConsumerCredentials oAuthConsumerCredentials;
+ private OAuthUserCredentials oAuthUserCredentials;
public JCurlRequestOptions() {
headerMap.put("User-Agent", USER_AGENT);
diff --git a/src/main/java/OAuthConsumerCredentials.java b/src/main/java/OAuthConsumerCredentials.java
new file mode 100644
index 0000000..f52dfda
--- /dev/null
+++ b/src/main/java/OAuthConsumerCredentials.java
@@ -0,0 +1,9 @@
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@AllArgsConstructor
+@Data
+public class OAuthConsumerCredentials {
+ private String consumerKey;
+ private String consumerSecret;
+}
diff --git a/src/main/java/OAuthUserCredentials.java b/src/main/java/OAuthUserCredentials.java
new file mode 100644
index 0000000..348262a
--- /dev/null
+++ b/src/main/java/OAuthUserCredentials.java
@@ -0,0 +1,17 @@
+import java.util.HashMap;
+import java.util.Map;
+import java.util.SortedSet;
+
+import lombok.Data;
+
+@Data
+public class OAuthUserCredentials {
+ private String userToken;
+ private String userTokenSecret;
+ private Map> userParameters = new HashMap<>();
+
+ public OAuthUserCredentials(String userToken, String userSecret) {
+ this.userToken = userToken;
+ this.userTokenSecret = userSecret;
+ }
+}
diff --git a/src/main/java/UrlEngine.java b/src/main/java/UrlEngine.java
index 0399930..5631ff5 100644
--- a/src/main/java/UrlEngine.java
+++ b/src/main/java/UrlEngine.java
@@ -15,19 +15,29 @@
*/
import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
+import oauth.signpost.OAuth;
+import oauth.signpost.OAuthConsumer;
+import oauth.signpost.basic.DefaultOAuthConsumer;
+import oauth.signpost.http.HttpParameters;
+
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
+import java.util.Random;
+import java.util.SortedSet;
/**
* @author Erich Eichinger
* @since 01/03/2016
*/
public class UrlEngine implements Engine {
+ private Random random = new Random();
+
@Override
public ResponseEntity submit(JCurlRequestOptions requestOptions) throws Exception {
System.setProperty("http.keepAlive", "true");
@@ -37,6 +47,29 @@ public ResponseEntity submit(JCurlRequestOptions requestOptions) throws
for (int i=0;i< requestOptions.getCount();i++) {
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
+ OAuthConsumerCredentials oAuthConsumerCredentials = requestOptions.getOAuthConsumerCredentials();
+ if (oAuthConsumerCredentials != null) {
+ OAuthConsumer consumer = new DefaultOAuthConsumer(oAuthConsumerCredentials.getConsumerKey(),
+ oAuthConsumerCredentials.getConsumerSecret());
+ OAuthUserCredentials oAuthUserCredentials = requestOptions.getOAuthUserCredentials();
+ if (oAuthUserCredentials != null) {
+ consumer.setTokenWithSecret(oAuthUserCredentials.getUserToken(),
+ oAuthUserCredentials.getUserTokenSecret());
+ HttpParameters parameters = new HttpParameters();
+ for (Map.Entry> parameterEntry : oAuthUserCredentials.getUserParameters()
+ .entrySet()) {
+ parameters.put(parameterEntry.getKey(), parameterEntry.getValue());
+ }
+ if (!parameters.containsKey(OAuth.OAUTH_NONCE)) {
+ String nonce = generateNonce();
+ if (StringUtils.isNotBlank(nonce)) {
+ parameters.put(OAuth.OAUTH_NONCE, nonce, true);
+ }
+ }
+ consumer.setAdditionalParameters(parameters);
+ }
+ consumer.sign(con);
+ }
// add request header
con.setRequestMethod("GET");
@@ -46,10 +79,11 @@ public ResponseEntity submit(JCurlRequestOptions requestOptions) throws
}
System.out.println("\nSending 'GET' request to URL : " + requestOptions.getUrl());
+ long startTime = System.currentTimeMillis();
con.connect();
int responseCode = con.getResponseCode();
- System.out.println("Response Code : " + responseCode);
+ System.out.println("Response Code : " + responseCode + " Total Time: " + (System.currentTimeMillis() - startTime));
final InputStream is = con.getInputStream();
String response = IOUtils.toString(is);
@@ -63,4 +97,12 @@ public ResponseEntity submit(JCurlRequestOptions requestOptions) throws
return responseEntity;
}
+ private String generateNonce() {
+ String nonce = null;
+ if (this.random != null) {
+ nonce = Long.toString(this.random.nextLong());
+ }
+ return nonce;
+ }
+
}