blob: 591bdcd8b036fdb6fc5a2e73df33682fa6061bf9 [file] [log] [blame]
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from SimpleHTTPServer import SimpleHTTPRequestHandler
import cgi
import json
import os
import posixpath
import shutil
import SimpleHTTPServer
import socket
import SocketServer
import sys
import threading
import urllib
# change into script in order to serve tpview files
script_dir = os.path.dirname(os.path.realpath(__file__))
class ServerData(object):
def __init__(self, log):
self.log = log
self.loaded = False
self.saved = False
self.result = None
class MTEditHTTPRequestHandler(SimpleHTTPRequestHandler):
""" Serves static files and dynamic pages for log file handling.
/edit serving view.html
/load/* serving the log file provided when starting the server
/save/* for POST'ing trimmed log files
The latter two are only to be used with AJAX commands from
/edit
"""
def respond(self, data, type='text/html'):
# send text response to browser
self.send_response(200)
self.send_header('Content-type', type)
self.end_headers()
self.wfile.write(data)
def end_headers(self):
# Override end_headers for additional header to be sent with every response
self.send_header('Cache-Control', 'max-age=0, must-revalidate')
SimpleHTTPRequestHandler.end_headers(self)
def do_GET(self):
data = self.server.user_data
if self.path.startswith('/load/'):
self.respond(data.log, 'text/plain')
data.loaded = True
else:
if self.path.startswith('/edit'):
self.path = 'mtedit.html'
self.path = 'extension/' + self.path
SimpleHTTPRequestHandler.do_GET(self)
def do_POST(self):
data = self.server.user_data
if self.path.startswith('/save/'):
name = os.path.basename(self.path)
length = int(self.headers.getheader('content-length'))
data.result = self.rfile.read(length)
data.saved = True
self.respond('Success')
def translate_path(self, path):
""" Translate url path to local path.
Modified version of translate_path to use script_dir
for looking up files instead of the local working dir.
"""
path = SimpleHTTPRequestHandler.translate_path(self, path)
if path.startswith(os.getcwd()):
path = path.replace(os.getcwd(), script_dir, 1)
return path
def View(port, log=None, persistent=False):
""" Serve MTEdit viewing 'log'.
The server will exit after serving MTEdit
unless persistent is set to True.
"""
data = ServerData(log)
httpd = SocketServer.TCPServer(('', port), MTEditHTTPRequestHandler)
httpd.user_data = data
while True:
httpd.handle_request()
if not persistent and data.loaded:
return
def Edit(port, log=None):
""" Serve MTEdit for editing 'log'.
Blocks until the file has been trimmed
and returns the trimmed log.
"""
data = ServerData(log)
httpd = SocketServer.TCPServer(('', port), MTEditHTTPRequestHandler)
httpd.user_data = data
while True:
httpd.handle_request()
if data.saved:
return data.result
def Serve(port):
""" Serve MTEdit without any log data.
The server will serve until killed
externally (e.g. via keyboard interrupt).
"""
data = ServerData('')
httpd = SocketServer.TCPServer(('', port), MTEditHTTPRequestHandler)
httpd.user_data = data
while True:
httpd.handle_request()