From 8a431f4668cd309a8cb01da75d4af534d484285d Mon Sep 17 00:00:00 2001 From: Antoni Sawicki Date: Mon, 26 Dec 2016 23:09:34 -0800 Subject: [PATCH] 1.2 dev update queue and ISMAP passes parameters through queue instead of globals, adds preliminary support for ISMAP --- wrp-cocoa.py | 130 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 102 insertions(+), 28 deletions(-) diff --git a/wrp-cocoa.py b/wrp-cocoa.py index 20d2c6c..c343e4c 100644 --- a/wrp-cocoa.py +++ b/wrp-cocoa.py @@ -5,7 +5,7 @@ # with an imagemap of clickable links. This is an adaptation of previous works by # picidae.net and Paul Hammond. -__version__ = "1.1" +__version__ = "1.2" # # This program is based on the software picidae.py from picidae.net @@ -41,6 +41,7 @@ __version__ = "1.1" PORT = 8080 WIDTH = 1024 HEIGHT = 768 +ISMAP = "true" import re import random @@ -49,6 +50,7 @@ import WebKit import AppKit import objc import os +import io import time import string import urllib @@ -63,6 +65,9 @@ REQ = Queue.Queue() # Response queue (dummy response objects) RESP = Queue.Queue() +# Handle map dictionary (in memory file names go here) +Handle = {} + #import pdb; pdb.set_trace() class AppDelegate (Foundation.NSObject): @@ -86,15 +91,19 @@ class WebkitLoad (Foundation.NSObject, WebKit.protocols.WebFrameLoadDelegate): AppKit.NSApplication.sharedApplication().terminate_(None) def getURL(self,webview): - rurl = REQ.get() + req = REQ.get() + WebkitLoad.httpout = req[0] + WebkitLoad.req_url = req[1] + WebkitLoad.req_gif = req[2] + WebkitLoad.req_map = req[3] - if (rurl == "http://wrp.stop/"): + if (WebkitLoad.req_url == "http://wrp.stop/"): print ">>> Terminate Request Received" AppKit.NSApplication.sharedApplication().terminate_(None) - nsurl = Foundation.NSURL.URLWithString_(rurl) + nsurl = Foundation.NSURL.URLWithString_(WebkitLoad.req_url) if not (nsurl and nsurl.scheme()): - nsurl = Foundation.NSURL.alloc().initFileURLWithPath_(url) + nsurl = Foundation.NSURL.alloc().initFileURLWithPath_(WebkitLoad.req_url) nsurl = nsurl.absoluteURL() Foundation.NSURLRequest.setAllowsAnyHTTPSCertificate_forHost_(objc.YES, nsurl.host()) @@ -133,15 +142,29 @@ class WebkitLoad (Foundation.NSObject, WebKit.protocols.WebFrameLoadDelegate): view = frame.frameView().documentView() bitmapdata = self.captureView(view) - bitmapdata.representationUsingType_properties_(AppKit.NSGIFFileType,None).writeToFile_atomically_(GIF,objc.YES) + bitmapdata.representationUsingType_properties_(AppKit.NSGIFFileType,None).writeToFile_atomically_(WebkitLoad.req_gif,objc.YES) - httpout.write("\n\n\n\"webrender\"\n\n" % (__version__, GIF)) + # url of the rendered page + web_url = frame.dataSource().initialRequest().URL().absoluteString() + + httpout = WebkitLoad.httpout + + httpout.write("\n" % (__version__)) + httpout.write("\n" % (WebkitLoad.req_url, web_url)) + httpout.write("WRP%s:%s\n\n" % (__version__,web_url)) + if (ISMAP == "true"): + httpout.write("\"wrp-render\"\n\n" % (WebkitLoad.req_map, WebkitLoad.req_gif)) + mapfile = open(WebkitLoad.req_map, "w+") + mapfile.write("default %s\n" % (web_url)) + else: + httpout.write("\"wrp-render\"\n\n" % (WebkitLoad.req_gif)) domdocument = frame.DOMDocument() domnodelist = domdocument.getElementsByTagName_('A') i = 0 while i < domnodelist.length(): - value = domnodelist.item_(i).valueForKey_('href') + turl = domnodelist.item_(i).valueForKey_('href') + #TODO: crashes? validate url? insert web_url if wrong? myrect = domnodelist.item_(i).boundingBox() xmin = Foundation.NSMinX(myrect) @@ -149,49 +172,100 @@ class WebkitLoad (Foundation.NSObject, WebKit.protocols.WebFrameLoadDelegate): xmax = Foundation.NSMaxX(myrect) ymax = Foundation.NSMaxY(myrect) - httpout.write("\"%s\"\n" % (xmin, ymin, xmax, ymax, value, value)) + if (ISMAP == "true"): + mapfile.write("rect %s %i,%i %i,%i\n" % (turl, xmin, ymin, xmax, ymax)) + else: + httpout.write("\"%s\"\n" % (xmin, ymin, xmax, ymax, turl, turl)) + i += 1 - httpout.write("\n\n\n") + if (ISMAP != "true"): + httpout.write("\n") + + httpout.write("\n\n") + if (ISMAP == "true"): + mapfile.close() + + # Return to Proxy thread and Loop... RESP.put('') self.getURL(webview) class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): def do_GET(self): req_url=self.path - global httpout httpout=self.wfile - self.send_response(200, 'OK') + + 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) - gif_re = re.compile("http://webrender-[0-9]+\.gif") - ico_re = re.compile(".+\.ico") - - if (gif_re.search(req_url)): - img=req_url.split("/") - print ">>> request for rendered gif image... %s" % (img[2]) + # Serve Rendered GIF + if (gif_re): + img=gif_re.group(1) + print ">>> GIF file request... " + img + self.send_response(200, 'OK') self.send_header('Content-type', 'image/gif') self.end_headers() - fimg = open(img[2]) + fimg=open(img) httpout.write(fimg.read()) fimg.close() - os.remove(img[2]) + os.remove(img) - elif (ico_re.search(req_url)): - #print ">>> request for .ico file - skipping" - self.send_error(404, "ICO not supported") + # Process ISMAP Request + elif (map_re): + map=map_re.group(1) + req_x=int(map_re.group(2)) + req_y=int(map_re.group(3)) + print ">>> ISMAP request... %s [%d,%d] " % (map, req_x, req_y) + + 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) + + elif(re.match("(\S+)", line).group(1) == "rect"): + rect=re.match("(\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) ): + goto_url=rect.group(2) + + mapf.close() + + if(goto_url == "none"): + goto_url=default_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("%s\n" % (goto_url, goto_url)) + + # ICO files, WebKit crashes on these + elif (ico_re): + self.send_error(415, "ICO not supported") self.end_headers() + # Process a web page request and generate image else: - print ">>> request for url: " + req_url + print ">>> URL request... " + req_url + self.send_response(200, 'OK') self.send_header('Content-type', 'text/html') self.end_headers() - global GIF - GIF = "webrender-%s.gif" % (random.randrange(0,1000)) + rnd = random.randrange(0,1000) + + "wrp-%s.gif" % (rnd) + "wrp-%s.map" % (rnd) - # To thread - REQ.put(req_url) + # To WebKit Thread + REQ.put((httpout, req_url, "wrp-%s.gif" % (rnd), "wrp-%s.map" % (rnd))) # Wait for completition RESP.get()