mirror of
https://github.com/kennethreitz/httpbin.git
synced 2026-06-05 23:00:18 +00:00
request logging
This commit is contained in:
+128
-17
@@ -7,26 +7,65 @@ httpbin.core
|
||||
This module provides the core HttpBin experience.
|
||||
"""
|
||||
|
||||
import os
|
||||
import json
|
||||
from time import time as now
|
||||
from decimal import Decimal
|
||||
|
||||
from decorator import decorator
|
||||
from flask import Flask, request, render_template
|
||||
import redi
|
||||
|
||||
from .structures import CaseInsensitiveDict
|
||||
from decorator import decorator
|
||||
from flask import Flask, request, render_template, g
|
||||
|
||||
|
||||
from .db import redis_connect
|
||||
from .helpers import get_files, get_headers
|
||||
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
|
||||
# ------
|
||||
# Config
|
||||
# ------
|
||||
|
||||
def logging_is_enabled():
|
||||
"""Returns bool to determine if logging is enabled or not."""
|
||||
|
||||
return os.environ.get('HTTPBIN_LOG_REQUESTS', False)
|
||||
|
||||
|
||||
|
||||
# --------------
|
||||
# Pre-Processing
|
||||
# --------------
|
||||
|
||||
if logging_is_enabled:
|
||||
|
||||
@app.before_request
|
||||
def db_connect():
|
||||
"""Connects Redis to g object."""
|
||||
|
||||
# redis connect
|
||||
if not getattr(g, 'r', None):
|
||||
g.r = redis_connect()
|
||||
redi.config.init(r=g.r)
|
||||
|
||||
|
||||
|
||||
# --------------
|
||||
# Output Filters
|
||||
# --------------
|
||||
|
||||
|
||||
@decorator
|
||||
def json_resource(f, runtime=True, *args, **kwargs):
|
||||
|
||||
_t0 = now()
|
||||
_dict = f(*args, **kwargs)
|
||||
data = f(*args, **kwargs)
|
||||
_t1 = now()
|
||||
|
||||
dump = json.dumps(_dict)
|
||||
dump = json.dumps(data, sort_keys=True, indent=3)
|
||||
|
||||
r = app.make_response(dump)
|
||||
r.headers['Content-Type'] = 'application/json'
|
||||
@@ -35,6 +74,25 @@ def json_resource(f, runtime=True, *args, **kwargs):
|
||||
return r
|
||||
|
||||
|
||||
|
||||
def log_request(key):
|
||||
"""Logging Decorator."""
|
||||
|
||||
def log_request(f, *args, **kwargs):
|
||||
|
||||
response = f(*args, **kwargs)
|
||||
|
||||
if logging_is_enabled():
|
||||
# store request in redis list
|
||||
redi.s.httplib._(key, 'list').append(response)
|
||||
|
||||
return response
|
||||
|
||||
return decorator(log_request)
|
||||
|
||||
|
||||
|
||||
|
||||
# ------
|
||||
# Routes
|
||||
# ------
|
||||
@@ -48,46 +106,99 @@ def view_landing_page():
|
||||
|
||||
@app.route('/ip')
|
||||
@json_resource
|
||||
@log_request(key='httpbin:ip')
|
||||
def view_origin():
|
||||
"""Returns Origin IP."""
|
||||
|
||||
return dict(ip=request.remote_addr)
|
||||
return dict(origin=request.remote_addr)
|
||||
|
||||
|
||||
@app.route('/headers')
|
||||
@json_resource
|
||||
@log_request(key='httpbin:headers')
|
||||
def view_headers():
|
||||
"""Returns HTTP HEADERS."""
|
||||
|
||||
headers = CaseInsensitiveDict(request.headers.items())
|
||||
headers = get_headers()
|
||||
|
||||
return dict(headers=headers)
|
||||
|
||||
|
||||
|
||||
@app.route('/user-agent')
|
||||
@json_resource
|
||||
@log_request(key='httpbin:user-agent')
|
||||
def view_user_agent():
|
||||
"""Returns User-Agent."""
|
||||
|
||||
headers = CaseInsensitiveDict(request.headers.items())
|
||||
headers = get_headers()
|
||||
|
||||
return dict(useragent=headers['user-agent'])
|
||||
|
||||
|
||||
|
||||
@app.route('/get')
|
||||
@app.route('/get', methods=('GET',))
|
||||
@json_resource
|
||||
@log_request(key='httpbin:get')
|
||||
def view_get():
|
||||
return 'get'
|
||||
"""Returns GET Data."""
|
||||
|
||||
return dict(
|
||||
url=request.url,
|
||||
args=request.args,
|
||||
headers=get_headers(),
|
||||
origin=request.remote_addr
|
||||
)
|
||||
|
||||
|
||||
|
||||
# /headers
|
||||
# /get
|
||||
# /post
|
||||
# /put
|
||||
# /delete
|
||||
@app.route('/post', methods=('POST',))
|
||||
@json_resource
|
||||
@log_request(key='httpbin:post')
|
||||
def view_post():
|
||||
"""Returns POST Data."""
|
||||
|
||||
return dict(
|
||||
url=request.url,
|
||||
args=request.args,
|
||||
form=request.form,
|
||||
data=request.data,
|
||||
origin=request.remote_addr,
|
||||
headers=get_headers(),
|
||||
files=get_files()
|
||||
)
|
||||
|
||||
|
||||
@app.route('/put', methods=('PUT',))
|
||||
@json_resource
|
||||
@log_request(key='httpbin:put')
|
||||
def view_post():
|
||||
"""Returns PUT Data."""
|
||||
|
||||
return dict(
|
||||
url=request.url,
|
||||
args=request.args,
|
||||
form=request.form,
|
||||
data=request.data,
|
||||
origin=request.remote_addr,
|
||||
headers=get_headers(),
|
||||
files=get_files()
|
||||
)
|
||||
|
||||
|
||||
@app.route('/delete', methods=('DELETE',))
|
||||
@json_resource
|
||||
@log_request(key='httpbin:delete')
|
||||
def view_post():
|
||||
"""Returns DETLETE Data."""
|
||||
|
||||
return dict(
|
||||
url=request.url,
|
||||
args=request.args,
|
||||
form=request.form,
|
||||
data=request.data,
|
||||
origin=request.remote_addr,
|
||||
headers=get_headers(),
|
||||
files=get_files()
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user