#!/usr/bin/env python """ head.py - Phenny HTTP Metadata Utilities Copyright 2008, Sean B. Palmer, inamidst.com Licensed under the Eiffel Forum License 2. http://inamidst.com/phenny/ """ import re import urllib.request import urllib.parse import urllib.error import http.client import http.cookiejar import time import web from tools import deprecated from modules.linx import get_title cj = http.cookiejar.LWPCookieJar() opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) urllib.request.install_opener(opener) def head(phenny, input): """Provide HTTP HEAD information.""" uri = input.group(2) uri = (uri or '') if ' ' in uri: uri, header = uri.rsplit(' ', 1) else: uri, header = uri, None if not uri and hasattr(phenny, 'last_seen_uri'): try: uri = phenny.last_seen_uri[input.sender] except KeyError: return phenny.say('?') if not uri.startswith('htt'): uri = 'http://' + uri # uri = uri.replace('#!', '?_escaped_fragment_=') start = time.time() try: info = web.head(uri) info['status'] = '200' except urllib.error.HTTPError as e: return phenny.say(str(e.code)) except http.client.InvalidURL: return phenny.say("Not a valid URI, sorry.") except IOError: return phenny.say("Can't connect to %s" % uri) resptime = time.time() - start if header is None: data = [] if 'Status' in info: data.append(info['Status']) if 'content-type' in info: data.append(info['content-type'].replace('; charset=', ', ')) if 'last-modified' in info: modified = info['last-modified'] modified = time.strptime(modified, '%a, %d %b %Y %H:%M:%S %Z') data.append(time.strftime('%Y-%m-%d %H:%M:%S UTC', modified)) if 'content-length' in info: data.append(info['content-length'] + ' bytes') data.append('{0:1.2f} s'.format(resptime)) phenny.reply(', '.join(data)) else: headerlower = header.lower() if headerlower in info: phenny.say(header + ': ' + info.get(headerlower)) else: msg = 'There was no %s header in the response.' % header phenny.say(msg) head.commands = ['head'] head.example = '.head http://www.w3.org/' @deprecated def f_title(self, origin, match, args): """.title - Return the title of URI.""" uri = match.group(2) uri = (uri or '') if not uri and hasattr(self, 'last_seen_uri'): uri = self.last_seen_uri.get(origin.sender) if not uri: return self.msg(origin.sender, 'I need a URI to give the title of...') title = get_title(uri) if title: self.msg(origin.sender, origin.nick + ': ' + title) else: self.msg(origin.sender, origin.nick + ': No title found') f_title.commands = ['title'] r_title = re.compile(r'(?ims)]*>(.*?)') r_entity = re.compile(r'&[A-Za-z0-9#]+;') def noteuri(phenny, input): uri = input.group(1) if not hasattr(phenny.bot, 'last_seen_uri'): phenny.bot.last_seen_uri = {} phenny.bot.last_seen_uri[input.sender] = uri noteuri.rule = r'.*(http[s]?://[^<> "\x01]+)[,.]?' noteuri.priority = 'low' titlecommands = r'(?:' + r'|'.join(f_title.commands) + r')' def snarfuri(phenny, input): if re.match(r'(?i)' + phenny.config.prefix + titlecommands, input.group()): return uri = input.group(1) title = get_title(uri, input.sender) if title: phenny.msg(input.sender, title) snarfuri.rule = r'.*(http[s]?://[^<> "\x01]+)[,.]?' snarfuri.priority = 'low' if __name__ == '__main__': print(__doc__.strip())