#Copyright Christian Meisenbichler

import string,cgi,time,shutil
from os import curdir, sep, mkdir,system,fork,listdir
import os               
import sys
import subprocess
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import openbabel
from urlparse import urlparse
class MyHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        try:
            if (self.path.endswith("/supportedformats")):
                 self.send_response(200)
                 self.send_header('Content-type',    'text/xml')
                 self.end_headers()
                 obConversion = openbabel.OBConversion()
                 informs=obConversion.GetSupportedInputFormat ()
                 outforms=obConversion.GetSupportedOutputFormat ()
                 self.wfile.write("<formats>\n");
                 self.wfile.write("  <in>\n");
                 for format in informs:
                     desc=format.split('--')
                     #self.wfile.write('<format suffix="',desc[1],'" name="',desc[2],'"/>');
                     self.wfile.write('    <format suffix="');                    
                     self.wfile.write(desc[0]);
                     self.wfile.write('">'); 
                     self.wfile.write(desc[1]);
                     self.wfile.write("</format>\n");     
                 self.wfile.write("  </in>\n");  
                 self.wfile.write("  <out>\n");
                 for format in outforms:
                     desc=format.split('--')
                     #self.wfile.write('<format suffix="',desc[1],'" name="',desc[2],'"/>');
                     self.wfile.write('    <format suffix="');                    
                     self.wfile.write(desc[0]);
                     self.wfile.write('">'); 
                     self.wfile.write(desc[1]);
                     self.wfile.write("</format>\n");
                 self.wfile.write("  </out>\n");  
                 self.wfile.write("</formats>");
                 
                 
            else:
                 self.send_error(404,'No valid request %s' % self.path)       
            return
                
        except IOError:
            self.send_error(404,'File Not Found: %s' % self.path)

    def do_POST(self):
         
        try:   
            contenttype=self.headers.getheader('content-type')
            url=urlparse(self.path)
            params = dict([part.split('=') for part in url[4].split('&')])
            print "contenttype",contenttype
            length = int(self.headers.getheader('content-length'))
            obConversion = openbabel.OBConversion()
            obConversion.SetInAndOutFormats(params['in'], params['out'])
            mol = openbabel.OBMol()
            obConversion.ReadString(mol, self.rfile.read(length))
            self.send_response(301)
            self.send_header('Content-type',    'application/text')
            self.end_headers()
            self.wfile.write(obConversion.WriteString(mol));
   
            return
        except OSError:         
            self.send_error(400,'Something went wrong: %s' % self.path)

def main():
    try:
        server = HTTPServer(('', 8071), MyHandler)
        print 'started httpserver...'
        server.serve_forever()
    except KeyboardInterrupt:
        print '^C received, shutting down server'
        server.socket.close()

if __name__ == '__main__':
    main()

