File:  [Repository] / MPIWGWeb / Attic / SrvTxtUtils.py
Revision 1.1.2.1: download - view: text, annotated - select for diffs - revision graph
Thu Mar 22 13:30:56 2012 UTC (12 years, 3 months ago) by casties
Branches: r2
added SrvTxtUtils

    1: """Utility methods for handling XML, reading HTTP, etc"""
    2: 
    3: from App.ImageFile import ImageFile
    4: from App.Common import rfc1123_date
    5: 
    6: import sys
    7: import os
    8: import stat
    9: import urllib
   10: import urllib2
   11: import logging
   12: 
   13: 
   14: srvTxtUtilsVersion = "1.3"
   15: 
   16: def getInt(number, default=0):
   17:     """returns always an int (0 in case of problems)"""
   18:     try:
   19:         return int(number)
   20:     except:
   21:         return int(default)
   22: 
   23: def getAt(array, idx, default=None):
   24:     """returns element idx from array or default (in case of problems)"""
   25:     try:
   26:         return array[idx]
   27:     except:
   28:         return default
   29: 
   30: def getText(node, recursive=0):
   31:     """returns all text content of a node and its subnodes"""
   32:     if node is None:
   33:         return ''
   34:     
   35:     # ElementTree:
   36:     text = node.text or ''
   37:     for e in node:
   38:         if recursive:
   39:             text += getText(e)
   40:         else:
   41:             text += e.text or ''
   42:         if e.tail:
   43:             text += e.tail
   44: 
   45:     # 4Suite:
   46:     #nodelist=node.childNodes
   47:     #text = ""
   48:     #for n in nodelist:
   49:     #    if n.nodeType == node.TEXT_NODE:
   50:     #       text = text + n.data
   51:     
   52:     return text
   53: 
   54: 
   55: 
   56: def getHttpData(url, data=None, num_tries=3, timeout=10):
   57:     """returns result from url+data HTTP request"""
   58:     # we do GET (by appending data to url)
   59:     if isinstance(data, str) or isinstance(data, unicode):
   60:         # if data is string then append
   61:         url = "%s?%s"%(url,data)
   62:     elif isinstance(data, dict) or isinstance(data, list) or isinstance(data, tuple):
   63:         # urlencode
   64:         url = "%s?%s"%(url,urllib.urlencode(data))
   65:     
   66:     response = None
   67:     errmsg = None
   68:     for cnt in range(num_tries):
   69:         try:
   70:             logging.debug("getHttpData(#%s %ss) url=%s"%(cnt+1,timeout,url))
   71:             if sys.version_info < (2, 6):
   72:                 # set timeout on socket -- ugly :-(
   73:                 import socket
   74:                 socket.setdefaulttimeout(float(timeout))
   75:                 response = urllib2.urlopen(url)
   76:             else:
   77:                 # timeout as parameter
   78:                 response = urllib2.urlopen(url,timeout=float(timeout))
   79:             # check result?
   80:             break
   81:         except urllib2.HTTPError, e:
   82:             logging.error("getHttpData: HTTP error(%s): %s"%(e.code,e))
   83:             errmsg = str(e)
   84:             # stop trying
   85:             break
   86:         except urllib2.URLError, e:
   87:             logging.error("getHttpData: URLLIB error(%s): %s"%(e.reason,e))
   88:             errmsg = str(e)
   89:             # stop trying
   90:             #break
   91: 
   92:     if response is not None:
   93:         data = response.read()
   94:         response.close()
   95:         return data
   96:     
   97:     raise IOError("ERROR fetching HTTP data from %s: %s"%(url,errmsg))
   98:     #return None
   99: 
  100: 
  101: def refreshingImageFileIndexHtml(self, REQUEST, RESPONSE):
  102:     """index_html method for App.ImageFile that updates the file info for each request."""
  103:     stat_info = os.stat(self.path)
  104:     self.size = stat_info[stat.ST_SIZE]
  105:     self.lmt = float(stat_info[stat.ST_MTIME]) or time.time()
  106:     self.lmh = rfc1123_date(self.lmt)
  107:     # call original method
  108:     return ImageFile.index_html(self, REQUEST, RESPONSE)
  109: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>