Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Set X-Forwarded-Proto header when frontend-proxy proxies a request (#…
Browse files Browse the repository at this point in the history
…9539)

Should fix some remaining warnings
  • Loading branch information
richvdh authored Mar 3, 2021
1 parent a4fa044 commit 4db07f9
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 2 deletions.
1 change: 1 addition & 0 deletions changelog.d/9539.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add support for `X-Forwarded-Proto` header when using a reverse proxy.
15 changes: 13 additions & 2 deletions synapse/app/generic_worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

from twisted.internet import address
from twisted.web.resource import IResource
from twisted.web.server import Request

import synapse
import synapse.events
Expand Down Expand Up @@ -190,7 +191,7 @@ def __init__(self, hs):
self.http_client = hs.get_simple_http_client()
self.main_uri = hs.config.worker_main_http_uri

async def on_POST(self, request, device_id):
async def on_POST(self, request: Request, device_id: Optional[str]):
requester = await self.auth.get_user_by_req(request, allow_guest=True)
user_id = requester.user.to_string()
body = parse_json_object_from_request(request)
Expand Down Expand Up @@ -223,10 +224,12 @@ async def on_POST(self, request, device_id):
header: request.requestHeaders.getRawHeaders(header, [])
for header in (b"Authorization", b"User-Agent")
}
# Add the previous hop the the X-Forwarded-For header.
# Add the previous hop to the X-Forwarded-For header.
x_forwarded_for = request.requestHeaders.getRawHeaders(
b"X-Forwarded-For", []
)
# we use request.client here, since we want the previous hop, not the
# original client (as returned by request.getClientAddress()).
if isinstance(request.client, (address.IPv4Address, address.IPv6Address)):
previous_host = request.client.host.encode("ascii")
# If the header exists, add to the comma-separated list of the first
Expand All @@ -239,6 +242,14 @@ async def on_POST(self, request, device_id):
x_forwarded_for = [previous_host]
headers[b"X-Forwarded-For"] = x_forwarded_for

# Replicate the original X-Forwarded-Proto header. Note that
# XForwardedForRequest overrides isSecure() to give us the original protocol
# used by the client, as opposed to the protocol used by our upstream proxy
# - which is what we want here.
headers[b"X-Forwarded-Proto"] = [
b"https" if request.isSecure() else b"http"
]

try:
result = await self.http_client.post_json_get_json(
self.main_uri + request.uri.decode("ascii"), body, headers=headers
Expand Down

0 comments on commit 4db07f9

Please sign in to comment.