Handle return value
This commit is contained in:
parent
345c3d4d6a
commit
03e7a0abfc
30
gemini.py
30
gemini.py
|
@ -3,6 +3,7 @@ import ssl
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
|
|
||||||
# See https://tildegit.org/solderpunk/gemini-demo-1/src/branch/master/gemini-demo.py
|
# See https://tildegit.org/solderpunk/gemini-demo-1/src/branch/master/gemini-demo.py
|
||||||
|
# See also https://gemini.circumlunar.space/docs/specification.html for more details
|
||||||
|
|
||||||
class Request():
|
class Request():
|
||||||
def __init__(self, url):
|
def __init__(self, url):
|
||||||
|
@ -16,22 +17,33 @@ class Request():
|
||||||
|
|
||||||
def makeRequest(self):
|
def makeRequest(self):
|
||||||
try:
|
try:
|
||||||
|
# Create socket
|
||||||
s = socket.create_connection((self.hostname, self.port))
|
s = socket.create_connection((self.hostname, self.port))
|
||||||
context = ssl.SSLContext()
|
context = ssl.SSLContext()
|
||||||
context.check_hostname = False
|
context.check_hostname = False
|
||||||
context.verify_mode = ssl.CERT_NONE
|
context.verify_mode = ssl.CERT_NONE
|
||||||
s = context.wrap_socket(s, server_hostname = self.hostname)
|
s = context.wrap_socket(s, server_hostname = self.hostname)
|
||||||
|
# Send request
|
||||||
s.sendall((self.url + '\r\n').encode("UTF-8"))
|
s.sendall((self.url + '\r\n').encode("UTF-8"))
|
||||||
|
|
||||||
|
# Receive the answer
|
||||||
fp = s.makefile("rb")
|
fp = s.makefile("rb")
|
||||||
header = fp.readline().decode("UTF-8").strip()
|
|
||||||
status, mime = header.split()
|
# Read header
|
||||||
|
self.header = fp.readline().decode("UTF-8").strip()
|
||||||
print("STATUS : " + status)
|
self.status = self.header[0:2]
|
||||||
print("MIME : " + mime)
|
self.meta = self.header[3:]
|
||||||
|
|
||||||
body = fp.read().decode("UTF-8")
|
# Handle errors
|
||||||
|
if self.status[0] == "4" or self.status[0] == "5":
|
||||||
return body
|
# There is an error and no content so we display error code and error message
|
||||||
|
self.content = "Error " + self.status + " : " + self.meta
|
||||||
|
else:
|
||||||
|
# Read the content
|
||||||
|
self.content = fp.read().decode("UTF-8")
|
||||||
|
|
||||||
|
# Return the status code
|
||||||
|
return self.status
|
||||||
|
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
print(err)
|
print(err)
|
||||||
|
|
27
main.py
27
main.py
|
@ -1,4 +1,6 @@
|
||||||
import tkinter as tk
|
import tkinter as tk
|
||||||
|
import tkinter.messagebox
|
||||||
|
import tkinter.simpledialog
|
||||||
import gemini
|
import gemini
|
||||||
|
|
||||||
# See https://tildegit.org/solderpunk/gemini-demo-1/src/branch/master/gemini-demo.py
|
# See https://tildegit.org/solderpunk/gemini-demo-1/src/branch/master/gemini-demo.py
|
||||||
|
@ -12,10 +14,31 @@ class Application():
|
||||||
self.current_URL = "about:home"
|
self.current_URL = "about:home"
|
||||||
|
|
||||||
def updateContent(self):
|
def updateContent(self):
|
||||||
|
# Get url asked
|
||||||
self.current_URL = self.nav_bar.getURL()
|
self.current_URL = self.nav_bar.getURL()
|
||||||
|
|
||||||
|
# New request
|
||||||
r = gemini.Request(self.current_URL)
|
r = gemini.Request(self.current_URL)
|
||||||
text = r.makeRequest()
|
status = r.makeRequest()
|
||||||
self.content.setContent(text)
|
|
||||||
|
# The server asked for user input
|
||||||
|
if status[0] == "1":
|
||||||
|
user_input = tkinter.simpledialog.askstring("User input", "The server asked for " + r.meta + ".")
|
||||||
|
self.nav_bar.URL_var.set(self.current_URL + "?" + user_input)
|
||||||
|
self.updateContent()
|
||||||
|
# If server asked for redirection
|
||||||
|
elif status[0] == "3":
|
||||||
|
# Ask to user
|
||||||
|
confirm = tkinter.messagebox.askyesno("Server redirection", "This server ask for redirection to " + r.meta + ". Follow ?")
|
||||||
|
# If he accepted
|
||||||
|
if confirm:
|
||||||
|
self.nav_bar.URL_var.set(r.meta)
|
||||||
|
self.updateContent()
|
||||||
|
# The server asked for client certificate, unsupported
|
||||||
|
elif status[0] == "6":
|
||||||
|
tkinter.messagebox.showerror("Client certificate required", "Error " + status + " : " + r.meta)
|
||||||
|
else:
|
||||||
|
self.content.setContent(r.content)
|
||||||
|
|
||||||
class NavBar():
|
class NavBar():
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
|
Reference in New Issue