Fix redirect logic, and handle permanent redirects.
This commit is contained in:
parent
8c5c779415
commit
dc6c64c741
21
av98.py
21
av98.py
|
@ -195,6 +195,7 @@ class GeminiClient(cmd.Cmd):
|
||||||
self.lookup = self.index
|
self.lookup = self.index
|
||||||
self.marks = {}
|
self.marks = {}
|
||||||
self.page_index = 0
|
self.page_index = 0
|
||||||
|
self.permanent_redirects = {}
|
||||||
self.previous_redirectors = set()
|
self.previous_redirectors = set()
|
||||||
self.tmp_filename = ""
|
self.tmp_filename = ""
|
||||||
self.visited_hosts = set()
|
self.visited_hosts = set()
|
||||||
|
@ -232,6 +233,11 @@ class GeminiClient(cmd.Cmd):
|
||||||
if gi.scheme not in ("gemini", "gopher"):
|
if gi.scheme not in ("gemini", "gopher"):
|
||||||
print("Sorry, no support for " + gi.scheme)
|
print("Sorry, no support for " + gi.scheme)
|
||||||
return
|
return
|
||||||
|
# Obey permanent redirects
|
||||||
|
if gi.url in self.permanent_redirects:
|
||||||
|
new_gi = GeminiItem(self.permanent_redirects[gi.url], name=gi.name)
|
||||||
|
self._go_to_gi(new_gi)
|
||||||
|
return
|
||||||
# Do everything which touches the network in one block,
|
# Do everything which touches the network in one block,
|
||||||
# so we only need to catch exceptions once
|
# so we only need to catch exceptions once
|
||||||
try:
|
try:
|
||||||
|
@ -285,18 +291,21 @@ Slow internet connection? Use 'set timeout' to be more patient.""")
|
||||||
# Redirects
|
# Redirects
|
||||||
elif status.startswith("3"):
|
elif status.startswith("3"):
|
||||||
new_gi = GeminiItem(gi.absolutise_url(meta))
|
new_gi = GeminiItem(gi.absolutise_url(meta))
|
||||||
if not self.options["auto_follow_redirects"]:
|
if new_gi.url in self.previous_redirectors:
|
||||||
follow = input("Follow redirect to %s? (y/n) " % new_gi.url)
|
|
||||||
if follow.strip().lower() in ("y", "yes"):
|
|
||||||
self._go_to_gi(new_gi)
|
|
||||||
elif new_gi.url in self.previous_redirectors:
|
|
||||||
print("Error: caught in redirect loop!")
|
print("Error: caught in redirect loop!")
|
||||||
elif len(self.previous_redirectors) == _MAX_REDIRECTS:
|
elif len(self.previous_redirectors) == _MAX_REDIRECTS:
|
||||||
print("Error: refusing to follow more than %d consecutive redirects!" % _MAX_REDIRECTS)
|
print("Error: refusing to follow more than %d consecutive redirects!" % _MAX_REDIRECTS)
|
||||||
|
elif not self.options["auto_follow_redirects"]:
|
||||||
|
follow = input("Follow redirect to %s? (y/n) " % new_gi.url)
|
||||||
|
if follow.strip().lower() not in ("y", "yes"):
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
self.previous_redirectors.add(gi.url)
|
|
||||||
self._debug("Following redirect to %s." % new_gi.url)
|
self._debug("Following redirect to %s." % new_gi.url)
|
||||||
self._debug("This is consecutive redirect number %d." % len(self.previous_redirectors))
|
self._debug("This is consecutive redirect number %d." % len(self.previous_redirectors))
|
||||||
|
self.previous_redirectors.add(gi.url)
|
||||||
|
if status == "31":
|
||||||
|
# Permanent redirect
|
||||||
|
self.permanent_redirects[gi.url] = new_gi.url
|
||||||
self._go_to_gi(new_gi)
|
self._go_to_gi(new_gi)
|
||||||
return
|
return
|
||||||
# Errors
|
# Errors
|
||||||
|
|
Loading…
Reference in New Issue