Refactored code to follow common python style.

This commit is contained in:
Natalia Portillo 2017-01-21 16:38:14 +00:00
parent ebb8d0efdf
commit 29c71e6fd9
No known key found for this signature in database
GPG Key ID: 51D20488C724CA9F

125
wrp.py
View File

@ -77,7 +77,7 @@ if sys.platform == "linux" or sys.platform == "linux2":
# claunia: Check how to use this in macOS
logging.basicConfig(filename='/dev/stdout', level=logging.WARN, )
logger = logging.getLogger('wrp');
logger = logging.getLogger('wrp')
# Class for Website-Rendering. Uses QWebPage, which
# requires a running QtGui to work.
@ -86,7 +86,8 @@ if sys.platform == "linux" or sys.platform == "linux2":
"""Sets default values for the properties."""
if not QApplication.instance():
raise RuntimeError(self.__class__.__name__ + " requires a running QApplication instance")
raise RuntimeError(self.__class__.__name__ + \
" requires a running QApplication instance")
QObject.__init__(self)
# Initialize default properties
@ -155,13 +156,18 @@ if sys.platform == "linux" or sys.platform == "linux2":
# Connect required event listeners
self.connect(self._page, SIGNAL("loadFinished(bool)"), self._on_load_finished)
self.connect(self._page, SIGNAL("loadStarted()"), self._on_load_started)
self.connect(self._page.networkAccessManager(), SIGNAL("sslErrors(QNetworkReply *,const QList<QSslError>&)"), self._on_ssl_errors)
self.connect(self._page.networkAccessManager(), SIGNAL("finished(QNetworkReply *)"), self._on_each_reply)
self.connect(self._page.networkAccessManager(),
SIGNAL("sslErrors(QNetworkReply *,const QList<QSslError>&)"),
self._on_ssl_errors)
self.connect(self._page.networkAccessManager(),
SIGNAL("finished(QNetworkReply *)"),
self._on_each_reply)
# The way we will use this, it seems to be unesseccary to have Scrollbars enabled
self._page.mainFrame().setScrollBarPolicy(Qt.Horizontal, Qt.ScrollBarAlwaysOff)
self._page.mainFrame().setScrollBarPolicy(Qt.Vertical, Qt.ScrollBarAlwaysOff)
self._page.settings().setUserStyleSheetUrl(QUrl("data:text/css,html,body{overflow-y:hidden !important;}"))
self._page.settings().setUserStyleSheetUrl(
QUrl("data:text/css,html,body{overflow-y:hidden !important;}"))
# Show this widget
# self._window.show()
@ -202,12 +208,16 @@ if sys.platform == "linux" or sys.platform == "linux2":
httpout = WebkitRenderer.httpout
# Write URL map
httpout.write("<!-- Web Rendering Proxy v%s by Antoni Sawicki -->\n<html>\n<body>\n<img src=\"http://%s\" alt=\"webrender\" usemap=\"#map\">\n<map name=\"map\">\n" % (__version__, WebkitRenderer.req_jpg))
httpout.write("<!-- Web Rendering Proxy v%s by Antoni Sawicki -->\n"
"<html>\n<body>\n"
"<img src=\"http://%s\" alt=\"webrender\" usemap=\"#map\">\n"
"<map name=\"map\">\n" % (__version__, WebkitRenderer.req_jpg))
frame = self._view.page().currentFrame()
for x in frame.findAllElements('a'):
value = x.attribute('href')
xmin, ymin, xmax, ymax = x.geometry().getCoords()
httpout.write("<area shape=\"rect\" coords=\"%i,%i,%i,%i\" alt=\"%s\" href=\"%s\">\n" % (xmin, ymin, xmax, ymax, value, value))
httpout.write("<area shape=\"rect\" coords=\"%i,%i,%i,%i\" alt=\"%s\" href=\"%s\">"
"\n" % (xmin, ymin, xmax, ymax, value, value))
httpout.write("</map>\n</body>\n</html>\n")
return image
@ -284,9 +294,9 @@ if sys.platform == "linux" or sys.platform == "linux2":
return False
def javaScriptPrompt(self, frame, message, default, result):
"""This function is called whenever a JavaScript program running inside frame tries to prompt
the user for input. The program may provide an optional message, msg, as well as a default value
for the input in defaultValue.
"""This function is called whenever a JavaScript program running inside frame tries to
prompt the user for input. The program may provide an optional message, msg, as well
as a default value for the input in defaultValue.
If the prompt was cancelled by the user the implementation should return false;
otherwise the result should be written to result and true should be returned.
@ -297,8 +307,9 @@ if sys.platform == "linux" or sys.platform == "linux2":
return False
def shouldInterruptJavaScript(self):
"""This function is called when a JavaScript program is running for a long period of time.
If the user wanted to stop the JavaScript the implementation should return true; otherwise false.
"""This function is called when a JavaScript program is running for a long period of
time. If the user wanted to stop the JavaScript the implementation should return
true; otherwise false.
"""
if self.logger: self.logger.debug("WebKit ask to interrupt JavaScript")
return True
@ -366,7 +377,8 @@ if sys.platform == "linux" or sys.platform == "linux2":
output.close()
del renderer
print ">>> done: %s [%d kb]..." % (WebkitRenderer.req_jpg, os.path.getsize(WebkitRenderer.req_jpg)/1024)
print ">>> done: %s [%d kb]..." % (WebkitRenderer.req_jpg,
os.path.getsize(WebkitRenderer.req_jpg)/1024)
RESP.put('')
@ -413,7 +425,7 @@ elif sys.platform == "darwin":
WebkitLoad.req_gif = req[2]
WebkitLoad.req_map = req[3]
if (WebkitLoad.req_url == "http://wrp.stop/"):
if WebkitLoad.req_url == "http://wrp.stop/":
print ">>> Terminate Request Received"
AppKit.NSApplication.sharedApplication().terminate_(None)
@ -454,26 +466,34 @@ elif sys.platform == "darwin":
# what happens when the page has finished loading
def webView_didFinishLoadForFrame_(self, webview, frame):
# don't care about subframes
if (frame == webview.mainFrame()):
if frame == webview.mainFrame():
view = frame.frameView().documentView()
bitmapdata = self.captureView(view)
bitmapdata.representationUsingType_properties_(AppKit.NSGIFFileType,None).writeToFile_atomically_(WebkitLoad.req_gif,objc.YES)
bitmapdata.representationUsingType_properties_(
AppKit.NSGIFFileType, None).writeToFile_atomically_(
WebkitLoad.req_gif, objc.YES)
# url of the rendered page
web_url = frame.dataSource().initialRequest().URL().absoluteString()
httpout = WebkitLoad.httpout
httpout.write("<!-- Web Rendering Proxy v%s by Antoni Sawicki -->\n" % (__version__))
httpout.write("<!-- Request for [%s] frame [%s] -->\n" % (WebkitLoad.req_url, web_url))
httpout.write("<HTML><HEAD><TITLE>WRP%s:%s</TITLE></HEAD>\n<BODY>\n" % (__version__,web_url))
if (ISMAP == "true"):
httpout.write("<A HREF=\"http://%s\"><IMG SRC=\"http://%s\" ALT=\"wrp-render\" ISMAP>\n</A>\n" % (WebkitLoad.req_map, WebkitLoad.req_gif))
httpout.write("<!-- Web Rendering Proxy v%s by Antoni Sawicki -->\n"
% (__version__))
httpout.write("<!-- Request for [%s] frame [%s] -->\n"
% (WebkitLoad.req_url, web_url))
httpout.write("<HTML><HEAD><TITLE>WRP%s:%s</TITLE></HEAD>\n<BODY>\n"
% (__version__, web_url))
if ISMAP == "true":
httpout.write("<A HREF=\"http://%s\">"
"<IMG SRC=\"http://%s\" ALT=\"wrp-render\" ISMAP>\n"
"</A>\n" % (WebkitLoad.req_map, WebkitLoad.req_gif))
mapfile = open(WebkitLoad.req_map, "w+")
mapfile.write("default %s\n" % (web_url))
else:
httpout.write("<IMG SRC=\"http://%s\" ALT=\"wrp-render\" USEMAP=\"#map\">\n<MAP NAME=\"map\">\n" % (WebkitLoad.req_gif))
httpout.write("<IMG SRC=\"http://%s\" ALT=\"wrp-render\" USEMAP=\"#map\">\n"
"<MAP NAME=\"map\">\n" % (WebkitLoad.req_gif))
domdocument = frame.DOMDocument()
domnodelist = domdocument.getElementsByTagName_('A')
@ -488,19 +508,22 @@ elif sys.platform == "darwin":
xmax = Foundation.NSMaxX(myrect)
ymax = Foundation.NSMaxY(myrect)
if (ISMAP == "true"):
if ISMAP == "true":
mapfile.write("rect %s %i,%i %i,%i\n" % (turl, xmin, ymin, xmax, ymax))
else:
httpout.write("<AREA SHAPE=\"RECT\" COORDS=\"%i,%i,%i,%i\" ALT=\"%s\" HREF=\"%s\">\n" % (xmin, ymin, xmax, ymax, turl, turl))
httpout.write("<AREA SHAPE=\"RECT\""
" COORDS=\"%i,%i,%i,%i\""
" ALT=\"%s\" HREF=\"%s\">\n"
% (xmin, ymin, xmax, ymax, turl, turl))
i += 1
if (ISMAP != "true"):
if ISMAP != "true":
httpout.write("</MAP>\n")
httpout.write("</BODY>\n</HTML>\n")
if (ISMAP == "true"):
if ISMAP == "true":
mapfile.close()
# Return to Proxy thread and Loop...
@ -509,19 +532,22 @@ elif sys.platform == "darwin":
def main_cocoa():
# Launch NS Application
AppKit.NSApplicationLoad();
AppKit.NSApplicationLoad()
app = AppKit.NSApplication.sharedApplication()
delegate = AppDelegate.alloc().init()
AppKit.NSApp().setDelegate_(delegate)
AppKit.NSBundle.mainBundle().infoDictionary()['NSAppTransportSecurity'] = dict(NSAllowsArbitraryLoads = True)
AppKit.NSBundle.mainBundle().infoDictionary()['NSAppTransportSecurity'] = \
dict(NSAllowsArbitraryLoads=True)
rect = Foundation.NSMakeRect(-16000, -16000, 100, 100)
win = AppKit.NSWindow.alloc()
win.initWithContentRect_styleMask_backing_defer_(rect, AppKit.NSBorderlessWindowMask, 2, 0)
webview = WebKit.WebView.alloc()
webview.initWithFrame_(rect)
webview.mainFrame().frameView().setAllowsScrolling_(objc.NO)
webkit_version = Foundation.NSBundle.bundleForClass_(WebKit.WebView).objectForInfoDictionaryKey_(WebKit.kCFBundleVersionKey)[1:]
webview.setApplicationNameForUserAgent_("Like-Version/6.0 Safari/%s wrp/%s" % (webkit_version, __version__))
webkit_version = Foundation.NSBundle.bundleForClass_(WebKit.WebView). \
objectForInfoDictionaryKey_(WebKit.kCFBundleVersionKey)[1:]
webview.setApplicationNameForUserAgent_("Like-Version/6.0 Safari/%s wrp/%s"
% (webkit_version, __version__))
win.setContentView_(webview)
loaddelegate = WebkitLoad.alloc().init()
loaddelegate.options = [""]
@ -536,13 +562,13 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
req_url = self.path
httpout = self.wfile
gif_re = re.match("http://(wrp-\d+\.gif).*", req_url)
map_re = re.match("http://(wrp-\d+\.map).*?(\d+),(\d+)", req_url)
ico_re = re.match("http://.+\.ico", req_url)
jpg_re = re.match("http://(wrp-\d+\.jpg).*", req_url)
gif_re = re.match(r"http://(wrp-\d+\.gif).*", req_url)
map_re = re.match(r"http://(wrp-\d+\.map).*?(\d+),(\d+)", req_url)
ico_re = re.match(r"http://.+\.ico", req_url)
jpg_re = re.match(r"http://(wrp-\d+\.jpg).*", req_url)
# Serve Rendered GIF
if (gif_re):
if gif_re:
img = gif_re.group(1)
print ">>> GIF file request... " + img
self.send_response(200, 'OK')
@ -553,9 +579,10 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
fimg.close()
os.remove(img)
elif (jpg_re):
elif jpg_re:
img = jpg_re.group(1)
print ">>> request for rendered jpg image... %s [%d kb]" % (img, os.path.getsize(img)/1024)
print ">>> request for rendered jpg image... %s [%d kb]" \
% (img, os.path.getsize(img)/1024)
self.send_response(200, 'OK')
self.send_header('Content-type', 'image/jpeg')
self.end_headers()
@ -565,7 +592,7 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
os.remove(img)
# Process ISMAP Request
elif (map_re):
elif map_re:
map = map_re.group(1)
req_x = int(map_re.group(2))
req_y = int(map_re.group(3))
@ -574,33 +601,37 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
with open(map) as mapf:
goto_url = "none"
for line in mapf.readlines():
if(re.match("(\S+)", line).group(1) == "default"):
default_url=re.match("\S+\s+(\S+)", line).group(1)
if re.match(r"(\S+)", line).group(1) == "default":
default_url = re.match(r"\S+\s+(\S+)", line).group(1)
elif(re.match("(\S+)", line).group(1) == "rect"):
rect=re.match("(\S+)\s+(\S+)\s+(\d+),(\d+)\s+(\d+),(\d+)", line)
elif re.match(r"(\S+)", line).group(1) == "rect":
rect = re.match(r"(\S+)\s+(\S+)\s+(\d+),(\d+)\s+(\d+),(\d+)", line)
min_x = int(rect.group(3))
min_y = int(rect.group(4))
max_x = int(rect.group(5))
max_y = int(rect.group(6))
if( (req_x >= min_x) and (req_x <= max_x) and (req_y >= min_y) and (req_y <= max_y) ):
if (req_x >= min_x) and \
(req_x <= max_x) and \
(req_y >= min_y) and \
(req_y <= max_y):
goto_url = rect.group(2)
mapf.close()
if(goto_url == "none"):
if goto_url == "none":
goto_url = default_url
print(">>> ISMAP redirect: %s\n" % (goto_url))
print ">>> ISMAP redirect: %s\n" % (goto_url)
self.send_response(302, "Found")
self.send_header("Location", goto_url)
self.send_header("Content-type", "text/html")
self.end_headers()
httpout.write("<HTML><BODY><A HREF=\"%s\">%s</A></BODY></HTML>\n" % (goto_url, goto_url))
httpout.write("<HTML><BODY><A HREF=\"%s\">%s</A></BODY></HTML>\n"
% (goto_url, goto_url))
# ICO files, WebKit crashes on these
elif (ico_re):
elif ico_re:
self.send_error(415, "ICO not supported")
self.end_headers()