173 lines
8.6 KiB
Python
173 lines
8.6 KiB
Python
import socket,threading,os,time,math,json,sys,urllib,requests
|
|
sys.path.append('libraries\\')
|
|
from Astronomy import *
|
|
#-------------------------------------#
|
|
#Define Area
|
|
class APICore(object):
|
|
HTTPHead={
|
|
'200':'HTTP/1.1 200 OK\r\nServer: SparkE/Alpha1.0\r\nContent-Type: application/json; charset=utf-8\r\n\r\n',
|
|
'400':'HTTP/1.1 400 BAD REQUEST\r\nServer: SparkE/Alpha1.0\r\nContent-Type: application/json; charset=utf-8\r\n\r\n',
|
|
'404':'HTTP/1.1 404 NOT FOUND\r\nServer: SparkE/Alpha1.0\r\nContent-Type: application/json; charset=utf-8\r\n\r\n'
|
|
}
|
|
def __init__(self):
|
|
self.__Log=[]
|
|
def Log(self,IP,Port,Type,Text):
|
|
Time=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
|
|
self.__Log.append((Time,IP,Port,Type,Text))
|
|
print("["+Type+"]["+Time+"]["+IP+"]["+str(Port)+"]"+str(Text))
|
|
def IsJson(self,text):
|
|
try:
|
|
json.loads(text)
|
|
return True
|
|
except:
|
|
return False
|
|
def Error400(self,sock,addr):
|
|
sock.send(self.HTTPHead['400'].encode("utf-8"))
|
|
Result=json.dumps({"info":"bad request","code":400})
|
|
self.Log(addr[0],addr[1],"SEND",Result)
|
|
sock.send(str(Result).encode("utf-8"))
|
|
def SunAzEl(self,sock,addr):
|
|
Result=json.dumps(Astronomy().calcSunAzEl())
|
|
self.Log(addr[0],addr[1],"SEND",Result)
|
|
sock.send(str(Result).encode("utf-8"))
|
|
#-------------------------------------#
|
|
API=APICore()
|
|
#-------------------------------------#
|
|
RequestRecord={}
|
|
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
|
|
server.bind(("0.0.0.0",8000))
|
|
server.listen()
|
|
def socket(sock,addr):
|
|
while True:
|
|
try:
|
|
data = sock.recv(1024)
|
|
#print(data.decode("utf-8"))
|
|
if("HTTP/" in data.decode("utf-8")):
|
|
API.Log(addr[0],addr[1],"RECV","Received a HTTP request.")
|
|
#HTTP Request.
|
|
try:
|
|
Heada=data.decode("utf-8").split("\r\n")[0].split(" ")[1].split("/")
|
|
del Heada[0]
|
|
except:
|
|
API.Error400(sock,addr)
|
|
break
|
|
try:
|
|
Headb=data.decode("utf-8").split("\r\n\r\n")[1]
|
|
except:
|
|
Headb=""
|
|
HTTPRequestHead=(Heada,Headb)
|
|
for i in range(0,len(HTTPRequestHead[0])):
|
|
HTTPRequestHead[0][i]=urllib.parse.unquote(HTTPRequestHead[0][i])
|
|
API.Log(addr[0],addr[1],"RECV",HTTPRequestHead)
|
|
if(" / " in data.decode("utf-8")):
|
|
#Help Command
|
|
sock.send(API.HTTPHead['200'].encode("utf-8"))
|
|
Result=json.dumps({"wikis":"https://gitee.com/ghink/api/wikis"})
|
|
API.Log(addr[0],addr[1],"SEND",Result)
|
|
sock.send(str(Result).encode("utf8"))
|
|
break
|
|
elif(" /SunAzEl" in data.decode("utf-8")):
|
|
if("GET " in data.decode("utf-8")):
|
|
#GET Request
|
|
try:
|
|
#Exist Parameter
|
|
HTTPRequestHead[0][1]
|
|
if(API.IsJson(HTTPRequestHead[0][1])):
|
|
#Is Json,Return Result
|
|
try:
|
|
Para=json.loads(HTTPRequestHead[0][1])
|
|
Result=json.dumps(Astronomy().calcSunAzEl(Para['Stamp'],Para['Lon'],Para['Lat'],Para['TimeZone'],Para['ZeroAzimuth']))
|
|
sock.send(API.HTTPHead['200'].encode("utf-8"))
|
|
API.Log(addr[0],addr[1],"SEND",Result)
|
|
sock.send(str(Result).encode("utf-8"))
|
|
except:
|
|
API.Error400(sock,addr)
|
|
else:
|
|
#Not Json,Return Bad Request
|
|
API.Error400(sock,addr)
|
|
except:
|
|
#No Parameter
|
|
sock.send(API.HTTPHead['200'].encode("utf-8"))
|
|
API.SunAzEl(sock,addr)
|
|
elif("POST " in data.decode("utf-8")):
|
|
#POST Request
|
|
try:
|
|
#Exist GET Parameter,Return Bad Request
|
|
HTTPRequestHead[0][1]
|
|
API.Error400(sock,addr)
|
|
except:
|
|
#No GET Parameter,Continue
|
|
if(API.IsJson(HTTPRequestHead[1])):
|
|
#If POST Parameter is Json
|
|
try:
|
|
Para=json.loads(HTTPRequestHead[1])
|
|
Result=json.dumps(Astronomy().calcSunAzEl(Para['Stamp'],Para['Lon'],Para['Lat'],Para['TimeZone'],Para['ZeroAzimuth']))
|
|
sock.send(API.HTTPHead['200'].encode("utf-8"))
|
|
API.Log(addr[0],addr[1],"SEND",Result)
|
|
sock.send(str(Result).encode("utf-8"))
|
|
except:
|
|
API.Error400(sock,addr)
|
|
elif(HTTPRequestHead[1]==""):
|
|
#If No POST Parameter
|
|
sock.send(API.HTTPHead['200'].encode("utf-8"))
|
|
API.SunAzEl(sock,addr)
|
|
else:
|
|
#Wrong POST Parameter,Return Bad Request
|
|
API.Error400(sock,addr)
|
|
break
|
|
else:
|
|
#No Such Command
|
|
sock.send(API.HTTPHead['404'].encode("utf8"))
|
|
Result=json.dumps({"info":"not found","code":404})
|
|
API.Log(addr[0],addr[1],"SEND",Result)
|
|
sock.send(Result.encode("utf-8"))
|
|
break
|
|
else:
|
|
API.Log(addr[0],addr[1],"RECV","Received a TCP request.")
|
|
#TCP Request.
|
|
if(data.decode("utf-8")=="Help" or data.decode("utf-8")=="HELP" or data.decode("utf-8")=="help" or data.decode("utf-8")=="WIKI" or data.decode("utf-8")=="wiki" or data.decode("utf-8")=="wikis" or data.decode("utf-8")=="WIKIS" or data.decode("utf-8")=="?"):
|
|
#Help Command
|
|
Result=json.dumps({"wikis":"https://gitee.com/ghink/api/wikis"})
|
|
API.Log(addr[0],addr[1],"SEND",Result)
|
|
sock.send(str(Result).encode("utf8"))
|
|
elif("SunAzEl" in data.decode("utf-8")):
|
|
if(API.IsJson(data.decode("utf-8"))):
|
|
#Is Json
|
|
try:
|
|
#Check whether is right json
|
|
Para=json.loads(data.decode("utf-8"))['Parameter']
|
|
Result=json.dumps(Astronomy().calcSunAzEl(Para['Stamp'],Para['Lon'],Para['Lat'],Para['TimeZone'],Para['ZeroAzimuth']))
|
|
API.Log(addr[0],addr[1],"SEND",Result)
|
|
sock.send(str(Result).encode("utf-8"))
|
|
except:
|
|
#Not right json
|
|
Result=json.dumps({"info":"bad request","code":400})
|
|
API.Log(addr[0],addr[1],"SEND",Result)
|
|
sock.send(Result.encode("utf-8"))
|
|
elif(data.decode("utf-8")=="SunAzEl"):
|
|
#Not Json
|
|
API.SunAzEl(sock,addr)
|
|
else:
|
|
#Wrong Command
|
|
Result=json.dumps({"info":"bad request","code":400})
|
|
API.Log(addr[0],addr[1],"SEND",Result)
|
|
sock.send(Result.encode("utf-8"))
|
|
else:
|
|
#No Such Command
|
|
Result=json.dumps({"info":"not found","code":404})
|
|
API.Log(addr[0],addr[1],"SEND",Result)
|
|
sock.send(Result.encode("utf-8"))
|
|
except (ConnectionResetError,ConnectionAbortedError):
|
|
API.Log(addr[0],addr[1],"STATUS","Lost connection.")
|
|
break
|
|
except UnicodeDecodeError:
|
|
API.Log(addr[0],addr[1],"STATUS","Wrong code mode,must be utf-8.")
|
|
API.Log(addr[0],addr[1],"STATUS","Lost connection.")
|
|
break
|
|
def main():
|
|
sock,addr=server.accept()
|
|
client_thread=threading.Thread(target=socket,args=(sock,addr))
|
|
client_thread.start()
|
|
while True:
|
|
main()
|