Skip to content

Commit fb98981

Browse files
committed
Computed original reference according to the proxy forwarding. Issue #1191
1 parent e4dc905 commit fb98981

File tree

11 files changed

+660
-436
lines changed

11 files changed

+660
-436
lines changed

Diff for: build/tmpl/text/changes.txt

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Changes log
77
- Bugs fixed
88
- Fixed invalid Class-Path header in manifest of the org.restlet.jar. Issue #698.
99
Reported by Marcin Zajączkowski and Christopher Dancy.
10+
- Fixed computation of request#originalRef when behind a proxy. Issue #1191.
1011

1112
- 2.3.6 (01/26/2016)
1213
- Bugs fixed

Diff for: modules/org.restlet.ext.jetty/src/org/restlet/ext/jetty/JettyServerHelper.java

-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232

3333
import javax.servlet.ServletException;
3434

35-
import org.eclipse.jetty.http.HttpGenerator;
3635
import org.eclipse.jetty.io.ArrayByteBufferPool;
3736
import org.eclipse.jetty.io.ByteBufferPool;
3837
import org.eclipse.jetty.server.ConnectionFactory;

Diff for: modules/org.restlet.ext.nio/src/org/restlet/ext/nio/internal/request/HttpInboundRequest.java

+19-26
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import org.restlet.engine.header.WarningReader;
6161
import org.restlet.engine.security.AuthenticatorUtils;
6262
import org.restlet.engine.util.DateUtils;
63+
import org.restlet.engine.util.ReferenceUtils;
6364
import org.restlet.ext.nio.internal.connection.Connection;
6465
import org.restlet.util.Series;
6566

@@ -746,16 +747,16 @@ public void setHeaders(Series<Header> headers) {
746747
} else {
747748
// IPv6 address handling.
748749
//
749-
// Two possible cases, host == "[::1]:8182" --using the 8182
750-
// port. host == "[::1]" ------ using the default port 80.
750+
// Two possible cases:
751+
// - host == "[::1]:8182" --using the 8182 port.
752+
// - host == "[::1]" ------ using the default port 80.
751753
//
752754
// For IPv6 address, we use ']' to separate the domain and the
753755
// port, because it's unique.
754756
if (rightSquareBracketIndex + 1 < host.length()) {
755757
// Using specified port
756758
hostDomain = host.substring(0, rightSquareBracketIndex + 1);
757-
hostPort = Integer.valueOf(host
758-
.substring(rightSquareBracketIndex + 2));
759+
hostPort = Integer.valueOf(host.substring(rightSquareBracketIndex + 2));
759760
} else if (rightSquareBracketIndex + 1 == host.length()) {
760761
// Must be using default port 80,
761762
hostDomain = host;
@@ -767,15 +768,11 @@ public void setHeaders(Series<Header> headers) {
767768
+ hostDomain + ", hostPort: " + hostPort);
768769
}
769770
} else {
770-
Protocol serverProtocol = getConnection().getHelper().getHelped()
771-
.getProtocols().get(0);
772-
773-
if (!Protocol.SIP.getSchemeName().equals(
774-
serverProtocol.getSchemeName())
775-
&& !Protocol.SIPS.getSchemeName().equals(
776-
serverProtocol.getSchemeName())) {
777-
Context.getCurrentLogger()
778-
.info("Couldn't find the mandatory \"Host\" HTTP header. Falling back to the IP address.");
771+
Protocol serverProtocol = getConnection().getHelper().getHelped().getProtocols().get(0);
772+
773+
if (!Protocol.SIP.getSchemeName().equals(serverProtocol.getSchemeName())
774+
&& !Protocol.SIPS.getSchemeName().equals(serverProtocol.getSchemeName())) {
775+
Context.getCurrentLogger().info("Couldn't find the mandatory \"Host\" HTTP header. Falling back to the IP address.");
779776
hostDomain = getConnection().getAddress();
780777
hostPort = getConnection().getPort();
781778

@@ -784,8 +781,7 @@ public void setHeaders(Series<Header> headers) {
784781
}
785782

786783
if (hostPort == -1) {
787-
hostPort = getConnection().getHelper().getHelped()
788-
.getActualPort();
784+
hostPort = getConnection().getHelper().getHelped().getActualPort();
789785
}
790786

791787
if (hostPort == -1) {
@@ -795,8 +791,7 @@ public void setHeaders(Series<Header> headers) {
795791
}
796792

797793
// Set the host reference
798-
Protocol protocol = getConnection().getHelper().getHelped()
799-
.getProtocols().get(0);
794+
Protocol protocol = getConnection().getHelper().getHelped().getProtocols().get(0);
800795
StringBuilder sb = new StringBuilder();
801796
sb.append(protocol.getSchemeName()).append("://");
802797
sb.append(hostDomain);
@@ -814,20 +809,18 @@ public void setHeaders(Series<Header> headers) {
814809
if (getResourceRef().isRelative()) {
815810
// Take care of the "/" between the host part and the segments.
816811
if (!resourceUri.startsWith("/")) {
817-
setResourceRef(new Reference(getHostRef().toString() + "/"
818-
+ resourceUri));
812+
setResourceRef(new Reference(getHostRef().toString() + "/" + resourceUri));
819813
} else {
820-
setResourceRef(new Reference(getHostRef().toString()
821-
+ resourceUri));
814+
setResourceRef(new Reference(getHostRef().toString() + resourceUri));
822815
}
823816
}
824817

825-
setOriginalRef(getResourceRef().getTargetRef());
818+
setOriginalRef(ReferenceUtils.getOriginalRef(getResourceRef(), headers));
826819
}
827820

828821
// Set the request date
829-
String dateHeader = (getHeaders() == null) ? null : getHeaders()
830-
.getFirstValue(HeaderConstants.HEADER_DATE, true);
822+
String dateHeader = (getHeaders() == null) ? null :
823+
getHeaders().getFirstValue(HeaderConstants.HEADER_DATE, true);
831824
Date date = null;
832825
if (dateHeader != null) {
833826
date = DateUtils.parse(dateHeader);
@@ -840,8 +833,8 @@ public void setHeaders(Series<Header> headers) {
840833
setDate(date);
841834

842835
// Set the max forwards
843-
String maxForwardsHeader = (getHeaders() == null) ? null : getHeaders()
844-
.getFirstValue(HeaderConstants.HEADER_MAX_FORWARDS, true);
836+
String maxForwardsHeader = (getHeaders() == null) ? null :
837+
getHeaders().getFirstValue(HeaderConstants.HEADER_MAX_FORWARDS, true);
845838
if (maxForwardsHeader != null) {
846839
try {
847840
setMaxForwards(Integer.parseInt(maxForwardsHeader));

Diff for: modules/org.restlet.ext.sip/src/org/restlet/ext/sip/internal/SipInboundRequest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import org.restlet.engine.header.WarningReader;
5959
import org.restlet.engine.security.AuthenticatorUtils;
6060
import org.restlet.engine.util.DateUtils;
61+
import org.restlet.engine.util.ReferenceUtils;
6162
import org.restlet.ext.nio.internal.connection.Connection;
6263
import org.restlet.ext.nio.internal.request.InboundRequest;
6364
import org.restlet.ext.sip.Address;
@@ -1145,7 +1146,7 @@ public void setHeaders(Series<Header> headers) {
11451146
}
11461147
}
11471148

1148-
setOriginalRef(getResourceRef().getTargetRef());
1149+
setOriginalRef(ReferenceUtils.getOriginalRef(getResourceRef(), headers));
11491150
}
11501151

11511152
// Set the request date

Diff for: modules/org.restlet.test/src/org/restlet/test/data/ReferenceTestCase.java

+15
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,13 @@
2828
import java.util.List;
2929

3030
import org.restlet.data.Form;
31+
import org.restlet.data.Header;
3132
import org.restlet.data.Protocol;
3233
import org.restlet.data.Reference;
34+
import org.restlet.engine.header.HeaderConstants;
35+
import org.restlet.engine.util.ReferenceUtils;
3336
import org.restlet.test.RestletTestCase;
37+
import org.restlet.util.Series;
3438

3539
/**
3640
* Test {@link org.restlet.data.Reference}.
@@ -199,6 +203,17 @@ public void testMatrix() {
199203
newForm.add("c", "4");
200204
assertEquals("a=1;b=2;c=4", newForm.getMatrixString());
201205
}
206+
207+
public void testOriginalRef() {
208+
Reference ref = new Reference("http://localhost/test");
209+
Series<Header> headers = new Series<>(Header.class);
210+
headers.add(HeaderConstants.HEADER_X_FORWARDED_PROTO, "HTTPS");
211+
headers.add(HeaderConstants.HEADER_X_FORWARDED_PORT, "123");
212+
213+
Reference originalRef = ReferenceUtils.getOriginalRef(ref, headers);
214+
assertEquals(originalRef.getSchemeProtocol(), Protocol.HTTPS);
215+
assertEquals(originalRef.getHostPort(), 123);
216+
}
202217

203218
/**
204219
* Test the computation of parent references, for absolute and relative

0 commit comments

Comments
 (0)