1
0
mirror of https://github.com/webrecorder/pywb.git synced 2025-03-28 00:25:21 +01:00
pywb/pywb/handlers.py
Ilya Kreymer 6388a78162 refactor: replay_views to support cleaner inheritance, no longer
wrapping previous WbResponse

overhaul yaml config to be much simpler, move best resolver and
best index reader to respective classes

add config_utils for sharing config, standard non-yaml config
provides defaults for testing

fix bug in query.html
2014-02-03 09:24:40 -08:00

112 lines
3.6 KiB
Python

import views
import utils
import urlparse
from wbrequestresponse import WbResponse
from wburl import WbUrl
from wbexceptions import WbException
class BaseHandler:
@staticmethod
def get_wburl_type():
return WbUrl
def __call__(self, wbrequest):
return wbrequest
#=================================================================
# Standard WB Handler
#=================================================================
class WBHandler(BaseHandler):
def __init__(self, cdx_reader, replay, html_view = None, search_view = None, static_path = '/static/'):
self.cdx_reader = cdx_reader
self.replay = replay
self.text_view = views.TextCapturesView()
self.html_view = html_view
self.search_view = search_view
self.static_path = static_path
def __call__(self, wbrequest):
if wbrequest.wb_url_str == '/':
return self.render_search_page(wbrequest)
with utils.PerfTimer(wbrequest.env.get('X_PERF'), 'query') as t:
cdx_lines = self.cdx_reader.load_for_request(wbrequest, parsed_cdx = True)
# new special modifier to always show cdx index
if wbrequest.wb_url.mod == 'cdx_':
return self.text_view.render_response(wbrequest, cdx_lines)
if (wbrequest.wb_url.type == wbrequest.wb_url.QUERY) or (wbrequest.wb_url.type == wbrequest.wb_url.URL_QUERY):
query_view = self.html_view if self.html_view else self.text_view
return query_view.render_response(wbrequest, cdx_lines)
with utils.PerfTimer(wbrequest.env.get('X_PERF'), 'replay') as t:
return self.replay(wbrequest, cdx_lines, self.cdx_reader, self.static_path)
def render_search_page(self, wbrequest):
if self.search_view:
return self.search_view.render_response(wbrequest = wbrequest)
else:
return WbResponse.text_response('No Lookup Url Specified')
def __str__(self):
return 'WBHandler: ' + str(self.cdx_reader) + ', ' + str(self.replay)
#=================================================================
# CDX-Server Handler -- pass all params to cdx server
#=================================================================
class CDXHandler(BaseHandler):
def __init__(self, cdx_reader, view = None):
self.cdx_reader = cdx_reader
self.view = view if view else views.TextCapturesView()
def __call__(self, wbrequest):
#url = wbrequest.wb_url.url
# use url= param to get actual url
params = urlparse.parse_qs(wbrequest.env['QUERY_STRING'])
# parse_qs produces arrays for single values
# cdxreader expects singleton params for all except filters, so convert here
# use first value of the list
for name, val in params.iteritems():
if name != 'filter':
params[name] = val[0]
url = params.get('url')
if not url:
raise WbException('Must specify a url= param to query cdx server')
cdx_lines = self.cdx_reader.load_cdx(url, params, parsed_cdx = False)
return self.view.render_response(wbrequest, cdx_lines)
@staticmethod
def get_wburl_type():
return None
#=================================================================
# Debug Handlers
#=================================================================
class DebugEchoEnvHandler(BaseHandler):
def __call__(self, wbrequest):
return WbResponse.text_response(str(wbrequest.env))
#=================================================================
class DebugEchoHandler(BaseHandler):
def __call__(self, wbrequest):
return WbResponse.text_response(str(wbrequest))