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; + } + }