From f361c66ad8eb5e3d9c88a1f7d43acbb6e91b4b25 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Sun, 12 Jun 2011 20:54:41 -0400 Subject: [PATCH] request logging --- httpbin/core.py | 145 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 128 insertions(+), 17 deletions(-) diff --git a/httpbin/core.py b/httpbin/core.py index 0839b5e..7140bca 100644 --- a/httpbin/core.py +++ b/httpbin/core.py @@ -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() + )