Fix HAL browser endpoint redirect and entry point with custom servlet path
Previously, the HAL browser endpoint did not consider the dispatcher servlet’s path (server.servlet-path) when redirecting to browser.html or when updating the API entry point in the served HTML. This commit moves to using ServletUriComponentsBuilder to build the URI for the redirect and the path for the entry point. In the interests of simplicity the logic that sometimes redirected and sometimes forwarded the request has been changed so that it will always perform a redirect. Closes gh-6586pull/6759/merge
parent
ff48a88b91
commit
9874c22e23
@ -0,0 +1,131 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012-2016 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.actuate.endpoint.mvc;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
import org.springframework.boot.actuate.autoconfigure.MinimalActuatorHypermediaApplication;
|
||||||
|
import org.springframework.boot.context.embedded.LocalServerPort;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
|
||||||
|
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||||
|
import org.springframework.hateoas.ResourceSupport;
|
||||||
|
import org.springframework.http.HttpEntity;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.test.annotation.DirtiesContext;
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integration tests for {@link HalBrowserMvcEndpoint} when a custom server context path
|
||||||
|
* has been configured.
|
||||||
|
*
|
||||||
|
* @author Dave Syer
|
||||||
|
* @author Andy Wilkinson
|
||||||
|
*/
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = {
|
||||||
|
"server.servlet-path=/spring" })
|
||||||
|
@DirtiesContext
|
||||||
|
public class HalBrowserMvcEndpointServerServletPathIntegrationTests {
|
||||||
|
|
||||||
|
@LocalServerPort
|
||||||
|
private int port;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void linksAddedToHomePage() throws Exception {
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
|
||||||
|
ResponseEntity<String> entity = new TestRestTemplate().exchange(
|
||||||
|
"http://localhost:" + this.port + "/spring/", HttpMethod.GET,
|
||||||
|
new HttpEntity<Void>(null, headers), String.class);
|
||||||
|
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||||
|
assertThat(entity.getBody()).contains("\"_links\":");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void actuatorBrowserRedirect() throws Exception {
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
headers.setAccept(Arrays.asList(MediaType.TEXT_HTML));
|
||||||
|
ResponseEntity<String> entity = new TestRestTemplate().exchange(
|
||||||
|
"http://localhost:" + this.port + "/spring/actuator/", HttpMethod.GET,
|
||||||
|
new HttpEntity<Void>(null, headers), String.class);
|
||||||
|
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.FOUND);
|
||||||
|
assertThat(entity.getHeaders().getLocation()).isEqualTo(URI.create(
|
||||||
|
"http://localhost:" + this.port + "/spring/actuator/browser.html"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void actuatorBrowserEntryPoint() throws Exception {
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
headers.setAccept(Arrays.asList(MediaType.TEXT_HTML));
|
||||||
|
ResponseEntity<String> entity = new TestRestTemplate().exchange(
|
||||||
|
"http://localhost:" + this.port + "/spring/actuator/browser.html",
|
||||||
|
HttpMethod.GET, new HttpEntity<Void>(null, headers), String.class);
|
||||||
|
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||||
|
assertThat(entity.getBody()).contains("entryPoint: '/spring/actuator'");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void actuatorLinks() throws Exception {
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
|
||||||
|
ResponseEntity<String> entity = new TestRestTemplate().exchange(
|
||||||
|
"http://localhost:" + this.port + "/spring/actuator", HttpMethod.GET,
|
||||||
|
new HttpEntity<Void>(null, headers), String.class);
|
||||||
|
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||||
|
assertThat(entity.getBody()).contains("\"_links\":");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void actuatorLinksWithTrailingSlash() throws Exception {
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
|
||||||
|
ResponseEntity<String> entity = new TestRestTemplate().exchange(
|
||||||
|
"http://localhost:" + this.port + "/spring/actuator/", HttpMethod.GET,
|
||||||
|
new HttpEntity<Void>(null, headers), String.class);
|
||||||
|
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||||
|
assertThat(entity.getBody()).contains("\"_links\":");
|
||||||
|
}
|
||||||
|
|
||||||
|
@MinimalActuatorHypermediaApplication
|
||||||
|
@RestController
|
||||||
|
public static class SpringBootHypermediaApplication {
|
||||||
|
|
||||||
|
@RequestMapping("")
|
||||||
|
public ResourceSupport home() {
|
||||||
|
ResourceSupport resource = new ResourceSupport();
|
||||||
|
resource.add(linkTo(SpringBootHypermediaApplication.class).slash("/")
|
||||||
|
.withSelfRel());
|
||||||
|
return resource;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue