| Index: tools/telemetry/third_party/webpagereplay/customhandlers.py
|
| diff --git a/tools/telemetry/third_party/webpagereplay/customhandlers.py b/tools/telemetry/third_party/webpagereplay/customhandlers.py
|
| deleted file mode 100644
|
| index 14166af0738cb99db9532c1fe64b806ad8377357..0000000000000000000000000000000000000000
|
| --- a/tools/telemetry/third_party/webpagereplay/customhandlers.py
|
| +++ /dev/null
|
| @@ -1,198 +0,0 @@
|
| -#!/usr/bin/env python
|
| -# Copyright 2010 Google Inc. All Rights Reserved.
|
| -#
|
| -# Licensed under the Apache License, Version 2.0 (the "License");
|
| -# you may not use this file except in compliance with the License.
|
| -# You may obtain a copy of the License at
|
| -#
|
| -# http://www.apache.org/licenses/LICENSE-2.0
|
| -#
|
| -# Unless required by applicable law or agreed to in writing, software
|
| -# distributed under the License is distributed on an "AS IS" BASIS,
|
| -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -# See the License for the specific language governing permissions and
|
| -# limitations under the License.
|
| -
|
| -"""Handle special HTTP requests.
|
| -
|
| -/web-page-replay-generate-[RESPONSE_CODE]
|
| - - Return the given RESPONSE_CODE.
|
| -/web-page-replay-post-image-[FILENAME]
|
| - - Save the posted image to local disk.
|
| -/web-page-replay-command-[record|replay|status]
|
| - - Optional. Enable by calling custom_handlers.add_server_manager_handler(...).
|
| - - Change the server mode to either record or replay.
|
| - + When switching to record, the http_archive is cleared.
|
| - + When switching to replay, the http_archive is maintained.
|
| -"""
|
| -
|
| -import base64
|
| -import httparchive
|
| -import json
|
| -import logging
|
| -import os
|
| -
|
| -COMMON_URL_PREFIX = '/web-page-replay-'
|
| -COMMAND_URL_PREFIX = COMMON_URL_PREFIX + 'command-'
|
| -GENERATOR_URL_PREFIX = COMMON_URL_PREFIX + 'generate-'
|
| -POST_IMAGE_URL_PREFIX = COMMON_URL_PREFIX + 'post-image-'
|
| -IMAGE_DATA_PREFIX = 'data:image/png;base64,'
|
| -
|
| -
|
| -def SimpleResponse(status):
|
| - """Return a ArchivedHttpResponse with |status| code and a simple text body."""
|
| - return httparchive.create_response(status)
|
| -
|
| -
|
| -def JsonResponse(data):
|
| - """Return a ArchivedHttpResponse with |data| encoded as json in the body."""
|
| - status = 200
|
| - reason = 'OK'
|
| - headers = [('content-type', 'application/json')]
|
| - body = json.dumps(data)
|
| - return httparchive.create_response(status, reason, headers, body)
|
| -
|
| -
|
| -class CustomHandlers(object):
|
| -
|
| - def __init__(self, options, http_archive):
|
| - """Initialize CustomHandlers.
|
| -
|
| - Args:
|
| - options: original options passed to the server.
|
| - http_archive: reference to the HttpArchive object.
|
| - """
|
| - self.server_manager = None
|
| - self.options = options
|
| - self.http_archive = http_archive
|
| - self.handlers = [
|
| - (GENERATOR_URL_PREFIX, self.get_generator_url_response_code)]
|
| - # screenshot_dir is a path to which screenshots are saved.
|
| - if options.screenshot_dir:
|
| - if not os.path.exists(options.screenshot_dir):
|
| - try:
|
| - os.makedirs(options.screenshot_dir)
|
| - except IOError:
|
| - logging.error('Unable to create screenshot dir: %s',
|
| - options.screenshot_dir)
|
| - options.screenshot_dir = None
|
| - if options.screenshot_dir:
|
| - self.screenshot_dir = options.screenshot_dir
|
| - self.handlers.append(
|
| - (POST_IMAGE_URL_PREFIX, self.handle_possible_post_image))
|
| -
|
| - def handle(self, request):
|
| - """Dispatches requests to matching handlers.
|
| -
|
| - Args:
|
| - request: an http request
|
| - Returns:
|
| - ArchivedHttpResponse or None.
|
| - """
|
| - for prefix, handler in self.handlers:
|
| - if request.full_path.startswith(prefix):
|
| - return handler(request, request.full_path[len(prefix):])
|
| - return None
|
| -
|
| - def get_generator_url_response_code(self, request, url_suffix):
|
| - """Parse special generator URLs for the embedded response code.
|
| -
|
| - Args:
|
| - request: an ArchivedHttpRequest instance
|
| - url_suffix: string that is after the handler prefix (e.g. 304)
|
| - Returns:
|
| - On a match, an ArchivedHttpResponse.
|
| - Otherwise, None.
|
| - """
|
| - del request
|
| - try:
|
| - response_code = int(url_suffix)
|
| - return SimpleResponse(response_code)
|
| - except ValueError:
|
| - return None
|
| -
|
| - def handle_possible_post_image(self, request, url_suffix):
|
| - """If sent, saves embedded image to local directory.
|
| -
|
| - Expects a special url containing the filename. If sent, saves the base64
|
| - encoded request body as a PNG image locally. This feature is enabled by
|
| - passing in screenshot_dir to the initializer for this class.
|
| -
|
| - Args:
|
| - request: an ArchivedHttpRequest instance
|
| - url_suffix: string that is after the handler prefix (e.g. 'foo.png')
|
| - Returns:
|
| - On a match, an ArchivedHttpResponse.
|
| - Otherwise, None.
|
| - """
|
| - basename = url_suffix
|
| - if not basename:
|
| - return None
|
| -
|
| - data = request.request_body
|
| - if not data.startswith(IMAGE_DATA_PREFIX):
|
| - logging.error('Unexpected image format for: %s', basename)
|
| - return SimpleResponse(400)
|
| -
|
| - data = data[len(IMAGE_DATA_PREFIX):]
|
| - png = base64.b64decode(data)
|
| - filename = os.path.join(self.screenshot_dir,
|
| - '%s-%s.png' % (request.host, basename))
|
| - if not os.access(self.screenshot_dir, os.W_OK):
|
| - logging.error('Unable to write to: %s', filename)
|
| - return SimpleResponse(400)
|
| -
|
| - with file(filename, 'w') as f:
|
| - f.write(png)
|
| - return SimpleResponse(200)
|
| -
|
| - def add_server_manager_handler(self, server_manager):
|
| - """Add the ability to change the server mode (e.g. to record mode).
|
| - Args:
|
| - server_manager: a servermanager.ServerManager instance.
|
| - """
|
| - self.server_manager = server_manager
|
| - self.handlers.append(
|
| - (COMMAND_URL_PREFIX, self.handle_server_manager_command))
|
| -
|
| - def handle_server_manager_command(self, request, url_suffix):
|
| - """Parse special URLs for the embedded server manager command.
|
| -
|
| - Clients like webpagetest.org can use URLs of this form to change
|
| - the replay server from record mode to replay mode.
|
| -
|
| - This handler is not in the default list of handlers. Call
|
| - add_server_manager_handler to add it.
|
| -
|
| - In the future, this could be expanded to save or serve archive files.
|
| -
|
| - Args:
|
| - request: an ArchivedHttpRequest instance
|
| - url_suffix: string that is after the handler prefix (e.g. 'record')
|
| - Returns:
|
| - On a match, an ArchivedHttpResponse.
|
| - Otherwise, None.
|
| - """
|
| - command = url_suffix
|
| - if command == 'record':
|
| - self.server_manager.SetRecordMode()
|
| - return SimpleResponse(200)
|
| - elif command == 'replay':
|
| - self.server_manager.SetReplayMode()
|
| - return SimpleResponse(200)
|
| - elif command == 'status':
|
| - status = {}
|
| - is_record_mode = self.server_manager.IsRecordMode()
|
| - status['is_record_mode'] = is_record_mode
|
| - status['options'] = json.loads(str(self.options))
|
| - archive_stats = self.http_archive.stats()
|
| - if archive_stats:
|
| - status['archive_stats'] = json.loads(archive_stats)
|
| - return JsonResponse(status)
|
| - elif command == 'exit':
|
| - self.server_manager.should_exit = True
|
| - return SimpleResponse(200)
|
| - elif command == 'log':
|
| - logging.info('log command: %s', str(request.request_body)[:1000000])
|
| - return SimpleResponse(200)
|
| - return None
|
|
|