diff --git a/changelog.txt b/changelog.txt index cb273cc..c9a88cd 100644 --- a/changelog.txt +++ b/changelog.txt @@ -11,3 +11,4 @@ * FEATURE: Added setConnectTimeout and setReadTimeout for the Request Object * FIX: Fixed Evernote Api (uses GET for request and access tokens) + * REFACTOR: URLEncoding stuff. LinkedIn specific decoder is no longer needed diff --git a/src/main/java/org/scribe/builder/api/LinkedInApi.java b/src/main/java/org/scribe/builder/api/LinkedInApi.java index b02a31e..83f064e 100644 --- a/src/main/java/org/scribe/builder/api/LinkedInApi.java +++ b/src/main/java/org/scribe/builder/api/LinkedInApi.java @@ -1,11 +1,7 @@ package org.scribe.builder.api; -import org.scribe.extensions.linkedin.*; -import org.scribe.extractors.*; - public class LinkedInApi extends DefaultApi10a { - @Override protected String getAccessTokenEndpoint() { @@ -17,11 +13,4 @@ public class LinkedInApi extends DefaultApi10a { return "https://api.linkedin.com/uas/oauth/requestToken"; } - - @Override - protected BaseStringExtractor getBaseStringExtractor() - { - return new LinkedInBaseStringExtractorImpl(); - } - } diff --git a/src/main/java/org/scribe/extensions/linkedin/LinkedInBaseStringExtractorImpl.java b/src/main/java/org/scribe/extensions/linkedin/LinkedInBaseStringExtractorImpl.java deleted file mode 100644 index 0413a42..0000000 --- a/src/main/java/org/scribe/extensions/linkedin/LinkedInBaseStringExtractorImpl.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.scribe.extensions.linkedin; - -import org.scribe.extractors.*; -import org.scribe.model.*; - -/** - * LinkedIn's specific extractor that does not encode the tilde character. - * - * @author Pablo Fernandez - */ -public class LinkedInBaseStringExtractorImpl extends BaseStringExtractorImpl -{ - - /** - * {@inheritDoc} - */ - @Override - public String extract(OAuthRequest request) - { - String baseString = super.extract(request); - return baseString.replace("%7E", "~"); - } -} diff --git a/src/main/java/org/scribe/utils/URLUtils.java b/src/main/java/org/scribe/utils/URLUtils.java index 5cf08bd..dc09c51 100644 --- a/src/main/java/org/scribe/utils/URLUtils.java +++ b/src/main/java/org/scribe/utils/URLUtils.java @@ -20,6 +20,17 @@ public class URLUtils private static final String ERROR_MSG = String.format("Cannot find specified encoding: %s", UTF_8); + private static final Set ENCODING_RULES; + + static + { + Set rules = new HashSet(); + rules.add(new EncodingRule("*","%2A")); + rules.add(new EncodingRule("+","%20")); + rules.add(new EncodingRule("%7E", "~")); + ENCODING_RULES = Collections.unmodifiableSet(rules); + } + /** * Turns a map into a form-url-encoded string (key=value&key2=value2) * @@ -57,7 +68,12 @@ public class URLUtils Preconditions.checkNotNull(string, "Cannot encode null string"); try { - return URLEncoder.encode(string, UTF_8).replaceAll("\\+", "%20"); + String encoded = URLEncoder.encode(string, UTF_8); + for(EncodingRule rule : ENCODING_RULES) + { + encoded = rule.apply(encoded); + } + return encoded; } catch (UnsupportedEncodingException uee) { @@ -77,9 +93,26 @@ public class URLUtils try { return URLDecoder.decode(string, UTF_8); - } catch (UnsupportedEncodingException uee) + } + catch (UnsupportedEncodingException uee) { throw new OAuthException(ERROR_MSG, uee); } } + + private static final class EncodingRule + { + private final String ch; + private final String toCh; + + EncodingRule(String ch, String toCh) + { + this.ch = ch; + this.toCh = toCh; + } + + String apply(String string) { + return string.replace(ch, toCh); + } + } } diff --git a/src/test/java/org/scribe/examples/LinkedInExample.java b/src/test/java/org/scribe/examples/LinkedInExample.java index 8fd1247..daeb77e 100644 --- a/src/test/java/org/scribe/examples/LinkedInExample.java +++ b/src/test/java/org/scribe/examples/LinkedInExample.java @@ -55,8 +55,6 @@ public class LinkedInExample System.out.println(); System.out.println("Thats it man! Go and build something awesome with Scribe! :)"); - - System.out.println(service.getRequestToken()); } } diff --git a/src/test/java/org/scribe/utils/URLUtilsTest.java b/src/test/java/org/scribe/utils/URLUtilsTest.java index eae99e5..90c8d11 100644 --- a/src/test/java/org/scribe/utils/URLUtilsTest.java +++ b/src/test/java/org/scribe/utils/URLUtilsTest.java @@ -8,13 +8,6 @@ import org.junit.*; public class URLUtilsTest { - - @Before - public void setup() - { - - } - @Test public void shouldPercentEncodeMap() { @@ -51,6 +44,23 @@ public class URLUtilsTest assertEquals(expected, URLUtils.percentDecode(toDecode)); } + @Test + public void shouldEncodeAllSpecialCharacters() + { + String plain = "!*'();:@&=+$,/?#[]"; + String encoded = "%21%2A%27%28%29%3B%3A%40%26%3D%2B%24%2C%2F%3F%23%5B%5D"; + assertEquals(encoded, URLUtils.percentEncode(plain)); + assertEquals(plain, URLUtils.percentDecode(encoded)); + } + + @Test + public void shouldNotEncodeReservedCharacters() + { + String plain = "abcde123456-._~"; + String encoded = plain; + assertEquals(encoded, URLUtils.percentEncode(plain)); + } + @Test(expected = IllegalArgumentException.class) public void shouldThrowExceptionIfMapIsNull() {