summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorLV-426 <lv-426@taproot.org.il>2015-04-13 23:41:20 +0300
committerLV-426 <lv-426@taproot.org.il>2015-04-14 00:07:45 +0300
commit925b443eca4d4f7f68ceb4744e0f8825ae420f01 (patch)
treead1c6fc9cfc3621bb287d988a62ad9e41393c93a /src/server
parentcf314d67643628b957ab3f991e383819e71c4862 (diff)
[peer/host addr] rz_req_handling: sock_addr_from_env_HTTP_headers
Diffstat (limited to 'src/server')
-rw-r--r--src/server/rz_req_handling.py36
1 files changed, 33 insertions, 3 deletions
diff --git a/src/server/rz_req_handling.py b/src/server/rz_req_handling.py
index c0f6371c..44867d12 100644
--- a/src/server/rz_req_handling.py
+++ b/src/server/rz_req_handling.py
@@ -1,10 +1,11 @@
from flask import make_response
-from werkzeug.wrappers import BaseResponse as Response
+from functools import wraps
import json
-from rz_kernel import RZDoc_Exception__not_found
import logging
+from werkzeug.wrappers import BaseResponse as Response
+
from rz_api_common import API_Exception__bad_request
-from functools import wraps
+from rz_kernel import RZDoc_Exception__not_found
HTTP_STATUS__101_SWITCHING_PROTOCOLS = 101
@@ -85,6 +86,7 @@ def make_response__json(status=200, data={}):
resp = make_response(data_str)
resp.headers['Content-Type'] = "application/json"
resp.status = str(status)
+
return resp
def make_response__http__empty(status=200):
@@ -121,6 +123,34 @@ def make_response__json__redirect(redirect_url, status=303, html_str=''):
return make_response__json(status=status,
data={'response__html': html_str,
'redirect_url': redirect_url })
+
+def sock_addr_from_env_HTTP_headers(req_env, key_name__addr):
+ """
+ Extract remote socket address based on header data
+
+ [!] if header value contains more than a single address only the first one is used.
+
+ @param key_name__addr: header name to probe for address value
+ @return: (remote_addr, remote_port) where remote_port may be None
+ @raise Exception: if header is missing from env
+ """
+ header_key = 'HTTP_' + key_name__addr.upper().replace('-', '_')
+ addr_set_str = req_env.get(header_key)
+ if not addr_set_str:
+ raise Exception('\'%s\' header missing' % (key_name__addr))
+
+ addr_set = addr_set_str.split(',')
+ if len(addr_set) > 1:
+ log.warning('%s header contains multiple addresses, using first: header value: \'%s\'' % (key_name__addr, addr_set_str))
+ addr_val = addr_set.pop()
+
+ # deduce addr:port - port might not be present in header value
+ addr_val_arr = addr_val.split(':')
+ rmt_addr = addr_val_arr[0]
+ rmt_port = addr_val_arr[1] if 2 == len(addr_val_arr) else None
+
+ return rmt_addr, rmt_port
+
def sock_addr_from_REMOTE_X_keys(req_env):
rmt_addr = req_env['REMOTE_ADDR']
rmt_port = req_env['REMOTE_PORT']