Skip to content

Commit d14ec3a

Browse files
authored
Merge pull request #183 from oxctl/AB#81207
AB#81207 Fix for calendar import failing with 504 errors.
2 parents 6a7d265 + ed8eddc commit d14ec3a

5 files changed

Lines changed: 119 additions & 3 deletions

File tree

src/main/java/uk/ac/ox/ctl/RestTemplateConfiguration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ public class RestTemplateConfiguration {
2121
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder)
2222
{
2323
RestTemplate restTemplate = restTemplateBuilder
24-
.setConnectTimeout(Duration.ofSeconds(5))
25-
.setReadTimeout(Duration.ofSeconds(5))
24+
.setConnectTimeout(Duration.ofSeconds(10))
25+
.setReadTimeout(Duration.ofSeconds(60))
2626
.build();
2727

2828
restTemplate.setErrorHandler(new ResponseErrorHandler() {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package uk.ac.ox.ctl.canvasproxy;
2+
3+
import org.springframework.boot.web.servlet.FilterRegistrationBean;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.Configuration;
6+
7+
@Configuration
8+
public class FilterConfig {
9+
10+
@Bean
11+
public FilterRegistrationBean<ViaFilter> viaFilter() {
12+
FilterRegistrationBean<ViaFilter> registrationBean = new FilterRegistrationBean<>();
13+
14+
registrationBean.setFilter(new ViaFilter());
15+
registrationBean.addUrlPatterns("/api/*"); // All the proxy URLs
16+
registrationBean.setOrder(1);
17+
18+
return registrationBean;
19+
}
20+
}

src/main/java/uk/ac/ox/ctl/canvasproxy/ProxyController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public ResponseEntity<?> proxy(AbstractOAuth2TokenAuthenticationToken principal,
9090
} catch (ResourceAccessException e) {
9191
// When we get a timeout we should translate it to the correct HTTP message.
9292
if (e.getCause() instanceof SocketTimeoutException) {
93-
throw new ResponseStatusException(HttpStatus.GATEWAY_TIMEOUT);
93+
throw new ResponseStatusException(HttpStatus.GATEWAY_TIMEOUT, "Socket timeout accessing " + thirdPartyApi, e);
9494
}
9595
log.warn("Failed to load {} exception is: {}", thirdPartyApi, e.getMessage());
9696
// TODO - Need to fix this so we don't log exception as this will be expected in production
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package uk.ac.ox.ctl.canvasproxy;
2+
3+
import jakarta.servlet.Filter;
4+
import jakarta.servlet.FilterChain;
5+
import jakarta.servlet.ServletException;
6+
import jakarta.servlet.ServletRequest;
7+
import jakarta.servlet.ServletResponse;
8+
import jakarta.servlet.http.HttpServletRequest;
9+
import jakarta.servlet.http.HttpServletResponse;
10+
11+
import java.io.IOException;
12+
13+
/**
14+
* Adds on a Via header to indicate that the request passed through this proxy.
15+
* This allows for easier debugging of requests. This is done in a filter as it's dealing with low-level concerns and
16+
* doesn't fit well in the controller.
17+
*/
18+
public class ViaFilter implements Filter {
19+
@Override
20+
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
21+
if (servletRequest instanceof HttpServletRequest request && servletResponse instanceof HttpServletResponse response) {
22+
String existingVia = response.getHeader("Via");
23+
String newVia = request.getProtocol() + " " + request.getServerName() + " tool-support";
24+
if (existingVia != null && !existingVia.isEmpty()) {
25+
newVia = existingVia + ", " + newVia;
26+
}
27+
response.setHeader("Via", newVia);
28+
}
29+
filterChain.doFilter(servletRequest, servletResponse);
30+
}
31+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package uk.ac.ox.ctl.canvasproxy;
2+
3+
import jakarta.servlet.FilterChain;
4+
import jakarta.servlet.ServletRequest;
5+
import jakarta.servlet.ServletResponse;
6+
import jakarta.servlet.http.HttpServletRequest;
7+
import jakarta.servlet.http.HttpServletResponse;
8+
import org.junit.jupiter.api.BeforeEach;
9+
import org.junit.jupiter.api.Test;
10+
11+
import java.io.IOException;
12+
13+
import static org.mockito.Mockito.*;
14+
15+
class ViaFilterTest {
16+
17+
private ViaFilter filter;
18+
private HttpServletRequest request;
19+
private HttpServletResponse response;
20+
private FilterChain chain;
21+
22+
@BeforeEach
23+
void setUp() {
24+
filter = new ViaFilter();
25+
request = mock(HttpServletRequest.class);
26+
response = mock(HttpServletResponse.class);
27+
chain = mock(FilterChain.class);
28+
}
29+
30+
@Test
31+
void shouldAddViaHeaderWhenNoneExists() throws Exception {
32+
when(request.getProtocol()).thenReturn("HTTP/1.1");
33+
when(request.getServerName()).thenReturn("localhost");
34+
when(response.getHeader("Via")).thenReturn(null);
35+
36+
filter.doFilter(request, response, chain);
37+
38+
verify(response).setHeader("Via", "HTTP/1.1 localhost tool-support");
39+
verify(chain).doFilter(request, response);
40+
}
41+
42+
@Test
43+
void shouldAppendToExistingViaHeader() throws Exception {
44+
when(request.getProtocol()).thenReturn("HTTP/2");
45+
when(request.getServerName()).thenReturn("myserver");
46+
when(response.getHeader("Via")).thenReturn("HTTP/1.1 proxy1");
47+
48+
filter.doFilter(request, response, chain);
49+
50+
verify(response).setHeader("Via", "HTTP/1.1 proxy1, HTTP/2 myserver tool-support");
51+
verify(chain).doFilter(request, response);
52+
}
53+
54+
@Test
55+
void shouldHandleNonHttpRequestsGracefully() throws IOException, jakarta.servlet.ServletException {
56+
ServletRequest genericRequest = mock(ServletRequest.class);
57+
ServletResponse genericResponse = mock(ServletResponse.class);
58+
59+
filter.doFilter(genericRequest, genericResponse, chain);
60+
61+
verify(chain).doFilter(genericRequest, genericResponse);
62+
// no headers should be set
63+
verifyNoInteractions(response);
64+
}
65+
}

0 commit comments

Comments
 (0)