"""Conversions between HTTP time formats and system time.

Loosely modelled after the W3C Reference Library at
<URL:http://www.w3.org/pub/WWW/Library/>.
"""
 
import time
import string

try:
	time.timezone
except AttributeError:
	t = time.time()
	time.timezone = int(time.gmtime(t)[3] - time.localtime(t)[3]) * 3600

_months = { 'jan' : 1, 'feb' : 2, 'mar' : 3, 'apr' : 4,
	    'may' : 5, 'jun' : 6, 'jul' : 7, 'aug' : 8,
	    'sep' : 9, 'oct' : 10, 'nov' : 11, 'dec' : 12 }

def _month_to_num(month):
    m = string.lower(month)
    return _months[m]

def _2dyear_to_4dyear(yy):
    # what do we do with those darn two-digit years?
    # always assuming 19yy seems a little dangerous
    if (yy < 70):
	return yy + 2000
    else:
	return yy + 1900

def parse(str):
    """Parses time in rfc850, rfc1123, and raw seconds formats. Returns
    seconds since the epoch corrected for timezone.

    rfc850:  Weekday, 00-Mon-00 00:00:00 GMT
    rfc1123: Wkd, 00 Mon 0000 00:00:00 GMT 
    raw: [0-9]+ (defined as seconds since current time)

    Raises ValueError if time can't be parsed.
    """

    # first we need to determine the format
    if ',' in str:
	noday = string.strip(str[string.find(str, ',')+1:])
	if '-' in str:
	    # Format...... Weekday, 00-Mon-00 00:00:00 GMT (rfc850)
	    mday = string.atoi(noday[0:2])
	    mon = _month_to_num(noday[3:6])
	    year = _2dyear_to_4dyear(string.atoi(noday[7:9]))
	    hour = string.atoi(noday[10:12])
	    min = string.atoi(noday[13:15])
	    sec = string.atoi(noday[16:18])
	else:
	    # Format...... Wkd, 00 Mon 0000 00:00:00 GMT (rfc1123)
	    mday = string.atoi(noday[0:2])
	    mon = _month_to_num(noday[3:6])
	    year = string.atoi(noday[7:11])
	    hour = string.atoi(noday[12:14])
	    min = string.atoi(noday[15:17])
	    sec = string.atoi(noday[18:20])

	gmt = (year, mon, mday, hour, min, sec, 0, 0, 0)
	secs = time.mktime(gmt)
	return secs - time.timezone
    else:
	# could be raw digits
	if str[0] in string.digits:
	    return time.time() + string.atoi(str)
	else:
	    mon = _month_to_num(str[4:7])
	    mday = string.atoi(str[8:10])
	    year = string.atoi(str[-4:])
	    hour = string.atoi(str[11:13])
	    min = string.atoi(str[14:16])
	    sec = string.atoi(str[17:19])
	    
	    ### do we assume this is GMT time or not?
	    ### let's assume it is
	    gmt = (year, mon, mday, hour, min, sec, 0, 0, 0)
	    secs = time.mktime(gmt)
	    return secs - time.timezone

def unparse(secs):
    """Turns localtime in seconds since epoch to HTTP time.
    """

    str = time.asctime(time.gmtime(secs))
    # puts the string in asctime() format, must convert 
    day = str[0:3]
    mon = str[4:7]
    mday = string.atoi(str[8:10])
    dtime = str[11:19]
    year = str[20:24]
    return "%s, %02d %s %s %s GMT" % (day, mday, mon, year, dtime)
