mirror of
https://github.com/httpie/cli.git
synced 2025-02-04 19:59:16 +01:00
Use the full capability of HttpLexer
This commit is contained in:
parent
2d7f2c65a2
commit
4aa86cb438
@ -1,8 +1,11 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
import sys
|
import sys
|
||||||
import json
|
import json
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
from requests.compat import str
|
from requests.compat import str
|
||||||
|
|
||||||
from . import httpmessage
|
from . import httpmessage
|
||||||
from . import cliparse
|
from . import cliparse
|
||||||
from . import cli
|
from . import cli
|
||||||
@ -81,13 +84,14 @@ def _get_output(args, stdout_isatty, response):
|
|||||||
do_output_response = (cliparse.OUT_RESP_HEADERS in args.output_options
|
do_output_response = (cliparse.OUT_RESP_HEADERS in args.output_options
|
||||||
or cliparse.OUT_RESP_BODY in args.output_options)
|
or cliparse.OUT_RESP_BODY in args.output_options)
|
||||||
|
|
||||||
prettifier = pretty.PrettyHttp(args.style) if do_prettify else None
|
formatter = pretty.formatter(args.style) if do_prettify else None
|
||||||
output = []
|
output = []
|
||||||
|
|
||||||
if do_output_request:
|
if do_output_request:
|
||||||
output.append(httpmessage.format(
|
output.append(httpmessage.format(
|
||||||
message=httpmessage.from_request(response.request),
|
message=httpmessage.from_request(response.request),
|
||||||
prettifier=prettifier,
|
pretty=do_prettify,
|
||||||
|
formatter=formatter,
|
||||||
with_headers=cliparse.OUT_REQ_HEADERS in args.output_options,
|
with_headers=cliparse.OUT_REQ_HEADERS in args.output_options,
|
||||||
with_body=cliparse.OUT_REQ_BODY in args.output_options
|
with_body=cliparse.OUT_REQ_BODY in args.output_options
|
||||||
))
|
))
|
||||||
@ -97,7 +101,8 @@ def _get_output(args, stdout_isatty, response):
|
|||||||
if do_output_response:
|
if do_output_response:
|
||||||
output.append(httpmessage.format(
|
output.append(httpmessage.format(
|
||||||
message=httpmessage.from_response(response),
|
message=httpmessage.from_response(response),
|
||||||
prettifier=prettifier,
|
pretty=do_prettify,
|
||||||
|
formatter=formatter,
|
||||||
with_headers=cliparse.OUT_RESP_HEADERS in args.output_options,
|
with_headers=cliparse.OUT_RESP_HEADERS in args.output_options,
|
||||||
with_body=cliparse.OUT_RESP_BODY in args.output_options
|
with_body=cliparse.OUT_RESP_BODY in args.output_options
|
||||||
))
|
))
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
import json
|
||||||
|
|
||||||
|
from pygments import highlight
|
||||||
|
from pygments.lexers import HttpLexer
|
||||||
from requests.compat import urlparse
|
from requests.compat import urlparse
|
||||||
|
|
||||||
|
|
||||||
@ -38,29 +42,32 @@ def from_response(response):
|
|||||||
return HTTPMessage(
|
return HTTPMessage(
|
||||||
line='HTTP/{version} {status} {reason}'.format(
|
line='HTTP/{version} {status} {reason}'.format(
|
||||||
version='.'.join(str(original.version)),
|
version='.'.join(str(original.version)),
|
||||||
status=original.status, reason=original.reason,),
|
status=original.status, reason=original.reason),
|
||||||
headers=str(original.msg),
|
headers=str(original.msg),
|
||||||
body=response.content.decode(encoding) if response.content else '',
|
body=response.content.decode(encoding) if response.content else '',
|
||||||
content_type=response_headers.get('Content-Type'))
|
content_type=response_headers.get('Content-Type'))
|
||||||
|
|
||||||
|
|
||||||
def format(message, prettifier=None,
|
def format(message, formatter=None, pretty=False,
|
||||||
with_headers=True, with_body=True):
|
with_headers=True, with_body=True):
|
||||||
"""Return a `unicode` representation of `message`. """
|
"""Return a `unicode` representation of `message`. """
|
||||||
bits = []
|
bits = []
|
||||||
if with_headers:
|
if with_headers:
|
||||||
if prettifier:
|
bits.append(message.line)
|
||||||
bits.append(prettifier.headers(message.line))
|
bits.append(message.headers)
|
||||||
bits.append(prettifier.headers(message.headers))
|
|
||||||
else:
|
|
||||||
bits.append(message.line)
|
|
||||||
bits.append(message.headers)
|
|
||||||
if with_body and message.body:
|
if with_body and message.body:
|
||||||
bits.append('\n')
|
bits.append('\n')
|
||||||
if with_body and message.body:
|
if with_body and message.body:
|
||||||
if prettifier and message.content_type:
|
if (pretty and message.content_type and
|
||||||
bits.append(prettifier.body(message.body, message.content_type))
|
message.content_type.split(';')[0] == 'application/json'):
|
||||||
|
# Indent and sort the JSON data.
|
||||||
|
bits.append(json.dumps(json.loads(message.body),
|
||||||
|
sort_keys=True, indent=4))
|
||||||
else:
|
else:
|
||||||
bits.append(message.body)
|
bits.append(message.body)
|
||||||
bits.append('\n')
|
bits.append('\n')
|
||||||
return '\n'.join(bit.strip() for bit in bits)
|
result = '\n'.join(bit.strip() for bit in bits)
|
||||||
|
if pretty:
|
||||||
|
return highlight(result, HttpLexer(), formatter)
|
||||||
|
|
||||||
|
return result
|
||||||
|
@ -1,12 +1,15 @@
|
|||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
|
|
||||||
import pygments
|
import pygments
|
||||||
|
|
||||||
from pygments import token
|
from pygments import token
|
||||||
from pygments.util import ClassNotFound
|
from pygments.util import ClassNotFound
|
||||||
from pygments.lexers import get_lexer_for_mimetype, HttpLexer
|
|
||||||
from pygments.formatters.terminal256 import Terminal256Formatter
|
|
||||||
from pygments.formatters.terminal import TerminalFormatter
|
|
||||||
from pygments.styles import get_style_by_name, STYLE_MAP
|
from pygments.styles import get_style_by_name, STYLE_MAP
|
||||||
|
from pygments.lexers import get_lexer_for_mimetype, HttpLexer
|
||||||
|
from pygments.formatters.terminal import TerminalFormatter
|
||||||
|
from pygments.formatters.terminal256 import Terminal256Formatter
|
||||||
|
|
||||||
from . import solarized
|
from . import solarized
|
||||||
|
|
||||||
|
|
||||||
@ -16,32 +19,12 @@ FORMATTER = (Terminal256Formatter
|
|||||||
if '256color' in os.environ.get('TERM', '')
|
if '256color' in os.environ.get('TERM', '')
|
||||||
else TerminalFormatter)
|
else TerminalFormatter)
|
||||||
|
|
||||||
class PrettyHttp(object):
|
|
||||||
|
|
||||||
def __init__(self, style_name):
|
def formatter(style_name):
|
||||||
if style_name == 'solarized':
|
if style_name == 'solarized':
|
||||||
style = solarized.SolarizedStyle
|
style = solarized.SolarizedStyle
|
||||||
else:
|
|
||||||
style = get_style_by_name(style_name)
|
|
||||||
self.formatter = FORMATTER(style=style)
|
|
||||||
|
|
||||||
def headers(self, content):
|
else:
|
||||||
return pygments.highlight(content, HttpLexer(), self.formatter)
|
style = get_style_by_name(style_name)
|
||||||
|
|
||||||
def body(self, content, content_type):
|
return FORMATTER(style=style)
|
||||||
content_type = content_type.split(';')[0]
|
|
||||||
|
|
||||||
try:
|
|
||||||
lexer = get_lexer_for_mimetype(content_type)
|
|
||||||
except ClassNotFound:
|
|
||||||
return content
|
|
||||||
|
|
||||||
if 'json' in content_type:
|
|
||||||
try:
|
|
||||||
# Indent the JSON data.
|
|
||||||
content = json.dumps(json.loads(content),
|
|
||||||
sort_keys=True, indent=4)
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
return pygments.highlight(content, lexer, self.formatter)
|
|
||||||
|
Loading…
Reference in New Issue
Block a user