def get(self): url=self.request.get('url',"") if url: if "://" not in url: url = "http://"+url filename = urlparse.urlsplit(url).path.split('/')[-1] bits= filename.split('.') key = bits[0] resource = newbase60.sxgtonum(urllib.unquote(key)) logging.info("UrlToHashHandler url: '%s', file: '%s' key:'%s' resource:'%s'" %(url,filename,key,resource)) try: qry = SvgPage.query(SvgPage.svgid == resource) pages = qry.fetch(1) except: pages=None if pages: output = [{'url':pages[0].getLink('direct'),'hash':pages[0].getHash(), 'date':pages[0].published.isoformat()}] self.response.headers['Content-Type'] = 'application/json' self.response.write(json.dumps(output)) else: template = JINJA_ENVIRONMENT.get_template('errorpage.html') svgVals = { 'error':"No url here like '%s'" % url } self.response.set_status(404) self.response.write(template.render(svgVals))
def post(self, filename): status="pending" bits= filename.split('.') key = bits[0] resource = int(newbase60.sxgtonum(urllib.unquote(key))) qry = SvgPage.query(SvgPage.svgid == resource) pages = qry.fetch(1) page=None if len(pages)>0: page = pages[0] if not page: status="no such svg" else: urlbits= list(urlparse.urlsplit(self.request.uri)) urlbits[2] = '/s/'+key urlbits[3] = '' svgurl= urlparse.urlunsplit(urlbits) url = "https://web.archive.org/save/" + svgurl logging.info("ArchiveHandler save url is '%s' " % url) urlfetch.set_default_fetch_deadline(180) result = urlfetch.fetch(url) if result.status_code == 200: status="saved to archive.org" else: status="error from service: %s" %(result.status_code) logging.info("ArchiveHandler "+ key +" status: " + status) self.response.write("ArchiveHandler "+ key +" status: " + status)
def post(self, filename): status="pending" bits= filename.split('.') key = bits[0] resource = int(newbase60.sxgtonum(urllib.unquote(key))) qry = SvgPage.query(SvgPage.svgid == resource) pages = qry.fetch(1) page=None if len(pages)>0: page = pages[0] if not page: status="no such svg" else: hash =page.getHash('both') hash256 = binascii.hexlify(base64.b64decode(hash.split('sha256-')[-1])) json_data = '{"hash":"%s"}' % (hash256) headers = {'Content-Type': 'application/json'} result = urlfetch.fetch( url = 'http://34.253.191.188/api/v1/stamp', payload=json_data, method=urlfetch.POST, headers=headers) if result.status_code == 200: status="stamped by seed media %s returned %s" % (json_data,result.content) else: status="error from service: %s" %(result.status_code) logging.info("SeedStampHandler "+ key +" status: " + status) self.response.write("SeedStampHandler "+ key +" status: " + status)
def get(self): url=self.request.get('url',"") if url: if "://" not in url: url = "http://"+url filename = urlparse.urlsplit(url).path.split('/')[-1] bits= filename.split('.') key = bits[0] resource = int(newbase60.sxgtonum(urllib.unquote(key))) logging.info("ArchiveUrlToHashHandler url: '%s' " %(url)) uthparams = openanything.fetch('http://web.archive.org/cdx/search/cdx?url=%s' %(urllib.quote(url))) logging.info("ArchiveUrlToHashHandler urltohash: '%s' status: '%s' " %(uthparams.get('data','uh oh'),uthparams.get('status','?'))) #format is com,svgur)/i/au.svg 20160829212327 http://svgur.com/i/AU.svg image/svg+xml 200 LY7RXMB7SLQLKEB63LGFNYY7F3SYRCNQ 3079 output=[] for line in uthparams.get('data','').splitlines(): qpath,fetchdate,foundurl,mimetype,result,base32hash,length = line.split(' ') if result == '200': output.append({'url':foundurl,'hash':'sha1-%s' % (Base32toBase64(base32hash)), 'date':datetime.datetime.strptime(fetchdate,'%Y%m%d%H%M%S').isoformat()}) if output: self.response.headers['Content-Type'] = 'application/json' self.response.write(json.dumps(output)) else: template = JINJA_ENVIRONMENT.get_template('errorpage.html') svgVals = { 'error':"No url here like '%s'" % url } self.response.set_status(404) self.response.write(template.render(svgVals))
def get(self, filename): pages= [] if filename: bits= filename.split('.') key = bits[0] resource = int(newbase60.sxgtonum(urllib.unquote(key))) qry = SvgPage.query(SvgPage.svgid == resource) pages = qry.fetch(1) svgStr = newbase60.numtosxg(resource) if pages: etag = pages[0].getHash('both').encode('utf8') self.response.headers["Etag"] = '%s' % etag template = JINJA_ENVIRONMENT.get_template('svgpage.html') svgVals = { 'name':pages[0].name, 'summary':pages[0].summary, 'published':pages[0].published, 'url':'/i/'+ svgStr+'.svg', 'rawurl':'/raw/'+ str(pages[0].svgBlob), } for kind in ('image','iframe','direct','png','hash'): svgVals[kind+"_link"] = pages[0].getLink(kind) svgVals["old_link"] = pages[0].getLink('image',site=oldSiteName) self.response.headers["Link"] = '<https://webmention.herokuapp.com/api/webmention>; rel="webmention"' else: template = JINJA_ENVIRONMENT.get_template('errorpage.html') svgVals = { 'error':"No such image as %s" % filename } self.response.set_status(404) self.response.write(template.render(svgVals))
def get(self, filename): bits= filename.split('.') key = bits[0] resource = int(newbase60.sxgtonum(urllib.unquote(key))) logging.info("UrlToHashHandler file: '%s' key:'%s' resource:'%s'" %(filename,key,resource)) qry = SvgPage.query(SvgPage.svgid == resource) pages = qry.fetch(1) if pages: output = [{'url':pages[0].getLink('direct'),'hash':pages[0].getHash(), 'date':pages[0].published.isoformat()}] self.response.headers['Content-Type'] = 'application/json' self.response.write(json.dumps(output)) else: template = JINJA_ENVIRONMENT.get_template('errorpage.html') svgVals = { 'error':"No such image as %s" % filename } self.response.set_status(404) self.response.write(template.render(svgVals))
def post(self, filename): status="pending" bits= filename.split('.') key = bits[0] extension = '.png' if len(bits)>1: extension = bits[1] #awaiting conditional code for png/jpg resource = int(newbase60.sxgtonum(urllib.unquote(key))) qry = SvgPage.query(SvgPage.svgid == resource) width = str(self.request.get('width', "0")) force = self.request.get('force') pages = qry.fetch(1) page=None if len(pages)>0: page = pages[0] if not page: status="no such svg" elif not force and page.pngFile: status="file exists" else: urlbits= list(urlparse.urlsplit(self.request.uri)) urlbits[2] = '/f/'+key urlbits[3] = '' svgurl= urlparse.urlunsplit(urlbits) url = "https://savageping.herokuapp.com/u?" + urllib.urlencode({"url":svgurl,"width":1024}) urlfetch.set_default_fetch_deadline(180) result = urlfetch.fetch(url) rawpng=None if result.status_code == 200: rawpng= result.content else: status="error from service: %s" %(result.status_code) if (rawpng): logging.info(" png %s" % rawpng[0:256]) bucket_name = os.environ.get('BUCKET_NAME', app_identity.get_default_gcs_bucket_name()) filename = '/' + bucket_name + '/p/%s.png' % newbase60.numtosxg(page.svgid) gcs_file = gcs.open(filename, 'w', content_type='image/png') gcs_file.write(rawpng) gcs_file.close() # Get the file's blob key #page.pngBlob = blobstore.create_gs_key("/gs"+ filename) page.pngFile = blobstore.create_gs_key("/gs"+ filename) status="file created" page.put() logging.info("PngFromSvgHandler "+ key +" status: " + status) self.response.write("svg to png "+ key +" status: " + status)
def post(self, filename, ): bits= filename.split('.') key = bits[0] extension = '.svg' if len(bits)>1: extension = bits[1] #awaiting conditional code for png/jpg resource = newbase60.sxgtonum(urllib.unquote(key)) try: qry = SvgPage.query(SvgPage.svgid == resource) pages = qry.fetch(1) except: pages=None if pages: pages[0].nipsa = True pages[0].put() logging.info("nipsa'd by hand: '%s' " %(filename)) self.redirect('/')
def get(self, filename): bits= filename.split('.') key = bits[0] extension = '.svg' if len(bits)>1: extension = bits[1] #awaiting conditional code for png/jpg resource = int(newbase60.sxgtonum(urllib.unquote(key))) qry = SvgPage.query(SvgPage.svgid == resource) pages = qry.fetch(1) svgStr = newbase60.numtosxg(resource) blob_info = blobstore.BlobInfo.get(pages[0].svgBlob) template = JINJA_ENVIRONMENT.get_template('iframe.html') reader = blobstore.BlobReader(blob_info) rawsvg = reader.read().decode('utf-8') svgVals = { 'name':pages[0].name, 'svg': rawsvg, 'image_link':siteName+'/s/'+svgStr, 'url':'/i/'+ svgStr+'.svg', } self.response.write(template.render(svgVals))
def get(self, filename): bits= filename.split('.') key = bits[0] extension = '.png' if len(bits)>1: extension = bits[1] #awaiting conditional code for png/jpg self.response.headers["Link"] = '<https://webmention.herokuapp.com/api/webmention>; rel="webmention"' resource = int(newbase60.sxgtonum(urllib.unquote(key))) qry = SvgPage.query(SvgPage.svgid == resource) width = str(self.request.get('width', "0")) pages = qry.fetch(1) if pages[0].pngBlob: self.redirect(images.get_serving_url(pages[0].pngBlob)+"=s"+width) elif pages[0].pngFile: try: self.redirect(images.get_serving_url(pages[0].pngFile)+"=s"+width) except: pages[0].pngFile = None pages[0].put() taskqueue.add(url='/makepingfromsvg/%s' % key) self.redirect('/s/'+filename) else: taskqueue.add(url='/makepingfromsvg/%s' % key) self.redirect('/s/'+filename)
def test_roundtrip(self): '''sxgtonum(numtosxg(n))==n for all n''' for integer in range(0, 6000): sxg = newbase60.numtosxg(integer) result = newbase60.sxgtonum(sxg) self.assertEqual(integer, result)
def test_checkcomma(self): self.assertEqual(newbase60.sxgtonum(','), 0)
def test_checkpipe(self): self.assertEqual(newbase60.sxgtonum('|'), 0)
def test_checkO(self): self.assertEqual(newbase60.sxgtonum('O'), 0)
def test_checkI(self): self.assertEqual(newbase60.sxgtonum('I'), 1)
def test_check1337(self): self.assertEqual(newbase60.sxgtonum('NH'), 1337)
def test_check60(self): self.assertEqual(newbase60.sxgtonum('10'), 60)
def get(self, filename, isHead=False): starttime = time.time() bits= filename.split('.') key = urllib.unquote(bits[0]) extension = '.svg' if len(bits)>1: extension = bits[1] #awaiting conditional code for png/jpg self.response.headers["Link"] = '<https://webmention.herokuapp.com/api/webmention>; rel="webmention"' resource = newbase60.sxgtonum(key) try: qry = SvgPage.query(SvgPage.svgid == resource) pages = qry.fetch(1) except: pages=None if pages: page = pages[0] etag = page.getHash('both').encode('utf8') if page.nipsa: etag = etag +" nope" self.response.headers["Etag"] = '%s' % etag logging.info("ServeHandler file: '%s' ETag '%s'" %(filename, self.response.headers["Etag"])) self.response.headers["Cache-Control"]="public, max-age=315360000" self.response.headers["Content-Type"]= 'image/svg+xml' if self.request.headers.get('If-None-Match','') == etag: self.response.status_int = 304 self.response.status_message = "Not Modified" self.response.status = "304 Not Modified" self.response.out.write('') elif not isHead: if page.badfile: self.response.out.write(badSVG) return blob_info = blobstore.BlobInfo.get(page.svgBlob) #self.send_blob(blob_info) try: reader = blobstore.BlobReader(blob_info) rawsvg = reader.read().decode('utf-8') if not page.scriptchecked: fixedsvg,hadScript = svgfix.svgfix(rawsvg) postparse = time.time() logging.info("postparse time: '%s' " %(postparse-starttime)) if (hadScript): page.nipsa = True bucket_name = os.environ.get('BUCKET_NAME', app_identity.get_default_gcs_bucket_name()) filename = '/' + bucket_name + '/s/%sfix.svg' % key gcs_file = gcs.open(filename, 'w', content_type='image/svg+xml') gcs_file.write(fixedsvg.encode('utf-8')) gcs_file.close() # Get the file's blob key #page.pngBlob = blobstore.create_gs_key("/gs"+ filename) page.svgFile = blobstore.create_gs_key("/gs"+ filename) page.put() page.scriptchecked = True postnipsa = time.time() logging.info("script nipsa'd time: '%s' " %(postnipsa-starttime)) logging.info("nipsa'd for script: '%s' " %(filename)) self.response.out.write(fixedsvg) else: page.scriptchecked = True page.put() if page.svgFile: self.redirect(images.get_serving_url(page.svgFile)) else: self.send_blob(blob_info) except: page.nipsa = True page.scriptchecked = True page.badfile = True page.put() postnipsa = time.time() logging.info("bad nipsa'd time: '%s' " %(postnipsa-starttime)) logging.info("nipsa'd for bad file: '%s' " %(filename)) logging.info("bad file: '%s' " %(filename)) self.response.out.write(badSVG) else: logging.info("head?: '%s' " %(filename)) self.response.out.write('') else: template = JINJA_ENVIRONMENT.get_template('errorpage.svg') svgVals = { 'error':"No such image as %s" % filename } self.response.set_status(404) self.response.write(template.render(svgVals))