Skip to content

Commit cf5f29f

Browse files
Merge pull request #15 from michael-lazar/update_dependencies
Update dependencies
2 parents 6f1efbc + d3776ba commit cf5f29f

File tree

7 files changed

+44
-39
lines changed

7 files changed

+44
-39
lines changed

.github/workflows/test.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ jobs:
1313
fail-fast: false
1414
matrix:
1515
python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"]
16+
flask-version: ["2.1", "2.2"]
1617
os: [ubuntu-latest]
1718
steps:
1819
- name: Check out repository
@@ -23,7 +24,7 @@ jobs:
2324
python-version: ${{ matrix.python-version }}
2425
- name: Install packages
2526
run: |
26-
pip install .
27+
pip install . Flask==${{ matrix.flask-version}}
2728
pip install .[test]
2829
- name: Run mypy
2930
run: |

CHANGELOG.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
## v3.0.0 (unreleased)
22

3-
This version removes the ability to establish TLS connections
4-
over gopher. The code for this was particularly annoying to
5-
monkey-patch, and the feature never gained significant adoption
6-
beyond a proof-of-concept.
7-
8-
- Added support for python 3.9, 3.10, 3.11.
9-
- Dropped support for python 3.5, 3.6.
10-
- Migrated build from travis.ci to github actions.
3+
This version pulls in some long overdue dependency updates and adds
4+
support for the latest versions of Flask and Python.
5+
6+
- Supported Python versions: `3.7`, `3.8`, `3.9`, `3.10`, `3.11`.
7+
- Supported Flask versions: `2.1`, `2.2`
8+
9+
This version also removes the capability to negotiate TLS over
10+
gopher. The code for this was particularly annoying to monkey-patch,
11+
and the feature never gained traction to make it worth maintaining.
12+
1113
- Removed the `make_gopher_ssl_server` function.
1214
- Removed the following WSGI server classes:
1315
- ``GopherBaseWSGIServer``

demo/run_server.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ def demo_form(field):
158158

159159
# Check if there was a new field added to the request
160160
request_query = request.args.to_dict()
161+
161162
if field in form_fields:
162163
request_query[field] = request.environ["SEARCH_TEXT"]
163164

@@ -167,7 +168,7 @@ def demo_form(field):
167168
if name in request_query:
168169
lines.append(f"{description:<13}: {request_query[name]}")
169170
else:
170-
url = url_for("demo_form", field=name, **request_query)
171+
url = url_for("demo_form", _external=False, field=name, **request_query)
171172
lines.append(gopher.menu.query(f"{description:<13}:", url))
172173

173174
# Add the buttons at the bottom of the form
@@ -177,7 +178,7 @@ def demo_form(field):
177178
else:
178179
lines.append("clear")
179180
if request_query.keys() == form_fields.keys():
180-
url = url_for("demo_form", field="submit", **request_query)
181+
url = url_for("demo_form", _external=False, field="submit", **request_query)
181182
lines.append(gopher.menu.dir("submit", url))
182183
else:
183184
lines.append("submit")

demo/templates/index.gopher

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ This page's source code is open source and available for download at:
2424
{{ menu.dir('Directory Listings', url_for('demo_directory')) }}
2525
{{ menu.dir('Interactive Forms', url_for('demo_form')) }}
2626
{{ menu.dir('Client Sessions', url_for('demo_session')) }}
27-
{{ menu.dir('SSL Encryption', url_for('demo_ssl')) }}
2827
{{ menu.dir('Server Environment', url_for('demo_environ')) }}
2928

3029
{% endblock %}

flask_gopher/flask_gopher.py

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from __future__ import annotations
2+
13
import mimetypes
24
import os
35
import re
@@ -12,29 +14,32 @@
1214
from typing import cast
1315
from urllib.parse import parse_qs, urlencode, urlsplit, urlunsplit
1416

15-
from flask import _request_ctx_stack as request_ctx_stack # noqa
16-
from flask import current_app, render_template, request, url_for
17-
from flask.helpers import safe_join, send_file
17+
from flask import current_app, g, render_template, request, url_for
18+
from flask.helpers import send_file
1819
from flask.sessions import SecureCookieSession, SecureCookieSessionInterface
1920
from itsdangerous import BadSignature, URLSafeSerializer
2021
from jinja2.filters import escape
2122
from pyfiglet import FigletError, figlet_format
2223
from tabulate import tabulate
23-
from werkzeug.exceptions import BadRequest, HTTPException
24+
from werkzeug.exceptions import HTTPException, NotFound
2425
from werkzeug.local import LocalProxy
25-
from werkzeug.serving import BaseWSGIServer, WSGIRequestHandler
26+
from werkzeug.security import safe_join
27+
from werkzeug.serving import WSGIRequestHandler
2628

2729
from .__version__ import __version__
2830

2931

3032
@LocalProxy
31-
def menu():
33+
def _menu():
3234
"""
3335
Shortcut for gopher.menu
3436
"""
3537
return current_app.extensions["gopher"].menu
3638

3739

40+
menu = cast("GopherMenu", _menu)
41+
42+
3843
def render_menu(*lines):
3944
"""
4045
Shortcut for gopher.render_menu
@@ -481,13 +486,11 @@ def menu(self):
481486
initialized with the same host/port that the request's url_adapter is
482487
using.
483488
"""
484-
ctx = request_ctx_stack.top
485-
if ctx is not None:
486-
if not hasattr(ctx, "gopher_menu"):
487-
host = request.environ["SERVER_NAME"]
488-
port = request.environ["SERVER_PORT"]
489-
ctx.gopher_menu = self.menu_class(host, port)
490-
return ctx.gopher_menu
489+
if not hasattr(g, "_flask_gopher_menu"):
490+
host = request.environ["SERVER_NAME"]
491+
port = request.environ["SERVER_PORT"]
492+
g._flask_gopher_menu = self.menu_class(host, port)
493+
return g._flask_gopher_menu
491494

492495
def render_menu(self, *lines):
493496
"""
@@ -584,11 +587,13 @@ def url_for(endpoint, _external=False, _type=1, **values):
584587
if not _external:
585588
return url_for(endpoint, **values)
586589

587-
values["_scheme"] = "gopher"
588-
url = url_for(endpoint, _external=_external, **values)
589-
parts = url.split("/")
590-
parts.insert(3, str(_type))
591-
url = "/".join(parts)
590+
url = url_for(endpoint, _external=True, **values)
591+
if request.scheme == "gopher":
592+
scheme, rest = url.split(":", maxsplit=1)
593+
url = f"gopher:{rest}"
594+
parts = url.split("/")
595+
parts.insert(3, str(_type))
596+
url = "/".join(parts)
592597
return url
593598

594599

@@ -678,8 +683,7 @@ def make_environ(self):
678683
# header or the SERVER_NAME env variable to match it.
679684
# Go look at werkzeug.routing.Map.bind_to_environ()
680685
try:
681-
server = cast(BaseWSGIServer, self.server)
682-
server_name = server.app.config.get("SERVER_NAME")
686+
server_name = self.server.app.config.get("SERVER_NAME") # type: ignore
683687
except Exception:
684688
pass
685689
else:
@@ -780,6 +784,9 @@ def load_file(self, filename):
780784
can only be invoked from inside of a flask view.
781785
"""
782786
abs_filename = safe_join(self.local_directory, filename)
787+
if abs_filename is None:
788+
raise NotFound()
789+
783790
if not os.path.isabs(abs_filename):
784791
abs_filename = os.path.join(current_app.root_path, abs_filename)
785792

@@ -789,7 +796,7 @@ def load_file(self, filename):
789796
data = self._parse_directory(filename, abs_filename)
790797
return self.result_class(True, data)
791798
else:
792-
raise BadRequest()
799+
raise NotFound()
793800

794801
def _parse_directory(self, folder, abs_folder):
795802
"""

setup.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,11 @@ def long_description():
3131
include_package_data=True,
3232
platforms="any",
3333
install_requires=[
34-
"Flask>=0.11",
34+
"Flask>=2.1",
3535
# pyfiglet v0.8.0 removes a bunch of fonts due to licensing issues :(
3636
"pyfiglet<=0.7.6",
3737
"tabulate",
3838
"pyopenssl",
39-
# https://github.com/michael-lazar/flask-gopher/issues/9
40-
"werkzeug<1.0.0",
41-
# https://stackoverflow.com/questions/72191560
42-
"markupsafe==2.0.1",
4339
],
4440
extras_require={
4541
"test": [

tests/test_flask_gopher.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,6 @@ def test_http_get(self):
283283
self.assertEqual(resp.status, 200)
284284
self.assertIn("Content-Type", resp.headers)
285285
self.assertIn("Content-Length", resp.headers)
286-
self.assertTrue(resp.headers["Server"].startswith("Flask-Gopher"))
287286
self.assertEqual(resp.read(), b"Hello World!")
288287

289288
def test_render_menu(self):

0 commit comments

Comments
 (0)