Skip to content

Commit 86eac4c

Browse files
authored
Merge pull request #2479 from benoitc/capture-peer-name
Capture peer name from accept
2 parents 03c642e + 3573fd3 commit 86eac4c

File tree

7 files changed

+20
-32
lines changed

7 files changed

+20
-32
lines changed

gunicorn/http/message.py

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66
import io
77
import re
88
import socket
9-
from errno import ENOTCONN
109

11-
from gunicorn.http.unreader import SocketUnreader
1210
from gunicorn.http.body import ChunkedReader, LengthReader, EOFReader, Body
1311
from gunicorn.http.errors import (
1412
InvalidHeader, InvalidHeaderName, NoMoreData,
@@ -29,9 +27,10 @@
2927

3028

3129
class Message(object):
32-
def __init__(self, cfg, unreader):
30+
def __init__(self, cfg, unreader, peer_addr):
3331
self.cfg = cfg
3432
self.unreader = unreader
33+
self.peer_addr = peer_addr
3534
self.version = None
3635
self.headers = []
3736
self.trailers = []
@@ -69,16 +68,10 @@ def parse_headers(self, data):
6968
# handle scheme headers
7069
scheme_header = False
7170
secure_scheme_headers = {}
72-
if '*' in cfg.forwarded_allow_ips:
71+
if ('*' in cfg.forwarded_allow_ips or
72+
not isinstance(self.peer_addr, tuple)
73+
or self.peer_addr[0] in cfg.forwarded_allow_ips):
7374
secure_scheme_headers = cfg.secure_scheme_headers
74-
elif isinstance(self.unreader, SocketUnreader):
75-
remote_addr = self.unreader.sock.getpeername()
76-
if self.unreader.sock.family in (socket.AF_INET, socket.AF_INET6):
77-
remote_host = remote_addr[0]
78-
if remote_host in cfg.forwarded_allow_ips:
79-
secure_scheme_headers = cfg.secure_scheme_headers
80-
elif self.unreader.sock.family == socket.AF_UNIX:
81-
secure_scheme_headers = cfg.secure_scheme_headers
8275

8376
# Parse headers into key/value pairs paying attention
8477
# to continuation lines.
@@ -169,7 +162,7 @@ def should_close(self):
169162

170163

171164
class Request(Message):
172-
def __init__(self, cfg, unreader, req_number=1):
165+
def __init__(self, cfg, unreader, peer_addr, req_number=1):
173166
self.method = None
174167
self.uri = None
175168
self.path = None
@@ -184,7 +177,7 @@ def __init__(self, cfg, unreader, req_number=1):
184177

185178
self.req_number = req_number
186179
self.proxy_protocol_info = None
187-
super().__init__(cfg, unreader)
180+
super().__init__(cfg, unreader, peer_addr)
188181

189182
def get_data(self, unreader, buf, stop=False):
190183
data = unreader.read()
@@ -280,16 +273,10 @@ def proxy_protocol(self, line):
280273

281274
def proxy_protocol_access_check(self):
282275
# check in allow list
283-
if isinstance(self.unreader, SocketUnreader):
284-
try:
285-
remote_host = self.unreader.sock.getpeername()[0]
286-
except socket.error as e:
287-
if e.args[0] == ENOTCONN:
288-
raise ForbiddenProxyRequest("UNKNOW")
289-
raise
290-
if ("*" not in self.cfg.proxy_allow_ips and
291-
remote_host not in self.cfg.proxy_allow_ips):
292-
raise ForbiddenProxyRequest(remote_host)
276+
if ("*" not in self.cfg.proxy_allow_ips and
277+
isinstance(self.peer_addr, tuple) and
278+
self.peer_addr[0] not in self.cfg.proxy_allow_ips):
279+
raise ForbiddenProxyRequest(self.peer_addr[0])
293280

294281
def parse_proxy_protocol(self, line):
295282
bits = line.split()

gunicorn/http/parser.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@ class Parser(object):
1111

1212
mesg_class = None
1313

14-
def __init__(self, cfg, source):
14+
def __init__(self, cfg, source, source_addr):
1515
self.cfg = cfg
1616
if hasattr(source, "recv"):
1717
self.unreader = SocketUnreader(source)
1818
else:
1919
self.unreader = IterUnreader(source)
2020
self.mesg = None
21+
self.source_addr = source_addr
2122

2223
# request counter (for keepalive connetions)
2324
self.req_count = 0
@@ -38,7 +39,7 @@ def __next__(self):
3839

3940
# Parse the next request
4041
self.req_count += 1
41-
self.mesg = self.mesg_class(self.cfg, self.unreader, self.req_count)
42+
self.mesg = self.mesg_class(self.cfg, self.unreader, self.source_addr, self.req_count)
4243
if not self.mesg:
4344
raise StopIteration()
4445
return self.mesg

gunicorn/workers/base_async.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def is_already_handled(self, respiter):
3333
def handle(self, listener, client, addr):
3434
req = None
3535
try:
36-
parser = http.RequestParser(self.cfg, client)
36+
parser = http.RequestParser(self.cfg, client, addr)
3737
try:
3838
listener_name = listener.getsockname()
3939
if not self.cfg.keepalive:

gunicorn/workers/gthread.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def init(self):
5353
**self.cfg.ssl_options)
5454

5555
# initialize the parser
56-
self.parser = http.RequestParser(self.cfg, self.sock)
56+
self.parser = http.RequestParser(self.cfg, self.sock, self.client)
5757

5858
def set_timeout(self):
5959
# set the timeout

gunicorn/workers/sync.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def handle(self, listener, client, addr):
131131
client = ssl.wrap_socket(client, server_side=True,
132132
**self.cfg.ssl_options)
133133

134-
parser = http.RequestParser(self.cfg, client)
134+
parser = http.RequestParser(self.cfg, client, addr)
135135
req = next(parser)
136136
self.handle_request(listener, req, client, addr)
137137
except http.errors.NoMoreData as e:

tests/t.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def __init__(self, name):
2929
def __call__(self, func):
3030
def run():
3131
src = data_source(self.fname)
32-
func(src, RequestParser(src, None))
32+
func(src, RequestParser(src, None, None))
3333
run.func_name = func.func_name
3434
return run
3535

tests/treq.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ def test_req(sn, sz, mt):
245245

246246
def check(self, cfg, sender, sizer, matcher):
247247
cases = self.expect[:]
248-
p = RequestParser(cfg, sender())
248+
p = RequestParser(cfg, sender(), None)
249249
for req in p:
250250
self.same(req, sizer, matcher, cases.pop(0))
251251
assert not cases
@@ -282,5 +282,5 @@ def send(self):
282282
read += chunk
283283

284284
def check(self, cfg):
285-
p = RequestParser(cfg, self.send())
285+
p = RequestParser(cfg, self.send(), None)
286286
next(p)

0 commit comments

Comments
 (0)