Expose scheme in ReactorServerHttpRequest URI

This commit determines fixes ReactorServerHttpRequest.getUri() so that
it includes a URL scheme.

Issue: SPR-15931
This commit is contained in:
Arjen Poutsma 2017-09-07 12:19:37 +02:00
parent 15ab0ad6e2
commit ec6475a24c
3 changed files with 18 additions and 6 deletions

View File

@ -20,8 +20,10 @@ import java.net.InetSocketAddress;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import io.netty.channel.ChannelPipeline;
import io.netty.handler.codec.http.HttpHeaderNames; import io.netty.handler.codec.http.HttpHeaderNames;
import io.netty.handler.codec.http.cookie.Cookie; import io.netty.handler.codec.http.cookie.Cookie;
import io.netty.handler.ssl.SslHandler;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import reactor.ipc.netty.http.server.HttpServerRequest; import reactor.ipc.netty.http.server.HttpServerRequest;
@ -62,6 +64,7 @@ public class ReactorServerHttpRequest extends AbstractServerHttpRequest {
} }
private static URI resolveBaseUrl(HttpServerRequest request) throws URISyntaxException { private static URI resolveBaseUrl(HttpServerRequest request) throws URISyntaxException {
String scheme = getScheme(request);
String header = request.requestHeaders().get(HttpHeaderNames.HOST); String header = request.requestHeaders().get(HttpHeaderNames.HOST);
if (header != null) { if (header != null) {
final int portIndex; final int portIndex;
@ -73,7 +76,7 @@ public class ReactorServerHttpRequest extends AbstractServerHttpRequest {
} }
if (portIndex != -1) { if (portIndex != -1) {
try { try {
return new URI(null, null, header.substring(0, portIndex), return new URI(scheme, null, header.substring(0, portIndex),
Integer.parseInt(header.substring(portIndex + 1)), null, null, null); Integer.parseInt(header.substring(portIndex + 1)), null, null, null);
} }
catch (NumberFormatException ex) { catch (NumberFormatException ex) {
@ -81,16 +84,22 @@ public class ReactorServerHttpRequest extends AbstractServerHttpRequest {
} }
} }
else { else {
return new URI(null, header, null, null); return new URI(scheme, header, null, null);
} }
} }
else { else {
InetSocketAddress localAddress = (InetSocketAddress) request.context().channel().localAddress(); InetSocketAddress localAddress = (InetSocketAddress) request.context().channel().localAddress();
return new URI(null, null, localAddress.getHostString(), return new URI(scheme, null, localAddress.getHostString(),
localAddress.getPort(), null, null, null); localAddress.getPort(), null, null, null);
} }
} }
private static String getScheme(HttpServerRequest request) {
ChannelPipeline pipeline = request.context().channel().pipeline();
boolean ssl = pipeline.get(SslHandler.class) != null;
return ssl ? "https" : "http";
}
private static HttpHeaders initHeaders(HttpServerRequest channel) { private static HttpHeaders initHeaders(HttpServerRequest channel) {
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();
for (String name : channel.requestHeaders().names()) { for (String name : channel.requestHeaders().names()) {

View File

@ -74,7 +74,8 @@ public class RxNettyServerHttpRequest extends AbstractServerHttpRequest {
} }
private static URI createUrl(InetSocketAddress address, String requestUri) throws URISyntaxException { private static URI createUrl(InetSocketAddress address, String requestUri) throws URISyntaxException {
URI baseUrl = new URI(null, null, address.getHostString(), address.getPort(), null, null, null); // TODO: determine scheme
URI baseUrl = new URI("http", null, address.getHostString(), address.getPort(), null, null, null);
return new URI(baseUrl.toString() + requestUri); return new URI(baseUrl.toString() + requestUri);
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -18,7 +18,6 @@ package org.springframework.http.server.reactive;
import java.net.URI; import java.net.URI;
import static org.junit.Assert.*;
import org.junit.Test; import org.junit.Test;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
@ -27,6 +26,8 @@ import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import static org.junit.Assert.*;
public class ServerHttpRequestIntegrationTests extends AbstractHttpHandlerIntegrationTests { public class ServerHttpRequestIntegrationTests extends AbstractHttpHandlerIntegrationTests {
@Override @Override
@ -48,6 +49,7 @@ public class ServerHttpRequestIntegrationTests extends AbstractHttpHandlerIntegr
@Override @Override
public Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) { public Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) {
URI uri = request.getURI(); URI uri = request.getURI();
assertEquals("http", uri.getScheme());
assertNotNull(uri.getHost()); assertNotNull(uri.getHost());
assertNotEquals(-1, uri.getPort()); assertNotEquals(-1, uri.getPort());
assertNotNull(request.getRemoteAddress()); assertNotNull(request.getRemoteAddress());