# -*- Mode: Python -*-
#
#       Author: Rob Chavers <rob@chavers.us>
#       Copyright 2002 by Rob Chavers
#                                                All Rights Reserved.
#

import StringIO
import traceback
import os
import sys
import re
from http_server import get_header

HOST = re.compile ('Host: ([^:/]+).*', re.IGNORECASE)


def parse_file (request, userpath, openfile):
    """
    added by rac
    to serve my mangled html with python embedded code
    """

    fakefile = StringIO.StringIO()
    cwd = os.getcwd()
    filepath = userpath + request.uri
    host = get_header (HOST, request.header)

    namespace = {'request': request,
                 '__path__': userpath,
                 '__file__': filepath,
                 '__host__': host}

    try:
        os.chdir(userpath)
        pye_html = openfile.read()
        while 1:
            m = re.search('<pye>.*?</pye>', pye_html, re.DOTALL)
            if not m: break
            cmd = pye_html[m.start()+5:m.end()-6]
            old_files = sys.stdin, sys.stdout, sys.stderr
            temp_files = StringIO.StringIO(), StringIO.StringIO(), StringIO.StringIO()
            sys.stdin, sys.stdout, sys.stderr = temp_files
            try:
                exec(cmd, namespace, namespace)
                pye_output = temp_files[1].getvalue()
            except:
                temp_files[2].write('cmd:\n%s\n' %cmd)
                traceback.print_exc(file=temp_files[2])
                #log2.msg(temp_files[2].getvalue())
                old_files[2].write(temp_files[2].getvalue())
                pye_output = 'PYE_ERROR'
            sys.stdin, sys.stdout, sys.stderr = old_files
            pye_html = pye_html[:m.start()] + pye_output + pye_html[m.end():]
        fakefile.write(pye_html)
    except:
        traceback.print_exc(file=sys.stdout)
        #io = StringIO.StringIO()
        #traceback.print_exc(file=io)
        #fakefile.write(html.PRE(io.getvalue()))

    os.chdir(cwd)
    fakefile.seek(0)

    request['Content-Length'] = fakefile.len
    return fakefile
