mirror of
https://github.com/webrecorder/pywb.git
synced 2025-03-19 18:29:37 +01:00
81 lines
2.4 KiB
Python
81 lines
2.4 KiB
Python
import indexreader
|
|
import utils
|
|
import wbrequestresponse
|
|
import wbexceptions
|
|
|
|
from jinja2 import Environment, FileSystemLoader
|
|
|
|
class QueryHandler:
|
|
def __init__(self, cdxserver = None):
|
|
if not cdxserver:
|
|
cdxserver = indexreader.RemoteCDXServer('http://web.archive.org/cdx/search/cdx')
|
|
|
|
self.cdxserver = cdxserver
|
|
|
|
def __call__(self, wbrequest):
|
|
wburl = wbrequest.wb_url
|
|
|
|
# init standard params
|
|
params = self.cdxserver.getQueryParams(wburl)
|
|
|
|
# add any custom params from the request
|
|
params.update(wbrequest.customParams)
|
|
|
|
cdxlines = self.cdxserver.load(wburl.url, params)
|
|
|
|
cdxlines = utils.peek_iter(cdxlines)
|
|
|
|
if cdxlines is None:
|
|
raise wbexceptions.NotFoundException('WB Does Not Have Url: ' + wburl.url)
|
|
|
|
cdxlines = self.filterCdx(wbrequest, cdxlines)
|
|
|
|
# Output raw cdx stream
|
|
return wbrequestresponse.WbResponse.text_stream(cdxlines)
|
|
|
|
def filterCdx(self, wbrequest, cdxlines):
|
|
# Subclasses may wrap cdxlines iterator in a filter
|
|
return cdxlines
|
|
|
|
|
|
class J2QueryRenderer:
|
|
def __init__(self, template_dir, template_file):
|
|
self.template_file = template_file
|
|
|
|
self.jinja_env = Environment(loader = FileSystemLoader(template_dir), trim_blocks = True)
|
|
|
|
def __call__(self, wbrequest, query_response):
|
|
cdxlines = query_response.body
|
|
|
|
def parse_cdx():
|
|
for cdx in cdxlines:
|
|
try:
|
|
cdx = indexreader.CDXCaptureResult(cdx)
|
|
yield cdx
|
|
|
|
except wbexceptions.InvalidCDXException:
|
|
import traceback
|
|
traceback.print_exc()
|
|
pass
|
|
|
|
|
|
template = self.jinja_env.get_template(self.template_file)
|
|
response = template.render(cdxlines = parse_cdx(),
|
|
url = wbrequest.wb_url.url,
|
|
prefix = wbrequest.wb_prefix)
|
|
|
|
return wbrequestresponse.WbResponse.text_response(str(response), content_type = 'text/html')
|
|
|
|
|
|
## ===========
|
|
## Simple handlers for debugging
|
|
class EchoEnv:
|
|
def __call__(self, wbrequest):
|
|
return wbrequestresponse.WbResponse.text_response(str(wbrequest.env))
|
|
|
|
class EchoRequest:
|
|
def __call__(self, wbrequest):
|
|
return wbrequestresponse.WbResponse.text_response(str(wbrequest))
|
|
|
|
|