Commit 300387d9 authored by Johnny Lim's avatar Johnny Lim Committed by Phillip Webb

Replace Base64Encoder with Base64Utils

Replace the custom Base64Encoder class with Spring's Base64Utils which
since 4.2 can encode bytes using Java 8's encoder, commons-digest or
Java 6's JAX-B encoder.

Closes gh-4189
parent fb63e887
/*
* Copyright 2012-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.devtools.livereload;
import java.nio.charset.Charset;
/**
* Simple Base64 Encoder.
*
* @author Phillip Webb
*/
final class Base64Encoder {
private static final Charset UTF_8 = Charset.forName("UTF-8");
private static final String ALPHABET_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz0123456789+/";
static final byte[] ALPHABET = ALPHABET_CHARS.getBytes(UTF_8);
private static final byte EQUALS_SIGN = '=';
private Base64Encoder() {
}
public static String encode(String string) {
return encode(string.getBytes(UTF_8));
}
public static String encode(byte[] bytes) {
byte[] encoded = new byte[bytes.length / 3 * 4 + (bytes.length % 3 == 0 ? 0 : 4)];
for (int i = 0; i < bytes.length; i += 3) {
encodeBlock(bytes, i, Math.min((bytes.length - i), 3), encoded, i / 3 * 4);
}
return new String(encoded, UTF_8);
}
private static void encodeBlock(byte[] src, int srcPos, int blockLen, byte[] dest,
int destPos) {
int inBuff = (blockLen > 0 ? ((src[srcPos] << 24) >>> 8) : 0)
| (blockLen > 1 ? ((src[srcPos + 1] << 24) >>> 16) : 0)
| (blockLen > 2 ? ((src[srcPos + 2] << 24) >>> 24) : 0);
for (int i = 0; i < 4; i++) {
dest[destPos + i] = (i > blockLen ? EQUALS_SIGN
: ALPHABET[(inBuff >>> (6 * (3 - i))) & 0x3f]);
}
}
}
...@@ -28,6 +28,7 @@ import java.util.regex.Pattern; ...@@ -28,6 +28,7 @@ import java.util.regex.Pattern;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.util.Base64Utils;
/** /**
* A {@link LiveReloadServer} connection. * A {@link LiveReloadServer} connection.
...@@ -149,7 +150,7 @@ class Connection { ...@@ -149,7 +150,7 @@ class Connection {
String response = matcher.group(1).trim() + WEBSOCKET_GUID; String response = matcher.group(1).trim() + WEBSOCKET_GUID;
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1"); MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
messageDigest.update(response.getBytes(), 0, response.length()); messageDigest.update(response.getBytes(), 0, response.length());
return Base64Encoder.encode(messageDigest.digest()); return Base64Utils.encodeToString(messageDigest.digest());
} }
/** /**
......
/*
* Copyright 2012-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.devtools.livereload;
import org.junit.Test;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
/**
* Tests for {@link Base64Encoder}.
*
* @author Phillip Webb
*/
public class Base64EncoderTests {
private static final String TEXT = "Man is distinguished, not only by his reason, "
+ "but by this singular passion from other animals, which is a lust of the "
+ "mind, that by a perseverance of delight in the continued and indefatigable "
+ "generation of knowledge, exceeds the short vehemence of any carnal pleasure.";
private static final String ENCODED = "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5I"
+ "GhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbm"
+ "ltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmF"
+ "uY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVy"
+ "YXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55I"
+ "GNhcm5hbCBwbGVhc3VyZS4=";
@Test
public void encodeText() {
assertThat(Base64Encoder.encode(TEXT), equalTo(ENCODED));
assertThat(Base64Encoder.encode("pleasure."), equalTo("cGxlYXN1cmUu"));
assertThat(Base64Encoder.encode("leasure."), equalTo("bGVhc3VyZS4="));
assertThat(Base64Encoder.encode("easure."), equalTo("ZWFzdXJlLg=="));
assertThat(Base64Encoder.encode("asure."), equalTo("YXN1cmUu"));
assertThat(Base64Encoder.encode("sure."), equalTo("c3VyZS4="));
}
}
/*
* Copyright 2012-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.test;
import java.nio.charset.Charset;
/**
* Simple Base64 Encoder.
*
* @author Phillip Webb
*/
final class Base64Encoder {
private static final Charset UTF_8 = Charset.forName("UTF-8");
private static final String ALPHABET_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz0123456789+/";
static final byte[] ALPHABET = ALPHABET_CHARS.getBytes(UTF_8);
private static final byte EQUALS_SIGN = '=';
private Base64Encoder() {
}
public static String encode(String string) {
return encode(string.getBytes(UTF_8));
}
public static String encode(byte[] bytes) {
byte[] encoded = new byte[bytes.length / 3 * 4 + (bytes.length % 3 == 0 ? 0 : 4)];
for (int i = 0; i < bytes.length; i += 3) {
encodeBlock(bytes, i, Math.min((bytes.length - i), 3), encoded, i / 3 * 4);
}
return new String(encoded, UTF_8);
}
private static void encodeBlock(byte[] src, int srcPos, int blockLen, byte[] dest,
int destPos) {
int inBuff = (blockLen > 0 ? ((src[srcPos] << 24) >>> 8) : 0)
| (blockLen > 1 ? ((src[srcPos + 1] << 24) >>> 16) : 0)
| (blockLen > 2 ? ((src[srcPos + 2] << 24) >>> 24) : 0);
for (int i = 0; i < 4; i++) {
dest[destPos + i] = (i > blockLen ? EQUALS_SIGN
: ALPHABET[(inBuff >>> (6 * (3 - i))) & 0x3f]);
}
}
}
...@@ -18,6 +18,7 @@ package org.springframework.boot.test; ...@@ -18,6 +18,7 @@ package org.springframework.boot.test;
import java.io.IOException; import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.nio.charset.Charset;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
...@@ -37,6 +38,7 @@ import org.springframework.http.client.ClientHttpRequestInterceptor; ...@@ -37,6 +38,7 @@ import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.client.InterceptingClientHttpRequestFactory; import org.springframework.http.client.InterceptingClientHttpRequestFactory;
import org.springframework.util.Base64Utils;
import org.springframework.util.ClassUtils; import org.springframework.util.ClassUtils;
import org.springframework.web.client.DefaultResponseErrorHandler; import org.springframework.web.client.DefaultResponseErrorHandler;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
...@@ -52,6 +54,8 @@ import org.springframework.web.client.RestTemplate; ...@@ -52,6 +54,8 @@ import org.springframework.web.client.RestTemplate;
*/ */
public class TestRestTemplate extends RestTemplate { public class TestRestTemplate extends RestTemplate {
private static final Charset UTF_8 = Charset.forName("UTF-8");
/** /**
* Create a new {@link TestRestTemplate} instance. * Create a new {@link TestRestTemplate} instance.
* @param httpClientOptions client options to use if the Apache HTTP Client is used * @param httpClientOptions client options to use if the Apache HTTP Client is used
...@@ -124,7 +128,8 @@ public class TestRestTemplate extends RestTemplate { ...@@ -124,7 +128,8 @@ public class TestRestTemplate extends RestTemplate {
@Override @Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, public ClientHttpResponse intercept(HttpRequest request, byte[] body,
ClientHttpRequestExecution execution) throws IOException { ClientHttpRequestExecution execution) throws IOException {
String token = Base64Encoder.encode(this.username + ":" + this.password); String token = Base64Utils.encodeToString(
(this.username + ":" + this.password).getBytes(UTF_8));
request.getHeaders().add("Authorization", "Basic " + token); request.getHeaders().add("Authorization", "Basic " + token);
return execution.execute(request, body); return execution.execute(request, body);
} }
......
/*
* Copyright 2012-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.test;
import org.junit.Test;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
/**
* Tests for {@link Base64Encoder}.
*
* @author Phillip Webb
*/
public class Base64EncoderTests {
private static final String TEXT = "Man is distinguished, not only by his reason, "
+ "but by this singular passion from other animals, which is a lust of the "
+ "mind, that by a perseverance of delight in the continued and indefatigable "
+ "generation of knowledge, exceeds the short vehemence of any carnal pleasure.";
private static final String ENCODED = "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5I"
+ "GhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbm"
+ "ltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmF"
+ "uY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVy"
+ "YXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55I"
+ "GNhcm5hbCBwbGVhc3VyZS4=";
@Test
public void encodeText() {
assertThat(Base64Encoder.encode(TEXT), equalTo(ENCODED));
assertThat(Base64Encoder.encode("pleasure."), equalTo("cGxlYXN1cmUu"));
assertThat(Base64Encoder.encode("leasure."), equalTo("bGVhc3VyZS4="));
assertThat(Base64Encoder.encode("easure."), equalTo("ZWFzdXJlLg=="));
assertThat(Base64Encoder.encode("asure."), equalTo("YXN1cmUu"));
assertThat(Base64Encoder.encode("sure."), equalTo("c3VyZS4="));
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment