mangaProxy / mangaProxy.py /
3a66e23 3 years ago
1 contributor
162 lines | 6.132kb
#!/usr/bin/env python3
from http.server import BaseHTTPRequestHandler, HTTPServer
import datetime
from time import perf_counter 
import os
import json
import urllib.parse
import configuration
import socket
import requests
import re
import mangaParser
from userio import *

server = None
csvFilename = None
connectionResults = None

class MyServer(BaseHTTPRequestHandler):
    def log_message(self, format, *args):
        # To silence the default output of server (too verbose)
        return  
    def do_GET(self):
        global csvFilename
        global csvFilenameTemp
        global connectionResults
        rootdir = 'pages/static/'
        csvFilename = rootdir + server['csv']
        csvFilenameTemp = rootdir + server['csvTemp']

        if '/list.html' in self.path:
            page=[]
            data_begin = ""

            with open(configuration.get_pageBegin(),'r') as fStart:
                data_begin += fStart.read().replace( 'CSTAPPNAME', server['name'] )
            
            data_end = ""
            with open(configuration.get_pageEnd(),'r') as fEnd:
                data_end += fEnd.read().replace( 'CSTAPPNAME', server['name'] ).replace( 'CSTAPPVERSION', server['version'] )

            data_page = ""
            with open("list.html", "rt") as f:
                lines=f.readlines()
                for line in lines:
                    data_page += "<li><a href=\"./?url="+line.split("@")[0]+"\">"+line.split("@")[1]+"</a></li>"
                    f.close()
            page.append(data_begin)
            page.append(data_page)
            page.append(data_end)
            content = ''.join(page)
            self.send_response(200)
            self.send_header("Content-type", "text/html")
            self.send_header('Server',server['name']+" v"+server['version'])
            self.end_headers()
            self.wfile.write(content.encode('utf-8'))

        elif not os.path.exists(rootdir + self.path) or self.path == '/index.html' or self.path == '/':
            if self.headers['X-Real-IP'] is None:
                say("From: "+self.client_address[0]+" GET Received : "+self.path)
            else:
                say("From: "+self.headers['X-Real-IP']+" GET Received : "+self.path)
            page=[]

            data_begin = ""
            with open(configuration.get_pageBegin(),'r') as fStart:
                data_begin += fStart.read().replace( 'CSTAPPNAME', server['name'] )
            
            data_end = ""
            with open(configuration.get_pageEnd(),'r') as fEnd:
                data_end += fEnd.read().replace( 'CSTAPPNAME', server['name'] ).replace( 'CSTAPPVERSION', server['version'] )


            s = self.path
            urlArgs = urllib.parse.parse_qs(s[2:])
            url = None
            if "url" in urlArgs:
                url = urlArgs['url'][0]
            opacity=-1
            if "opacity" in urlArgs:
                opacity = urlArgs['opacity'][0]
            pageJump = 1
            if "page" in urlArgs:
                pageJump = urlArgs['page'][0]


            data_page = ""

            #Forging response
            #if configuration.get_debug() != 0:
            #    data_page += "<p>Request: "+self.path+"</p>\n"
            #    data_page += "<xmp>"+json.dumps(urlArgs)+"</xmp>\n"

            if not url is None:
                data_page = mangaParser.readManga(url,opacity,pageJump)
            else:
                try:
                    with open(server['favorite'], "rt") as f:
                        lines=f.readlines()
                        for line in lines:
                            data_page += "<li><a href=\"./?url="+line+"\">"+line+"</a></li>"
                        f.close()
                except:
                    pass
                data_form = "<form action=\"\">\n\
<span id=\"lbl\">Url:</span>\n\
<input type=\"text\" id=\"srvIp\" name=\"url\" value=\"\">\n\
<input type=\"submit\" value=\"Read Online\">\n\
</form>\n"
                data_page += data_form

            page.append(data_begin)          
            page.append(data_page)
            page.append(data_end)
            content = ''.join(page)
            self.send_response(200)
            self.send_header("Content-type", "text/html")
            self.send_header('Server',server['name']+" v"+server['version'])
            self.end_headers()
            self.wfile.write(content.encode('utf-8'))

        elif not os.path.exists(rootdir + self.path):
            self.send_header('Server',server['name']+" v"+server['version'])
            self.send_error(404, 'file not found')
        else:
            try:
                #say(self.path)
                f = open(rootdir + self.path,'rb') #open requested file
                self.send_response(200)
                if self.path.endswith('.css'):
                    self.send_header('Content-type','text/css')
                elif self.path.endswith('.bmp'):
                    self.send_header('Content-type','image/x-ms-bmp')
                elif self.path.endswith('.png'):
                    self.send_header('Content-type','image/png')
                elif self.path.endswith('.jpg'):
                    self.send_header('Content-type','image/jpeg')
                else:
                    self.send_header('Content-type','text/html')
                self.send_header('Server',server['name']+" v"+server['version'])
                self.end_headers()
                self.wfile.write(f.read())
                f.close()
                return
            except IOError:
                self.send_header('Server',server['name']+" v"+server['version'])
                self.send_error(404, 'file not found')

if __name__ == "__main__":        
    #global server
    server = configuration.get_server()
    say(server['name']+" v"+server['version'])
    webServer = HTTPServer((server['address'], server['port']), MyServer)
    say("Server started http://%s:%s" % (server['address'], server['port']))

    try:
        webServer.serve_forever()
    except KeyboardInterrupt:
        pass

    webServer.server_close()
    print("Server stopped.")