1.1 --- a/WebStack/BaseHTTPRequestHandler.py Sun Feb 08 18:16:37 2004 +0000
1.2 +++ b/WebStack/BaseHTTPRequestHandler.py Sun Feb 08 21:41:46 2004 +0000
1.3 @@ -6,6 +6,7 @@
1.4
1.5 import Generic
1.6 from Helpers.Request import MessageBodyStream
1.7 +from Helpers.Auth import UserInfo
1.8 from cgi import FieldStorage
1.9 from StringIO import StringIO
1.10
1.11 @@ -29,6 +30,7 @@
1.12 self.content_type = None
1.13 self.response_code = 200
1.14 self.content = StringIO()
1.15 + self.headers = {}
1.16
1.17 def commit(self):
1.18
1.19 @@ -40,6 +42,8 @@
1.20 self.trans.send_response(self.response_code)
1.21 if self.content_type is not None:
1.22 self.trans.send_header("Content-Type", self.format_content_type(self.content_type))
1.23 + for header, value in self.headers.items():
1.24 + self.trans.send_header(self.format_header_value(header), self.format_header_value(value))
1.25 self.trans.end_headers()
1.26 self.content.seek(0)
1.27 self.trans.wfile.write(self.content.read())
1.28 @@ -137,9 +141,11 @@
1.29 transaction.
1.30 """
1.31
1.32 - # NOTE: Not implemented yet, but just pretend that there are no users.
1.33 -
1.34 - return None
1.35 + auth_header = self.get_headers().get("Authorization")
1.36 + if auth_header:
1.37 + return UserInfo(auth_header).username
1.38 + else:
1.39 + return None
1.40
1.41 # Response-related methods.
1.42
1.43 @@ -172,6 +178,16 @@
1.44
1.45 self.response_code = response_code
1.46
1.47 + def set_header(self, header, value):
1.48 +
1.49 + """
1.50 + Set the HTTP 'header' with the given 'value'.
1.51 + """
1.52 +
1.53 + # The header is not written out immediately due to the buffering in use.
1.54 +
1.55 + self.headers[header] = value
1.56 +
1.57 def set_content_type(self, content_type):
1.58
1.59 """
2.1 --- a/WebStack/Generic.py Sun Feb 08 18:16:37 2004 +0000
2.2 +++ b/WebStack/Generic.py Sun Feb 08 21:41:46 2004 +0000
2.3 @@ -73,6 +73,15 @@
2.4
2.5 return field.encode("US-ASCII")
2.6
2.7 + def format_header_value(self, value):
2.8 +
2.9 + """
2.10 + Format the given header 'value'. Typically, this just ensures the usage
2.11 + of US-ASCII.
2.12 + """
2.13 +
2.14 + return value.encode("US-ASCII")
2.15 +
2.16 def parse_content_preferences(self, accept_preference):
2.17
2.18 """
2.19 @@ -212,6 +221,14 @@
2.20
2.21 raise NotImplementedError, "set_response_code"
2.22
2.23 + def set_header(self, header, value):
2.24 +
2.25 + """
2.26 + Set the HTTP 'header' with the given 'value'.
2.27 + """
2.28 +
2.29 + raise NotImplementedError, "set_header"
2.30 +
2.31 def set_content_type(self, content_type):
2.32
2.33 """
3.1 --- a/WebStack/ModPython.py Sun Feb 08 18:16:37 2004 +0000
3.2 +++ b/WebStack/ModPython.py Sun Feb 08 21:41:46 2004 +0000
3.3 @@ -142,6 +142,14 @@
3.4
3.5 self.response_code = response_code
3.6
3.7 + def set_header(self, header, value):
3.8 +
3.9 + """
3.10 + Set the HTTP 'header' with the given 'value'.
3.11 + """
3.12 +
3.13 + self.trans.headers_out[self.format_header_value(header)] = self.format_header_value(value)
3.14 +
3.15 def set_content_type(self, content_type):
3.16
3.17 """
4.1 --- a/WebStack/Twisted.py Sun Feb 08 18:16:37 2004 +0000
4.2 +++ b/WebStack/Twisted.py Sun Feb 08 21:41:46 2004 +0000
4.3 @@ -5,6 +5,7 @@
4.4 """
4.5
4.6 import Generic
4.7 +from Helpers.Auth import UserInfo
4.8
4.9 class Transaction(Generic.Transaction):
4.10
4.11 @@ -114,9 +115,13 @@
4.12 transaction.
4.13 """
4.14
4.15 - # NOTE: Not implemented yet, but just pretend that there are no users.
4.16 + # NOTE: Twisted makes headers lower case, for some reason.
4.17
4.18 - return None
4.19 + auth_header = self.get_headers().get("authorization")
4.20 + if auth_header:
4.21 + return UserInfo(auth_header).username
4.22 + else:
4.23 + return None
4.24
4.25 # Response-related methods.
4.26
4.27 @@ -149,6 +154,14 @@
4.28
4.29 self.trans.setResponseCode(response_code)
4.30
4.31 + def set_header(self, header, value):
4.32 +
4.33 + """
4.34 + Set the HTTP 'header' with the given 'value'.
4.35 + """
4.36 +
4.37 + self.trans.setHeader(self.format_header_value(header), self.format_header_value(value))
4.38 +
4.39 def set_content_type(self, content_type):
4.40
4.41 """
5.1 --- a/WebStack/Webware.py Sun Feb 08 18:16:37 2004 +0000
5.2 +++ b/WebStack/Webware.py Sun Feb 08 21:41:46 2004 +0000
5.3 @@ -119,7 +119,14 @@
5.4 transaction.
5.5 """
5.6
5.7 - return self.trans.request().remoteUser()
5.8 + # NOTE: Webware relies entirely on a CGI-style environment where the
5.9 + # NOTE: actual headers are not available. Therefore, the Web server must
5.10 + # NOTE: itself be set up to provide user support.
5.11 +
5.12 + try:
5.13 + return self.trans.request().remoteUser()
5.14 + except KeyError, exc:
5.15 + return None
5.16
5.17 # Response-related methods.
5.18
5.19 @@ -159,6 +166,14 @@
5.20
5.21 self.trans.response().setStatus(response_code)
5.22
5.23 + def set_header(self, header, value):
5.24 +
5.25 + """
5.26 + Set the HTTP 'header' with the given 'value'.
5.27 + """
5.28 +
5.29 + self.trans.response().setHeader(self.format_header_value(header), self.format_header_value(value))
5.30 +
5.31 def set_content_type(self, content_type):
5.32
5.33 """