Package web :: Package web :: Module net
[hide private]
[frames] | no frames]

Source Code for Module web.web.net

  1  """ 
  2  Network Utilities 
  3  (from web.py) 
  4  """ 
  5   
  6  __all__ = [ 
  7    "validipaddr", "validipport", "validip", "validaddr",  
  8    "urlquote", 
  9    "httpdate", "parsehttpdate",  
 10    "htmlquote", "htmlunquote", "websafe", 
 11  ] 
 12   
 13  import urllib, time 
 14  try: import datetime 
 15  except ImportError: pass 
 16   
17 -def validipaddr(address):
18 """ 19 Returns True if `address` is a valid IPv4 address. 20 21 >>> validipaddr('192.168.1.1') 22 True 23 >>> validipaddr('192.168.1.800') 24 False 25 >>> validipaddr('192.168.1') 26 False 27 """ 28 try: 29 octets = address.split('.') 30 if len(octets) != 4: 31 return False 32 for x in octets: 33 if not (0 <= int(x) <= 255): 34 return False 35 except ValueError: 36 return False 37 return True
38
39 -def validipport(port):
40 """ 41 Returns True if `port` is a valid IPv4 port. 42 43 >>> validipport('9000') 44 True 45 >>> validipport('foo') 46 False 47 >>> validipport('1000000') 48 False 49 """ 50 try: 51 if not (0 <= int(port) <= 65535): 52 return False 53 except ValueError: 54 return False 55 return True
56
57 -def validip(ip, defaultaddr="0.0.0.0", defaultport=8080):
58 """Returns `(ip_address, port)` from string `ip_addr_port`""" 59 addr = defaultaddr 60 port = defaultport 61 62 ip = ip.split(":", 1) 63 if len(ip) == 1: 64 if not ip[0]: 65 pass 66 elif validipaddr(ip[0]): 67 addr = ip[0] 68 elif validipport(ip[0]): 69 port = int(ip[0]) 70 else: 71 raise ValueError, ':'.join(ip) + ' is not a valid IP address/port' 72 elif len(ip) == 2: 73 addr, port = ip 74 if not validipaddr(addr) and validipport(port): 75 raise ValueError, ':'.join(ip) + ' is not a valid IP address/port' 76 port = int(port) 77 else: 78 raise ValueError, ':'.join(ip) + ' is not a valid IP address/port' 79 return (addr, port)
80
81 -def validaddr(string_):
82 """ 83 Returns either (ip_address, port) or "/path/to/socket" from string_ 84 85 >>> validaddr('/path/to/socket') 86 '/path/to/socket' 87 >>> validaddr('8000') 88 ('0.0.0.0', 8000) 89 >>> validaddr('127.0.0.1') 90 ('127.0.0.1', 8080) 91 >>> validaddr('127.0.0.1:8000') 92 ('127.0.0.1', 8000) 93 >>> validaddr('fff') 94 Traceback (most recent call last): 95 ... 96 ValueError: fff is not a valid IP address/port 97 """ 98 if '/' in string_: 99 return string_ 100 else: 101 return validip(string_)
102
103 -def urlquote(val):
104 """ 105 Quotes a string for use in a URL. 106 107 >>> urlquote('://?f=1&j=1') 108 '%3A//%3Ff%3D1%26j%3D1' 109 >>> urlquote(None) 110 '' 111 >>> urlquote(u'\u203d') 112 '%E2%80%BD' 113 """ 114 if val is None: return '' 115 if not isinstance(val, unicode): val = str(val) 116 else: val = val.encode('utf-8') 117 return urllib.quote(val)
118
119 -def httpdate(date_obj):
120 """ 121 Formats a datetime object for use in HTTP headers. 122 123 >>> import datetime 124 >>> httpdate(datetime.datetime(1970, 1, 1, 1, 1, 1)) 125 'Thu, 01 Jan 1970 01:01:01 GMT' 126 """ 127 return date_obj.strftime("%a, %d %b %Y %H:%M:%S GMT")
128
129 -def parsehttpdate(string_):
130 """ 131 Parses an HTTP date into a datetime object. 132 133 >>> parsehttpdate('Thu, 01 Jan 1970 01:01:01 GMT') 134 datetime.datetime(1970, 1, 1, 1, 1, 1) 135 """ 136 try: 137 t = time.strptime(string_, "%a, %d %b %Y %H:%M:%S %Z") 138 except ValueError: 139 return None 140 return datetime.datetime(*t[:6])
141
142 -def htmlquote(text):
143 """ 144 Encodes `text` for raw use in HTML. 145 146 >>> htmlquote("<'&\\">") 147 '&lt;&#39;&amp;&quot;&gt;' 148 """ 149 text = text.replace("&", "&amp;") # Must be done first! 150 text = text.replace("<", "&lt;") 151 text = text.replace(">", "&gt;") 152 text = text.replace("'", "&#39;") 153 text = text.replace('"', "&quot;") 154 return text
155
156 -def htmlunquote(text):
157 """ 158 Decodes `text` that's HTML quoted. 159 160 >>> htmlunquote('&lt;&#39;&amp;&quot;&gt;') 161 '<\\'&">' 162 """ 163 text = text.replace("&quot;", '"') 164 text = text.replace("&#39;", "'") 165 text = text.replace("&gt;", ">") 166 text = text.replace("&lt;", "<") 167 text = text.replace("&amp;", "&") # Must be done last! 168 return text
169
170 -def websafe(val):
171 """ 172 Converts `val` so that it's safe for use in UTF-8 HTML. 173 174 >>> websafe("<'&\\">") 175 '&lt;&#39;&amp;&quot;&gt;' 176 >>> websafe(None) 177 '' 178 >>> websafe(u'\u203d') 179 '\\xe2\\x80\\xbd' 180 """ 181 if val is None: 182 return '' 183 if isinstance(val, unicode): 184 val = val.encode('utf-8') 185 val = str(val) 186 return htmlquote(val)
187 188 if __name__ == "__main__": 189 import doctest 190 doctest.testmod() 191