mirror of
https://github.com/tenox7/wrp.git
synced 2024-12-22 21:29:29 +00:00
1.2 dev update queue and ISMAP
passes parameters through queue instead of globals, adds preliminary support for ISMAP
This commit is contained in:
parent
f91e9ce356
commit
b463aad8ca
130
wrp-cocoa.py
130
wrp-cocoa.py
@ -5,7 +5,7 @@
|
|||||||
# with an imagemap of clickable links. This is an adaptation of previous works by
|
# with an imagemap of clickable links. This is an adaptation of previous works by
|
||||||
# picidae.net and Paul Hammond.
|
# picidae.net and Paul Hammond.
|
||||||
|
|
||||||
__version__ = "1.1"
|
__version__ = "1.2"
|
||||||
|
|
||||||
#
|
#
|
||||||
# This program is based on the software picidae.py from picidae.net
|
# This program is based on the software picidae.py from picidae.net
|
||||||
@ -41,6 +41,7 @@ __version__ = "1.1"
|
|||||||
PORT = 8080
|
PORT = 8080
|
||||||
WIDTH = 1024
|
WIDTH = 1024
|
||||||
HEIGHT = 768
|
HEIGHT = 768
|
||||||
|
ISMAP = "true"
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import random
|
import random
|
||||||
@ -49,6 +50,7 @@ import WebKit
|
|||||||
import AppKit
|
import AppKit
|
||||||
import objc
|
import objc
|
||||||
import os
|
import os
|
||||||
|
import io
|
||||||
import time
|
import time
|
||||||
import string
|
import string
|
||||||
import urllib
|
import urllib
|
||||||
@ -63,6 +65,9 @@ REQ = Queue.Queue()
|
|||||||
# Response queue (dummy response objects)
|
# Response queue (dummy response objects)
|
||||||
RESP = Queue.Queue()
|
RESP = Queue.Queue()
|
||||||
|
|
||||||
|
# Handle map dictionary (in memory file names go here)
|
||||||
|
Handle = {}
|
||||||
|
|
||||||
#import pdb; pdb.set_trace()
|
#import pdb; pdb.set_trace()
|
||||||
|
|
||||||
class AppDelegate (Foundation.NSObject):
|
class AppDelegate (Foundation.NSObject):
|
||||||
@ -86,15 +91,19 @@ class WebkitLoad (Foundation.NSObject, WebKit.protocols.WebFrameLoadDelegate):
|
|||||||
AppKit.NSApplication.sharedApplication().terminate_(None)
|
AppKit.NSApplication.sharedApplication().terminate_(None)
|
||||||
|
|
||||||
def getURL(self,webview):
|
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"
|
print ">>> Terminate Request Received"
|
||||||
AppKit.NSApplication.sharedApplication().terminate_(None)
|
AppKit.NSApplication.sharedApplication().terminate_(None)
|
||||||
|
|
||||||
nsurl = Foundation.NSURL.URLWithString_(rurl)
|
nsurl = Foundation.NSURL.URLWithString_(WebkitLoad.req_url)
|
||||||
if not (nsurl and nsurl.scheme()):
|
if not (nsurl and nsurl.scheme()):
|
||||||
nsurl = Foundation.NSURL.alloc().initFileURLWithPath_(url)
|
nsurl = Foundation.NSURL.alloc().initFileURLWithPath_(WebkitLoad.req_url)
|
||||||
nsurl = nsurl.absoluteURL()
|
nsurl = nsurl.absoluteURL()
|
||||||
|
|
||||||
Foundation.NSURLRequest.setAllowsAnyHTTPSCertificate_forHost_(objc.YES, nsurl.host())
|
Foundation.NSURLRequest.setAllowsAnyHTTPSCertificate_forHost_(objc.YES, nsurl.host())
|
||||||
@ -133,15 +142,29 @@ class WebkitLoad (Foundation.NSObject, WebKit.protocols.WebFrameLoadDelegate):
|
|||||||
view = frame.frameView().documentView()
|
view = frame.frameView().documentView()
|
||||||
|
|
||||||
bitmapdata = self.captureView(view)
|
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("<!-- 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__, GIF))
|
# 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))
|
||||||
|
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))
|
||||||
|
|
||||||
domdocument = frame.DOMDocument()
|
domdocument = frame.DOMDocument()
|
||||||
domnodelist = domdocument.getElementsByTagName_('A')
|
domnodelist = domdocument.getElementsByTagName_('A')
|
||||||
i = 0
|
i = 0
|
||||||
while i < domnodelist.length():
|
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()
|
myrect = domnodelist.item_(i).boundingBox()
|
||||||
|
|
||||||
xmin = Foundation.NSMinX(myrect)
|
xmin = Foundation.NSMinX(myrect)
|
||||||
@ -149,49 +172,100 @@ class WebkitLoad (Foundation.NSObject, WebKit.protocols.WebFrameLoadDelegate):
|
|||||||
xmax = Foundation.NSMaxX(myrect)
|
xmax = Foundation.NSMaxX(myrect)
|
||||||
ymax = Foundation.NSMaxY(myrect)
|
ymax = Foundation.NSMaxY(myrect)
|
||||||
|
|
||||||
httpout.write("<area shape=\"rect\" coords=\"%i,%i,%i,%i\" alt=\"%s\" href=\"%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("<AREA SHAPE=\"RECT\" COORDS=\"%i,%i,%i,%i\" ALT=\"%s\" HREF=\"%s\">\n" % (xmin, ymin, xmax, ymax, turl, turl))
|
||||||
|
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
httpout.write("</map>\n</body>\n</html>\n")
|
if (ISMAP != "true"):
|
||||||
|
httpout.write("</MAP>\n")
|
||||||
|
|
||||||
|
httpout.write("</BODY>\n</HTML>\n")
|
||||||
|
|
||||||
|
if (ISMAP == "true"):
|
||||||
|
mapfile.close()
|
||||||
|
|
||||||
|
# Return to Proxy thread and Loop...
|
||||||
RESP.put('')
|
RESP.put('')
|
||||||
self.getURL(webview)
|
self.getURL(webview)
|
||||||
|
|
||||||
class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
||||||
def do_GET(self):
|
def do_GET(self):
|
||||||
req_url=self.path
|
req_url=self.path
|
||||||
global httpout
|
|
||||||
httpout=self.wfile
|
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")
|
# Serve Rendered GIF
|
||||||
ico_re = re.compile(".+\.ico")
|
if (gif_re):
|
||||||
|
img=gif_re.group(1)
|
||||||
if (gif_re.search(req_url)):
|
print ">>> GIF file request... " + img
|
||||||
img=req_url.split("/")
|
self.send_response(200, 'OK')
|
||||||
print ">>> request for rendered gif image... %s" % (img[2])
|
|
||||||
self.send_header('Content-type', 'image/gif')
|
self.send_header('Content-type', 'image/gif')
|
||||||
self.end_headers()
|
self.end_headers()
|
||||||
fimg = open(img[2])
|
fimg=open(img)
|
||||||
httpout.write(fimg.read())
|
httpout.write(fimg.read())
|
||||||
fimg.close()
|
fimg.close()
|
||||||
os.remove(img[2])
|
os.remove(img)
|
||||||
|
|
||||||
elif (ico_re.search(req_url)):
|
# Process ISMAP Request
|
||||||
#print ">>> request for .ico file - skipping"
|
elif (map_re):
|
||||||
self.send_error(404, "ICO not supported")
|
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("<HTML><BODY><A HREF=\"%s\">%s</A></BODY></HTML>\n" % (goto_url, goto_url))
|
||||||
|
|
||||||
|
# ICO files, WebKit crashes on these
|
||||||
|
elif (ico_re):
|
||||||
|
self.send_error(415, "ICO not supported")
|
||||||
self.end_headers()
|
self.end_headers()
|
||||||
|
|
||||||
|
# Process a web page request and generate image
|
||||||
else:
|
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.send_header('Content-type', 'text/html')
|
||||||
self.end_headers()
|
self.end_headers()
|
||||||
|
|
||||||
global GIF
|
rnd = random.randrange(0,1000)
|
||||||
GIF = "webrender-%s.gif" % (random.randrange(0,1000))
|
|
||||||
|
"wrp-%s.gif" % (rnd)
|
||||||
|
"wrp-%s.map" % (rnd)
|
||||||
|
|
||||||
# To thread
|
# To WebKit Thread
|
||||||
REQ.put(req_url)
|
REQ.put((httpout, req_url, "wrp-%s.gif" % (rnd), "wrp-%s.map" % (rnd)))
|
||||||
# Wait for completition
|
# Wait for completition
|
||||||
RESP.get()
|
RESP.get()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user