diff options
Diffstat (limited to 'libpathod/language/http.py')
| -rw-r--r-- | libpathod/language/http.py | 73 |
1 files changed, 60 insertions, 13 deletions
diff --git a/libpathod/language/http.py b/libpathod/language/http.py index 30a5fd9f..a759aeb1 100644 --- a/libpathod/language/http.py +++ b/libpathod/language/http.py @@ -4,7 +4,7 @@ import abc import contrib.pyparsing as pp import netlib.websockets -from netlib import http_status +from netlib import http_status, http_uastrings from . import base, generators, exceptions @@ -45,6 +45,49 @@ class Method(base.OptionsOrValue): ] +class _HeaderMixin(object): + def format_header(self, key, value): + return [key, ": ", value, "\r\n"] + + def values(self, settings): + return self.format_header( + self.key.get_generator(settings), + self.value.get_generator(settings), + ) + + +class Header(_HeaderMixin, base.KeyValue): + preamble = "h" + + +class ShortcutContentType(_HeaderMixin, base.PreValue): + preamble = "c" + key = base.ValueLiteral("Content-Type") + + +class ShortcutLocation(_HeaderMixin, base.PreValue): + preamble = "l" + key = base.ValueLiteral("Location") + + +class ShortcutUserAgent(_HeaderMixin, base.OptionsOrValue): + preamble = "u" + options = [i[1] for i in http_uastrings.UASTRINGS] + key = base.ValueLiteral("User-Agent") + + def values(self, settings): + if self.option_used: + value = http_uastrings.get_by_shortcut( + self.value.val.lower() + )[2] + else: + value = self.value + return self.format_header( + self.key.get_generator(settings), + value + ) + + def get_header(val, headers): """ Header keys may be Values, so we have to "generate" them as we try the @@ -72,6 +115,10 @@ class _HTTPMessage(base._Message): def preamble(self, settings): # pragma: no cover pass + @property + def headers(self): + return self.toks(_HeaderMixin) + def values(self, settings): vals = self.preamble(settings) vals.append("\r\n") @@ -86,12 +133,12 @@ class _HTTPMessage(base._Message): class Response(_HTTPMessage): comps = ( Body, - base.Header, + Header, base.PauseAt, base.DisconnectAt, base.InjectAt, - base.ShortcutContentType, - base.ShortcutLocation, + ShortcutContentType, + ShortcutLocation, Raw, Reason ) @@ -145,7 +192,7 @@ class Response(_HTTPMessage): for i in hdrs.lst: if not get_header(i[0], self.headers): tokens.append( - base.Header( + Header( base.ValueLiteral(i[0]), base.ValueLiteral(i[1])) ) @@ -156,7 +203,7 @@ class Response(_HTTPMessage): else: length = len(self.body.value.get_generator(settings)) tokens.append( - base.Header( + Header( base.ValueLiteral("Content-Length"), base.ValueLiteral(str(length)), ) @@ -193,12 +240,12 @@ class Response(_HTTPMessage): class Request(_HTTPMessage): comps = ( Body, - base.Header, + Header, base.PauseAt, base.DisconnectAt, base.InjectAt, - base.ShortcutContentType, - base.ShortcutUserAgent, + ShortcutContentType, + ShortcutUserAgent, Raw, base.PathodSpec, ) @@ -241,7 +288,7 @@ class Request(_HTTPMessage): for i in netlib.websockets.client_handshake_headers().lst: if not get_header(i[0], self.headers): tokens.append( - base.Header( + Header( base.ValueLiteral(i[0]), base.ValueLiteral(i[1]) ) @@ -251,7 +298,7 @@ class Request(_HTTPMessage): if self.body: length = len(self.body.value.get_generator(settings)) tokens.append( - base.Header( + Header( base.ValueLiteral("Content-Length"), base.ValueLiteral(str(length)), ) @@ -259,7 +306,7 @@ class Request(_HTTPMessage): if settings.request_host: if not get_header("Host", self.headers): tokens.append( - base.Header( + Header( base.ValueLiteral("Host"), base.ValueLiteral(settings.request_host) ) @@ -302,7 +349,7 @@ class PathodErrorResponse(Response): def make_error_response(reason, body=None): tokens = [ Code("800"), - base.Header( + Header( base.ValueLiteral("Content-Type"), base.ValueLiteral("text/plain") ), |
