forked from eugenp/tutorials
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
moved spring-rest-compress module to spring-resttemplate-2 module
- Loading branch information
Showing
11 changed files
with
330 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
38 changes: 38 additions & 0 deletions
38
...mplate-2/src/main/java/com/baeldung/compress/CompressingClientHttpRequestInterceptor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
package com.baeldung.compress; | ||
|
||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
import org.springframework.http.HttpHeaders; | ||
import org.springframework.http.HttpRequest; | ||
import org.springframework.http.client.ClientHttpRequestExecution; | ||
import org.springframework.http.client.ClientHttpRequestInterceptor; | ||
import org.springframework.http.client.ClientHttpResponse; | ||
|
||
import java.io.IOException; | ||
|
||
public class CompressingClientHttpRequestInterceptor implements ClientHttpRequestInterceptor { | ||
|
||
private static final Logger LOG = LoggerFactory.getLogger(CompressingClientHttpRequestInterceptor.class); | ||
|
||
private static final String GZIP_ENCODING = "gzip"; | ||
|
||
/** | ||
* Compress a request body using Gzip and add Http headers. | ||
* | ||
* @param req | ||
* @param body | ||
* @param exec | ||
* @return | ||
* @throws IOException | ||
*/ | ||
@Override | ||
public ClientHttpResponse intercept(HttpRequest req, byte[] body, ClientHttpRequestExecution exec) | ||
throws IOException { | ||
LOG.info("Compressing request..."); | ||
HttpHeaders httpHeaders = req.getHeaders(); | ||
httpHeaders.add(HttpHeaders.CONTENT_ENCODING, GZIP_ENCODING); | ||
httpHeaders.add(HttpHeaders.ACCEPT_ENCODING, GZIP_ENCODING); | ||
return exec.execute(req, GzipUtils.compress(body)); | ||
} | ||
|
||
} |
52 changes: 52 additions & 0 deletions
52
spring-resttemplate-2/src/main/java/com/baeldung/compress/GzipUtils.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
package com.baeldung.compress; | ||
|
||
import java.io.ByteArrayInputStream; | ||
import java.io.ByteArrayOutputStream; | ||
import java.io.IOException; | ||
import java.nio.charset.StandardCharsets; | ||
import java.util.zip.GZIPInputStream; | ||
import java.util.zip.GZIPOutputStream; | ||
|
||
import org.apache.commons.io.IOUtils; | ||
|
||
public class GzipUtils { | ||
|
||
/** | ||
* Gzip a string. | ||
* | ||
* @param text | ||
* @return | ||
* @throws Exception | ||
*/ | ||
public static byte[] compress(String text) throws Exception { | ||
return GzipUtils.compress(text.getBytes(StandardCharsets.UTF_8)); | ||
} | ||
|
||
/** | ||
* Gzip a byte array. | ||
* | ||
* @param body | ||
* @return | ||
* @throws IOException | ||
*/ | ||
public static byte[] compress(byte[] body) throws IOException { | ||
ByteArrayOutputStream baos = new ByteArrayOutputStream(); | ||
try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(baos)) { | ||
gzipOutputStream.write(body); | ||
} | ||
return baos.toByteArray(); | ||
} | ||
|
||
/** | ||
* Decompress a Gzipped byte array to a String. | ||
* | ||
* @param body | ||
* @return | ||
* @throws IOException | ||
*/ | ||
public static String decompress(byte[] body) throws IOException { | ||
try (GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(body))) { | ||
return IOUtils.toString(gzipInputStream, StandardCharsets.UTF_8); | ||
} | ||
} | ||
} |
38 changes: 38 additions & 0 deletions
38
spring-resttemplate-2/src/main/java/com/baeldung/compress/JettyWebServerConfiguration.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
package com.baeldung.compress; | ||
|
||
import org.eclipse.jetty.server.handler.HandlerCollection; | ||
import org.eclipse.jetty.server.handler.gzip.GzipHandler; | ||
import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory; | ||
import org.springframework.context.annotation.Bean; | ||
import org.springframework.context.annotation.Configuration; | ||
|
||
/** | ||
* Configure Jetty web server so it handles compressed requests. | ||
*/ | ||
@Configuration | ||
public class JettyWebServerConfiguration { | ||
|
||
private static final int MIN_BYTES = 1; | ||
|
||
/** | ||
* Customise the Jetty web server to automatically decompress requests. | ||
*/ | ||
@Bean | ||
public JettyServletWebServerFactory jettyServletWebServerFactory() { | ||
|
||
JettyServletWebServerFactory factory = new JettyServletWebServerFactory(); | ||
factory.addServerCustomizers(server -> { | ||
|
||
GzipHandler gzipHandler = new GzipHandler(); | ||
// Enable request decompression | ||
gzipHandler.setInflateBufferSize(MIN_BYTES); | ||
gzipHandler.setHandler(server.getHandler()); | ||
|
||
HandlerCollection handlerCollection = new HandlerCollection(gzipHandler); | ||
server.setHandler(handlerCollection); | ||
}); | ||
|
||
return factory; | ||
} | ||
|
||
} |
29 changes: 29 additions & 0 deletions
29
spring-resttemplate-2/src/main/java/com/baeldung/compress/Message.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
package com.baeldung.compress; | ||
|
||
public class Message { | ||
|
||
private String text; | ||
|
||
public Message() { | ||
} | ||
|
||
public Message(String text) { | ||
this.text = text; | ||
} | ||
|
||
public String getText() { | ||
return text; | ||
} | ||
|
||
public void setText(String text) { | ||
this.text = text; | ||
} | ||
|
||
@Override | ||
public String toString() { | ||
final StringBuilder sb = new StringBuilder("Message {"); | ||
sb.append("text='").append(text).append('\''); | ||
sb.append('}'); | ||
return sb.toString(); | ||
} | ||
} |
38 changes: 38 additions & 0 deletions
38
spring-resttemplate-2/src/main/java/com/baeldung/compress/MessageController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
package com.baeldung.compress; | ||
|
||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
import org.springframework.http.ResponseEntity; | ||
import org.springframework.web.bind.annotation.PostMapping; | ||
import org.springframework.web.bind.annotation.RequestBody; | ||
import org.springframework.web.bind.annotation.RequestHeader; | ||
import org.springframework.web.bind.annotation.RestController; | ||
|
||
import java.util.Map; | ||
|
||
@RestController | ||
public class MessageController { | ||
|
||
protected static final String PROCESSED = "Processed "; | ||
|
||
protected static final String REQUEST_MAPPING = "process"; | ||
|
||
private static final Logger LOG = LoggerFactory.getLogger(MessageController.class); | ||
|
||
/** | ||
* A simple endpoint that responds with "Processed " + supplied Message content. | ||
* | ||
* @param headers | ||
* @param message | ||
* @return | ||
*/ | ||
@PostMapping(value = REQUEST_MAPPING) | ||
public ResponseEntity<String> processMessage(@RequestHeader Map<String, String> headers, | ||
@RequestBody Message message) { | ||
|
||
// Print headers | ||
headers.forEach((k, v) -> LOG.info(k + "=" + v)); | ||
|
||
return ResponseEntity.ok(PROCESSED + message.getText()); | ||
} | ||
} |
21 changes: 21 additions & 0 deletions
21
spring-resttemplate-2/src/main/java/com/baeldung/compress/RestTemplateConfiguration.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package com.baeldung.compress; | ||
|
||
import org.springframework.context.annotation.Bean; | ||
import org.springframework.context.annotation.Configuration; | ||
import org.springframework.web.client.RestTemplate; | ||
|
||
@Configuration | ||
public class RestTemplateConfiguration { | ||
|
||
/** | ||
* A RestTemplate that compresses requests. | ||
* | ||
* @return RestTemplate | ||
*/ | ||
@Bean | ||
public RestTemplate getRestTemplate() { | ||
RestTemplate restTemplate = new RestTemplate(); | ||
restTemplate.getInterceptors().add(new CompressingClientHttpRequestInterceptor()); | ||
return restTemplate; | ||
} | ||
} |
15 changes: 15 additions & 0 deletions
15
...-resttemplate-2/src/main/java/com/baeldung/compress/SpringCompressRequestApplication.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package com.baeldung.compress; | ||
|
||
import org.springframework.boot.SpringApplication; | ||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; | ||
import org.springframework.boot.autoconfigure.SpringBootApplication; | ||
|
||
@SpringBootApplication | ||
@EnableAutoConfiguration | ||
public class SpringCompressRequestApplication { | ||
|
||
public static void main(String[] args) { | ||
SpringApplication.run(SpringCompressRequestApplication.class, args); | ||
} | ||
|
||
} |
19 changes: 19 additions & 0 deletions
19
spring-resttemplate-2/src/test/java/com/baeldung/compress/GzipUtilsUnitTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
package com.baeldung.compress; | ||
|
||
import org.junit.Test; | ||
|
||
import static org.junit.Assert.assertEquals; | ||
import static org.junit.Assert.assertNotNull; | ||
|
||
public class GzipUtilsUnitTest { | ||
|
||
@Test | ||
public void givenCompressedText_whenDecompressed_thenSuccessful() throws Exception { | ||
final String expectedText = "Hello Baeldung!"; | ||
byte[] compressedText = GzipUtils.compress(expectedText); | ||
String decompressedText = GzipUtils.decompress(compressedText); | ||
assertNotNull(compressedText); | ||
assertEquals(expectedText, decompressedText); | ||
} | ||
|
||
} |
56 changes: 56 additions & 0 deletions
56
spring-resttemplate-2/src/test/java/com/baeldung/compress/MessageControllerUnitTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
package com.baeldung.compress; | ||
|
||
import org.junit.Test; | ||
import org.junit.runner.RunWith; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.boot.test.context.SpringBootTest; | ||
import org.springframework.boot.web.server.LocalServerPort; | ||
import org.springframework.http.HttpEntity; | ||
import org.springframework.http.HttpStatus; | ||
import org.springframework.http.ResponseEntity; | ||
import org.springframework.test.context.junit4.SpringRunner; | ||
import org.springframework.web.client.RestTemplate; | ||
|
||
import static org.junit.Assert.assertEquals; | ||
import static org.junit.Assert.assertNotNull; | ||
|
||
@RunWith(SpringRunner.class) | ||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) | ||
public class MessageControllerUnitTest { | ||
|
||
private static final Logger LOG = LoggerFactory.getLogger(MessageControllerUnitTest.class); | ||
|
||
@Autowired | ||
private RestTemplate restTemplate; | ||
|
||
@LocalServerPort | ||
private int randomServerPort; | ||
|
||
/** | ||
* As a further test you can intercept the request body, using a tool like | ||
* Wireshark, to see the request body is actually gzipped. | ||
* | ||
* @throws Exception | ||
*/ | ||
@Test | ||
public void givenRestTemplate_whenPostCompressedRequest_thenRespondsSuccessfully() throws Exception { | ||
|
||
final String text = "Hello Baeldung!"; | ||
Message message = new Message(text); | ||
|
||
HttpEntity<Message> request = new HttpEntity<>(message); | ||
String uri = String.format("http://localhost:%s/%s", randomServerPort, MessageController.REQUEST_MAPPING); | ||
|
||
ResponseEntity<String> responseEntity = restTemplate.postForEntity(uri, request, String.class); | ||
|
||
String response = responseEntity.getBody(); | ||
LOG.info("Got response [{}]", response); | ||
|
||
assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); | ||
assertNotNull(response); | ||
assertEquals(MessageController.PROCESSED + text, response); | ||
} | ||
|
||
} |