Handle 404 error

This commit is contained in:
lash 2022-01-24 19:46:25 +00:00
parent 54ee61efa8
commit e9c64d6deb
Signed by: lash
GPG Key ID: 21D2E7BB88C2A746
3 changed files with 29 additions and 3 deletions

7
cic_auth_helper/error.py Normal file
View File

@ -0,0 +1,7 @@
class NotFoundError(FileNotFoundError):
def __init__(self, code, msg, headers):
super(NotFoundError, self).__init__(msg)
self.code = code
self.msg = msg
self.headers = headers

View File

@ -4,6 +4,9 @@ import urllib.request
import os import os
import logging import logging
# local imports
from cic_auth_helper.error import NotFoundError
logg = logging.getLogger(__name__) logg = logging.getLogger(__name__)
@ -15,6 +18,12 @@ def add_x_headers(env, header_f):
header_orig = m[1].replace('_', '-') header_orig = m[1].replace('_', '-')
header_f(header_orig, env[x]) header_f(header_orig, env[x])
class ReverseProxyHandler(urllib.request.BaseHandler):
def http_error_404(self, request, response, code, msg, hdrs):
raise NotFoundError(code, msg, response.getheaders())
class ReverseProxy: class ReverseProxy:
@ -25,6 +34,7 @@ class ReverseProxy:
self.ignore_proxy_headers = [] self.ignore_proxy_headers = []
for h in ignore_proxy_headers: for h in ignore_proxy_headers:
self.ignore_proxy_headers.append(h.lower()) self.ignore_proxy_headers.append(h.lower())
self.opener = urllib.request.build_opener(ReverseProxyHandler())
def proxy_pass(self, env, headers=[]): def proxy_pass(self, env, headers=[]):
@ -34,7 +44,7 @@ class ReverseProxy:
add_x_headers(env, req.add_header) add_x_headers(env, req.add_header)
req.add_header('Content-Type', env.get('CONTENT_TYPE', 'application/octet-stream')) req.add_header('Content-Type', env.get('CONTENT_TYPE', 'application/octet-stream'))
req.data = env.get('wsgi.input') req.data = env.get('wsgi.input')
res = urllib.request.urlopen(req) res = self.opener.open(req)
logg.debug('headers before reverse proxy {}'.format(headers)) logg.debug('headers before reverse proxy {}'.format(headers))

View File

@ -23,6 +23,9 @@ from usumbufu.retrieve.file import FileFetcher
from usumbufu.adapters.uwsgi import UWSGIHTTPAuthorization from usumbufu.adapters.uwsgi import UWSGIHTTPAuthorization
from usumbufu.adapters.uwsgi import UWSGIAdapter from usumbufu.adapters.uwsgi import UWSGIAdapter
# local imports
from cic_auth_helper.error import NotFoundError
logging.basicConfig(level=logging.WARNING) logging.basicConfig(level=logging.WARNING)
logg = logging.getLogger() logg = logging.getLogger()
@ -135,6 +138,7 @@ def application(env, start_response):
# return [b''] # return [b'']
(challenge, expire) = challenger.request(env['REMOTE_ADDR']) (challenge, expire) = challenger.request(env['REMOTE_ADDR'])
headers.append(('WWW-Authenticate', hoba_auth_request_string(challenge, expire.timestamp(), realm=config.get('HTTP_AUTH_REALM'))),) headers.append(('WWW-Authenticate', hoba_auth_request_string(challenge, expire.timestamp(), realm=config.get('HTTP_AUTH_REALM'))),)
logg.debug('headers {}'.format(headers))
start_response('401 authenticate or I will SCREAM_SNAKE_CASE at you', headers) start_response('401 authenticate or I will SCREAM_SNAKE_CASE at you', headers)
return [b''] return [b'']
@ -156,9 +160,14 @@ def application(env, start_response):
response_status = '200 OK' response_status = '200 OK'
content = b'' content = b''
if reverse_proxy != None: if reverse_proxy != None:
(response_status, headers, content) = reverse_proxy.proxy_pass(env, headers) try:
(response_status, headers, content) = reverse_proxy.proxy_pass(env, headers)
except NotFoundError as e:
response_status = '404 ' + e.msg
headers = e.headers
content = b''
else: else:
content = str(auth_resource).encode('utf-8') content = str(auth_resource).encode('utf-8')
start_response('200 OK', headers) start_response(response_status, headers)
return [content] return [content]