コード例 #1
0
ファイル: feedback.py プロジェクト: jayaddison/triggr
    def send(self):

        feedback = request.params['feedback']

        response.write("Your feedback has been sent to the triggr team - thanks for getting in touch!")

	# Send a new account notification
	addrFrom = '*****@*****.**'
	addrTo = '*****@*****.**'
	subject = 'Triggr: Customer Feedback'

	body = """\
From: %s
To: %s
Subject: %s

%s
""" % (addrFrom, addrTo, subject, feedback)

	server = smtplib.SMTP('smtp.gmail.com', 587)
	server.ehlo()
	server.starttls()
	server.login('*****@*****.**', 'T3llM3Wh3n')
	server.sendmail(addrFrom, addrTo, body)
	server.quit()
コード例 #2
0
 def GetInfo(self):
     from pprint import pformat
     request.headers['Content-Type'] = 'text/ascii'
     response.write('Some info about this service\n')
     for layer in model.ukcip02.layers:
         response.write('Layer %s: %s\n' %
                        (layer, pformat(g.ukcip02_layers[layer].__dict__)))
コード例 #3
0
    def _writeImageResponse(self, pilImage, format):

        buf = StringIO()
        pilImage.save(buf, self._pilImageFormats[format])

        response.headers['Content-Type'] = format

        if config.get('cows.browser_caching_enabled', '').lower() == 'true':
            response.headers["cache-control"] = "public, max-age=3600"
            response.headers["pragma"] = ""

        response.write(buf.getvalue())
コード例 #4
0
ファイル: rdfdocs.py プロジェクト: AKSW/LODStats_WWW
 def void(self):
     """send VoID of every dataset in a ZIP file"""
     rdfdocs = Session.query(model.RDFDoc).filter(model.RDFDoc.active==True).join(model.RDFDoc.current_stats).filter(and_(model.StatResult.triples > 0, model.RDFDoc.format != 'sparql'))
     zip_temp_file = tempfile.NamedTemporaryFile(prefix='lodstatswww_voidzip')
     zip_temp = zipfile.ZipFile(zip_temp_file, 'w', zipfile.ZIP_DEFLATED)
     for r in rdfdocs:
         zip_temp.writestr("%s.ttl" % r.name, r.current_stats.void)
     zip_temp.close()
     zip_temp_file.seek(0)
     response.content_type = 'application/zip'
     response.headers['Content-Disposition'] = "filename=LODStats_all_void.zip"
     # FIXME: use paste.fileapp if this ever gets too large
     for data in zip_temp_file:
         response.write(data)
コード例 #5
0
ファイル: api.py プロジェクト: avl/SwFlightPlanner
 def getnewadchart(self):
     def writeInt(x):
         response.write(struct.pack(">I",x))
     def writeLong(x):
         response.write(struct.pack(">Q",x))
     def writeUTF(s):
         if s==None: s=u""
         try:
             encoded=s.encode('utf8')
         except Exception,cause:
             print "While trying to encode: %s"%(s,)
             raise
         l=len(encoded)
         response.write(struct.pack(">H",l)) #short
         response.write(encoded)
コード例 #6
0
    def getnewadchart(self):
        def writeInt(x):
            response.write(struct.pack(">I", x))

        def writeLong(x):
            response.write(struct.pack(">Q", x))

        def writeUTF(s):
            if s == None: s = u""
            try:
                encoded = s.encode('utf8')
            except Exception, cause:
                print "While trying to encode: %s" % (s, )
                raise
            l = len(encoded)
            response.write(struct.pack(">H", l))  #short
            response.write(encoded)
コード例 #7
0
ファイル: api.py プロジェクト: avl/SwFlightPlanner
 def getadchart(self):
     def writeInt(x):
         response.write(struct.pack(">I",x))
     def writeFloat(f):
         response.write(struct.pack(">f",f))
     def writeDouble(f):
         response.write(struct.pack(">d",f))
     def writeUTF(s):
         if s==None: s=u""
         try:
             encoded=s.encode('utf8')
         except Exception,cause:
             print "While trying to encode: %s"%(s,)
             raise
         l=len(encoded)
         #print "Writing %s, length %d"%(repr(encoded),l)
         response.write(struct.pack(">H",l)) #short
         response.write(encoded)
コード例 #8
0
ファイル: wxs_fetchcontroller.py プロジェクト: cedadev/cows
    def fetchFile(self, file):
        logging.info("Fetching file, '%s'" % file)

        #given the filename, these are the paths to the file, and to the accompanying text file
        filePath = config['cows.csml.publish_dir'] + '/' + file

        #just return the file, no security check implemented for now.
        fileToReturn = open(filePath, 'r')
        mType = self._getMimeType(file)
        response.headers['Content-Type'] = mType
        return response.write(fileToReturn.read())
コード例 #9
0
    def getadchart(self):
        def writeInt(x):
            response.write(struct.pack(">I", x))

        def writeFloat(f):
            response.write(struct.pack(">f", f))

        def writeDouble(f):
            response.write(struct.pack(">d", f))

        def writeUTF(s):
            if s == None: s = u""
            try:
                encoded = s.encode('utf8')
            except Exception, cause:
                print "While trying to encode: %s" % (s, )
                raise
            l = len(encoded)
            #print "Writing %s, length %d"%(repr(encoded),l)
            response.write(struct.pack(">H", l))  #short
            response.write(encoded)
コード例 #10
0
ファイル: wcs_controller.py プロジェクト: cedadev/cows
    def GetCoverage(self):
        # Housekeeping
        version = self.getOwsParam('version', default=self.validVersions[0])
        if version not in self.validVersions:
            raise InvalidParameterValue('Version %s not supported' % version,
                                        'version')
        # Layer handling
        layerName, layerObj = self._getLayerParam()
        
        # Coordinate parameters
        bbox = tuple(float(x) for x in self.getOwsParam('bbox').split(','))

        srs = self.getOwsParam('crs')

        #if srs not in layerObj.crss:
         #   raise InvalidParameterValue('Layer %s does not support SRS %s' % (layerName, srs))

        # Get format
        format = self.getOwsParam('format')
        if srs not in layerObj.crss:
            raise InvalidParameterValue('Layer %s does not support SRS %s' % (layerName, srs))
        times= self.getOwsParam('time', default=None)
        
        #process times parameter so it is either a single string (one time) or a tuple (range) (OR None)        
        if times is not None:
            if len(times.split(',')) >1:
                times=tuple(times.split(','))
        
        kwargs={}
        for axis in layerObj.axisDescriptions: #TODO - axisDescriptions attribute
            log.debug('axis: %s'%axis.name)
            axisvalues=self.getOwsParam(axis.name, default=None)
            log.debug('values: %s'%axisvalues)
            if axisvalues:
                values=tuple(float(x) for x in axisvalues.split(','))
                if len(values)==1:
                    values=(values[0], values[0],) #set min and max to be equal if single value
                kwargs[axis.name]=values    
        
#     
        filepath = layerObj.getCvg(bbox, time=times, **kwargs) #TODO, refactor so is more flexible (e.g. not just netcdf)
        fileToReturn=open(filepath, 'r')
        mType='application/cf-netcdf'
        response.headers['Content-Type']=mType
        response.headers['Content-Disposition'] = paste.httpheaders.CONTENT_DISPOSITION(attachment=True, filename=filepath)
        u=fileToReturn.read()
        #close and delete file from file system
        fileToReturn.close()
        log.debug('deleting temporary file %s'%filepath)
        os.system('rm %s'%filepath)
        return response.write(u)
コード例 #11
0
   return decorator(ExceptionToCode)

@decorator
def ExceptionToError(f, *args, **kwargs):
   try:
      return f(*args, **kwargs)
   except HTTPError, e:
      # Let explicit HTTP error codes that we raise pass through as-is.
      response.status = e.code
   except Exception, e:
      # So that it shows up under the caller's logger.
      log = logging.getLogger(f.__module__)
      log.exception('Error')

      error = { 'type': e.__class__.__name__, 'message': str(e) }
      response.write(json.dumps(error))

      response.status = httplib.BAD_REQUEST

class BaseController(WSGIController):
   def _getClient(self, environ):
      client = environ.get('converter.client')

      # Can't put this in environ.get() call because the
      # config['converter.client'] isn't set for testing.
      if client is None:
         client = config['converter.client']

      return client

   def _sendFileResponse(self, filePath, fileName):
コード例 #12
0
        writeDouble(matrix[5])

        if version >= 2:
            writeInt(width)
            writeInt(height)
            print "Writing width,height", chartname, width, height

        writeInt(0xaabbccde)
        for level in xrange(5):
            chart, cksum = parse_landing_chart.get_chart(blobname=chartname,
                                                         cksum=cksum,
                                                         level=level)
            writeUTF(cksum)
            print "Chart:", cksum, "Writing level", level, "size:", len(chart)
            writeInt(len(chart))
            response.write(chart)
            writeInt(0xaabbccdf)
        writeInt(0xf111)
        print "finished writing chart"
        return

    def getmap(self):

        users = meta.Session.query(User).filter(
            User.user == request.params['user']).all()
        badpass = False
        if len(users) == 0:
            badpass = True
        else:
            user, = users
            if user.password != request.params[
コード例 #13
0
    def GetFeatureInfo(self):
        # Housekeeping
        version = self.getOwsParam('version', default=self.validVersions[0])
        if version not in self.validVersions:
            raise InvalidParameterValue('Version %s not supported' % version,
                                        'version')

        # Coordinate parameters
        bbox = tuple(float(x) for x in self.getOwsParam('bbox').split(','))
        width = int(self.getOwsParam('width'))
        height = int(self.getOwsParam('height'))

        # Get pixel location
        i = int(self.getOwsParam('i'))
        j = int(self.getOwsParam('j'))

        format = self.getOwsParam('info_format', default='text/html')

        layers = self._getLayerParam('query_layers')
        for layerObj in layers:
            layerName = layerObj.name
            log.debug('Format: %s' % format)
            log.debug('Title: %s' % layerObj.title)
            log.debug('FeatureInfoFormats: %s' % layerObj.featureInfoFormats)

        # ### Only process first layer if more than one. ###
        layerObj = layers[0]

        if format not in layerObj.featureInfoFormats:
            raise InvalidParameterValue(
                'Layer %s does not support GetFeatureInfo in format %s' %
                (layerName, format), 'info_format')

        srs = self._getSrsParam(version)
        if srs not in layerObj.crss:
            raise InvalidParameterValue('Layer %s does not support SRS %s' %
                                        (layerName, srs))

        # Convert coordinates to (long, lat) if necessary.
        bbox = self._convertBboxForCrs(bbox, version, srs)

        log.debug("(i,j) (%d,%d)  bbox ((%d,%d)(%d,%d))  crs %s" %
                  (i, j, bbox[0], bbox[1], bbox[2], bbox[3], srs))

        # Translate to geo-coordinates
        x, y = bbox_util.pixelToGeo(i, j, bbox, width, height)

        #start preparing GetFeatureInfo response. Assumes "HTML" output format
        #        htmlResponse = "<html><body><p> <b>Feature Information about pixel position: "+self.getOwsParam('i')+","+self.getOwsParam('j')+"/geo position: "+str(x)+","+str(y) +"<b/></p>"

        #Adjusts response for multiple layers
        #        if len(layers) > 1:
        #            htmlResponse = htmlResponse+" Multiple possible features found as follows:"

        #        htmlResponse = htmlResponse+"<ul>"

        # Dimension handling
        dimValues = {}
        for dimName, dim in layerObj.dimensions.items():
            defaultValue = dim.extent[0]
            dimValues[dimName] = self.getOwsParam(dimName,
                                                  default=defaultValue)
            log.debug("dimName: %s  dimValue: %s" %
                      (dimName, dimValues[dimName]))

        value = layerObj.getFeatureInfo(format, srs, (x, y), dimValues)
        htmlResponse = ((
            "<table style='width:100%%'><tr><td>Longitude</td><td>%s</td></tr>"
            + "<tr><td>Latitude</td><td>%s</td></tr>" +
            "<tr><td>Value</td><td>%s</td></tr></table>") %
                        (str(x), str(y), value))

        response.headers['Content-Type'] = format
        response.write(htmlResponse)
コード例 #14
0
ファイル: api.py プロジェクト: avl/SwFlightPlanner
 def writeInt(x):
     response.write(struct.pack(">I",x))
コード例 #15
0
ファイル: api.py プロジェクト: avl/SwFlightPlanner
 def writeLong(x):
     response.write(struct.pack(">Q",x))
コード例 #16
0
ファイル: api.py プロジェクト: avl/SwFlightPlanner
    def getmap(self):

        users=meta.Session.query(User).filter(User.user==request.params['user']).all()
        badpass=False
        if len(users)==0:
            badpass=True
        else:
            user,=users
            if user.password!=request.params['password'] and user.password!=md5str(request.params['password']):
                badpass=True
        maptype=request.params.get('maptype','nolabel')
        def writeInt(x):
            response.write(struct.pack(">I",x))
        def writeLong(x):
            response.write(struct.pack(">Q",x))
        response.headers['Content-Type'] = 'application/binary'        

        version,level,offset,maxlen,maxlevel=\
            [int(request.params[x]) for x in "version","level","offset","maxlen","maxlevel"];
        
        writeInt(0xf00df00d)
        writeInt(1) #version
        if badpass:
            print "badpassword"
            writeInt(1) #error, bad pass
            return None
        #print "Correct password"
        
        totalsize=0
        stamp=0
        for lev in xrange(maxlevel+1):
            tlevelfile=os.path.join(os.getenv("SWFP_DATADIR"),"tiles/"+maptype+"/level"+str(lev))
            totalsize+=os.path.getsize(tlevelfile)
            stamp=max(stamp,os.stat(tlevelfile)[stat.ST_MTIME])
        #print "Maxlevel: %d, stamp: %d"%(maxlevel,stamp)
        levelfile=os.path.join(os.getenv("SWFP_DATADIR"),"tiles/"+maptype+"/level"+str(level))
        curlevelsize=os.path.getsize(levelfile)    
        cursizeleft=curlevelsize-offset
        #print "cursize left:",cursizeleft
        #print "maxlen:",maxlen
        if cursizeleft<0:
            cursizeleft=0
        if maxlen>cursizeleft:
            maxlen=cursizeleft
        if maxlen>1000000:
            maxlen=1000000
        
         
        writeInt(0) #no error
        #print "No error"
        writeLong(stamp) #"data version"
        #print "stamp:",stamp
        writeLong(curlevelsize)
        writeLong(totalsize)
        writeLong(cursizeleft)
        writeInt(0xa51c2)
        latest=meta.Session.query(Download).filter(Download.user==user.user).order_by(sa.desc(Download.when)).first()
        if not latest or datetime.utcnow()-latest.when>timedelta(0,3600):
            down=Download(user.user, maxlen)
            meta.Session.add(down)
        else:
            down=latest
            down.bytes+=maxlen
        meta.Session.flush()
        meta.Session.commit()

        f=open(levelfile)

        if offset<curlevelsize:
            #print "seeking to %d of file %s, then reading %d bytes"%(offset,levelfile,maxlen)
            f.seek(offset)
            data=f.read(maxlen)
            #print "Writing %d bytes to client"%(len(data),)
            response.write(data)
        f.close()
        return None
コード例 #17
0
ファイル: api.py プロジェクト: avl/SwFlightPlanner
 def writeDouble(f):
     response.write(struct.pack(">d",f))
コード例 #18
0
ファイル: api.py プロジェクト: avl/SwFlightPlanner
 def writeFloat(f):
     response.write(struct.pack(">f",f))
コード例 #19
0
ファイル: i18nc.py プロジェクト: bluker/pylons
 def no_lang(self):
     set_lang(None)
     response.write(_('No language'))
     set_lang([])
     response.write(_('No languages'))
     return ''
コード例 #20
0
ファイル: controller_sample.py プロジェクト: douglasd/pylons
 def no_lang(self):
     set_lang(None)
     response.write(_('No language'))
     set_lang([])
     response.write(_('No languages'))
     return ''
コード例 #21
0
 def writeDouble(f):
     response.write(struct.pack(">d", f))
コード例 #22
0
 def writeLong(x):
     response.write(struct.pack(">Q", x))
コード例 #23
0
            # We should insert our HTML block at the bottom of the page with
            # the appropriate CSS to render it at the top.  Easier to insert
            # before </body>.
            c.url = resource.url
            replacement = render("data/cache_header.html")
            try:
                compiled_body = re.compile(re.escape("</body>"), re.IGNORECASE)
                content = compiled_body.sub("{0}</body>".format(replacement),
                                            content, re.IGNORECASE)
            except Exception, e:
                log.warn(
                    "Failed to do the replacement in resource<{0}> and file: {1}"
                    .format(resource.id, filepath))
                return

        response.write(content)

    def viz_upload(self):
        """
        Provides direct upload to DGU for users in specific publishers.
        This is specifically for the social investment publishers so that
        they can host their files somewhere.
        """
        import ckan.model as model

        ALLOWED_PUBLISHERS = set([
            'seedbed'
            'health-social-ventures',
            'big-issue-cooperate',
            'social-incubator-east',
            'young-academy',
コード例 #24
0
 def writeFloat(f):
     response.write(struct.pack(">f", f))
コード例 #25
0
ファイル: api.py プロジェクト: avl/SwFlightPlanner
            
        writeDouble(matrix[4])
        writeDouble(matrix[5])
        
        if version>=2:
            writeInt(width)
            writeInt(height)
            print "Writing width,height",chartname,width,height
            
        writeInt(0xaabbccde)
        for level in xrange(5):            
            chart,cksum=parse_landing_chart.get_chart(blobname=chartname,cksum=cksum,level=level)
            writeUTF(cksum)
            print "Chart:",cksum,"Writing level",level,"size:",len(chart)
            writeInt(len(chart))
            response.write(chart)
            writeInt(0xaabbccdf)
        writeInt(0xf111)
        print "finished writing chart"
        return 
        
    def getmap(self):

        users=meta.Session.query(User).filter(User.user==request.params['user']).all()
        badpass=False
        if len(users)==0:
            badpass=True
        else:
            user,=users
            if user.password!=request.params['password'] and user.password!=md5str(request.params['password']):
                badpass=True
コード例 #26
0
    def getmap(self):

        users = meta.Session.query(User).filter(
            User.user == request.params['user']).all()
        badpass = False
        if len(users) == 0:
            badpass = True
        else:
            user, = users
            if user.password != request.params[
                    'password'] and user.password != md5str(
                        request.params['password']):
                badpass = True
        maptype = request.params.get('maptype', 'nolabel')

        def writeInt(x):
            response.write(struct.pack(">I", x))

        def writeLong(x):
            response.write(struct.pack(">Q", x))

        response.headers['Content-Type'] = 'application/binary'

        version,level,offset,maxlen,maxlevel=\
            [int(request.params[x]) for x in "version","level","offset","maxlen","maxlevel"]

        writeInt(0xf00df00d)
        writeInt(1)  #version
        if badpass:
            print "badpassword"
            writeInt(1)  #error, bad pass
            return None
        #print "Correct password"

        totalsize = 0
        stamp = 0
        for lev in xrange(maxlevel + 1):
            tlevelfile = os.path.join(os.getenv("SWFP_DATADIR"),
                                      "tiles/" + maptype + "/level" + str(lev))
            totalsize += os.path.getsize(tlevelfile)
            stamp = max(stamp, os.stat(tlevelfile)[stat.ST_MTIME])
        #print "Maxlevel: %d, stamp: %d"%(maxlevel,stamp)
        levelfile = os.path.join(os.getenv("SWFP_DATADIR"),
                                 "tiles/" + maptype + "/level" + str(level))
        curlevelsize = os.path.getsize(levelfile)
        cursizeleft = curlevelsize - offset
        #print "cursize left:",cursizeleft
        #print "maxlen:",maxlen
        if cursizeleft < 0:
            cursizeleft = 0
        if maxlen > cursizeleft:
            maxlen = cursizeleft
        if maxlen > 1000000:
            maxlen = 1000000

        writeInt(0)  #no error
        #print "No error"
        writeLong(stamp)  #"data version"
        #print "stamp:",stamp
        writeLong(curlevelsize)
        writeLong(totalsize)
        writeLong(cursizeleft)
        writeInt(0xa51c2)
        latest = meta.Session.query(Download).filter(
            Download.user == user.user).order_by(sa.desc(
                Download.when)).first()
        if not latest or datetime.utcnow() - latest.when > timedelta(0, 3600):
            down = Download(user.user, maxlen)
            meta.Session.add(down)
        else:
            down = latest
            down.bytes += maxlen
        meta.Session.flush()
        meta.Session.commit()

        f = open(levelfile)

        if offset < curlevelsize:
            #print "seeking to %d of file %s, then reading %d bytes"%(offset,levelfile,maxlen)
            f.seek(offset)
            data = f.read(maxlen)
            #print "Writing %d bytes to client"%(len(data),)
            response.write(data)
        f.close()
        return None
コード例 #27
0
 def no_lang(self):
     set_lang(None)
     response.write(_("No language"))
     set_lang([])
     response.write(_("No languages"))
     return ""
コード例 #28
0
 def writeInt(x):
     response.write(struct.pack(">I", x))
コード例 #29
0
ファイル: UserModel.py プロジェクト: jniltinho/GSoC-SWAT
	def __init__ (self, PrintableClass):
		for name in dir(PrintableClass):
			value = getattr(PrintableClass,name)
			if  '_' not in str(name).join(str(value)):
				response.write('  .%s: %r' % (name, value))
コード例 #30
0
ファイル: data.py プロジェクト: metaodi/ckanext-dgu
        try:
            f = open(filepath, "r")
        except IOError:
            log.error('Error reading resource cache file: %s', filepath)
            abort(403, "The system was unable to read this resource from the cache. Admins have been notified")

        content = f.read()
        f.close()

        if not re.search("<base ", content, re.IGNORECASE):
            compiled_head = re.compile(re.escape("<head>"), re.IGNORECASE)
            content = compiled_head.sub( base_string, content, re.IGNORECASE)

        if not '__archiver__cache__header__' in content:
            # We should insert our HTML block at the bottom of the page with
            # the appropriate CSS to render it at the top.  Easier to insert
            # before </body>.
            c.url = resource.url
            replacement = render("data/cache_header.html")
            try:
                compiled_body = re.compile(re.escape("</body>"), re.IGNORECASE)
                content = compiled_body.sub( "{0}</body>".format(replacement), content, re.IGNORECASE)
            except Exception, e:
                log.error("Failed to do the replacement in resource<{0}> and file: {1}".format(resource.id, filepath))
                return

        response.write(content)



コード例 #31
0
ファイル: data.py プロジェクト: afjensen/ckanext-dgu
    def resource_cache(self, root, resource_id, filename):
        """
        Called when a request is made for an item in the resource cache and
        is responsible for rendering the data.  When the data to be rendered
        is HTML it will add a header to show that the content is cached, and
        set a <base> header if not present to make sure all relative links are
        resolved correctly.
        """
        from pylons import response
        from paste.fileapp import FileApp
        from ckanext.dgu.lib.helpers import tidy_url

        archive_root = pylons.config.get('ckanext-archiver.archive_dir')
        if not archive_root:
            # Bad configuration likely to cause this.
            abort(404, "Could not find archive folder")

        resource = model.Resource.get(resource_id)
        is_html = False
        content_type = "application/octet-stream"

        fmt = ""
        task_status = model.Session.query(model.TaskStatus).\
                      filter(model.TaskStatus.task_type=='qa').\
                      filter(model.TaskStatus.key=='status').\
                      filter(model.TaskStatus.entity_id==resource.id).first()
        if task_status:
            status = json.loads(task_status.error)
            fmt = status['format']

        # Make an attempt at getting the correct content type but fail with
        # application/octet-stream in cases where we don't know.
        formats = {
            "CSV": "application/csv",
            "XLS": "application/vnd.ms-excel",
            "HTML": 'text/html; charset=utf-8' }
        content_type = formats.get(fmt, "application/octet-stream")

        is_html = fmt == "HTML"

        filepath = os.path.join(archive_root, root, resource_id, filename).decode('utf-8')
        if not os.path.exists(filepath):
            abort(404, "Resource is not cached")

        file_size = os.path.getsize(filepath)
        if not is_html:
            headers = [('Content-Type', content_type),
                       ('Content-Length', str(file_size))]
            fapp = FileApp(filepath, headers=headers)
            return fapp(request.environ, self.start_response)

        origin = tidy_url(resource.url)
        parts = urlparse.urlparse(origin)
        url = "{0}://{1}".format(parts.scheme, parts.netloc)
        base_string = "<head><base href='{0}'>".format(url)

        response.headers['Content-Type'] = content_type
        with open(filepath, "r") as f:
            content = f.read()

            if not re.search("<base ", content, re.IGNORECASE):
                compiled_head = re.compile(re.escape("<head>"), re.IGNORECASE)
                content = compiled_head.sub( base_string, content, re.IGNORECASE)

            if not '__archiver__cache__header__' in content:
                # We should insert our HTML block at the bottom of the page with
                # the appropriate CSS to render it at the top.  Easier to insert
                # before </body>.
                c.url = resource.url
                replacement = render("data/cache_header.html")
                try:
                    compiled_body = re.compile(re.escape("</body>"), re.IGNORECASE)
                    content = compiled_body.sub( "{0}</body>".format(replacement), content, re.IGNORECASE)
                except Exception, e:
                    log.error("Failed to do the replacement in resource<{0}> and file: {1}".format(resource.id, filepath))
                    return

            response.write(content)