gemini.git

going-flying.com gemini git repository

summary

tree

log

refs

7bdf74dfa94a0ce70da676c89bc0cc088379607a - Matthew Ernisse - 1599004345

new post

view tree

view raw

diff --git a/cgi-bin/rfc b/cgi-bin/rfc
index 137055a..ccea6e3 100755
--- a/cgi-bin/rfc
+++ b/cgi-bin/rfc
@@ -1,5 +1,31 @@
 #!/usr/bin/env python3
+''' rfc (c) 2020 Matthew J Ernisse <matt@going-flying.com>
+All Rights Reserved.
 
+Redistribution and use in source and binary forms,
+with or without modification, are permitted provided
+that the following conditions are met:
+
+    * Redistributions of source code must retain the
+      above copyright notice, this list of conditions
+      and the following disclaimer.
+    * Redistributions in binary form must reproduce
+      the above copyright notice, this list of conditions
+      and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+'''
 import os
 import re
 import requests
diff --git a/users/mernisse/articles/12.gmi b/users/mernisse/articles/12.gmi
new file mode 100644
index 0000000..dddcc9f
--- /dev/null
+++ b/users/mernisse/articles/12.gmi
@@ -0,0 +1,102 @@
+---
+Title: An RFC proxy
+Date: 9/1/2020 19:45
+
+Just a quick note.  I updated the post I wrote the other day wondering if
+the late adoption of IPv6 helped push adoption of the cloud-as-a-middleman
+use case to use a small proxy script I wrote.  The script proxies to the
+IETF's web site and fetches the plain text version of an RFC.  It seemed
+silly to make the reader refer to HTTPS urls of plain text documents
+while reading a Gemini document.
+
+=> /~mernisse/10.gmi	Did the slow adoption of IPv6 lead to the cloud?
+
+If you are interested you can retrieve any valid RFC from the IETF by
+simply passing the plain text file name to the script.  If you are interested
+the script is below.
+
+```
+#!/usr/bin/env python3
+''' rfc (c) 2020 Matthew J Ernisse <matt@going-flying.com>
+All Rights Reserved.
+
+Redistribution and use in source and binary forms,
+with or without modification, are permitted provided
+that the following conditions are met:
+
+    * Redistributions of source code must retain the
+      above copyright notice, this list of conditions
+      and the following disclaimer.
+    * Redistributions in binary form must reproduce
+      the above copyright notice, this list of conditions
+      and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+'''
+import os
+import re
+import requests
+import sys
+
+def check_requested_path():
+	''' Molly Brown sends us the rest of the requested url on stdin, so
+	read that and check to make sure it is a request for an RFC.
+	'''
+	rfc = os.environ.get('PATH_INFO')
+	if not rfc:
+		raise ValueError('No RFC requested.')
+
+	matches = re.search(r'^rfc\d+\.txt', rfc)
+	if not matches:
+		raise ValueError('Request must be a RFC text file.')
+
+	return rfc
+
+
+def get_rfc(rfc):
+	''' Return the text contents of an RFC. '''
+	resp = requests.get(
+		f'https://tools.ietf.org/rfc/{rfc}',
+		headers={
+			'User-Agent': 'gemini-rfc-proxy/matt@going-flying.com'
+		}
+	)
+
+	resp.raise_for_status()
+	return resp.text
+
+
+if __name__ == "__main__":
+	try:
+		rfc = check_requested_path()
+		body = get_rfc(rfc)
+	except ValueError as e:
+		print(f'59 {str(e)}\r\n')
+		sys.exit()
+
+	except requests.exceptions.HTTPError as e:
+		if e.errno == 404:
+			print(f'51 Not Found.\r\n')
+			sys.exit()
+
+		elif e.errno > 399 and e.errno < 500:
+			print(f'43 {e.strerror}\r\n')
+			sys.exit()
+		else:
+			print(f'53 {e.strerror}\r\n')
+			sys.exit()
+
+	print('20 text/plain\r\n')
+	print(body)
+```