Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 781266e

Browse files
geryogamzware
authored andcommitted
bpo-35640: Allow passing PathLike arguments to SimpleHTTPRequestHandler (GH-11398)
1 parent e1d455f commit 781266e

4 files changed

Lines changed: 80 additions & 24 deletions

File tree

Doc/library/http.server.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,9 @@ provides three different variants:
344344

345345
If not specified, the directory to serve is the current working directory.
346346

347+
.. versionchanged:: 3.9
348+
Accepts a :term:`path-like object`.
349+
347350
The :class:`SimpleHTTPRequestHandler` class defines the following methods:
348351

349352
.. method:: do_HEAD()

Lib/http/server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,7 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
642642
def __init__(self, *args, directory=None, **kwargs):
643643
if directory is None:
644644
directory = os.getcwd()
645-
self.directory = directory
645+
self.directory = os.fspath(directory)
646646
super().__init__(*args, **kwargs)
647647

648648
def do_GET(self):

Lib/test/test_httpservers.py

Lines changed: 74 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import re
1515
import base64
1616
import ntpath
17+
import pathlib
1718
import shutil
1819
import email.message
1920
import email.utils
@@ -790,10 +791,10 @@ def test_query_with_continuous_slashes(self):
790791

791792

792793
class SocketlessRequestHandler(SimpleHTTPRequestHandler):
793-
def __init__(self, *args, **kwargs):
794+
def __init__(self, directory=None):
794795
request = mock.Mock()
795796
request.makefile.return_value = BytesIO()
796-
super().__init__(request, None, None)
797+
super().__init__(request, None, None, directory=directory)
797798

798799
self.get_called = False
799800
self.protocol_version = "HTTP/1.1"
@@ -1068,41 +1069,91 @@ def test_date_time_string(self):
10681069
class SimpleHTTPRequestHandlerTestCase(unittest.TestCase):
10691070
""" Test url parsing """
10701071
def setUp(self):
1071-
self.translated = os.getcwd()
1072-
self.translated = os.path.join(self.translated, 'filename')
1073-
self.handler = SocketlessRequestHandler()
1072+
self.translated_1 = os.path.join(os.getcwd(), 'filename')
1073+
self.translated_2 = os.path.join('foo', 'filename')
1074+
self.translated_3 = os.path.join('bar', 'filename')
1075+
self.handler_1 = SocketlessRequestHandler()
1076+
self.handler_2 = SocketlessRequestHandler(directory='foo')
1077+
self.handler_3 = SocketlessRequestHandler(directory=pathlib.PurePath('bar'))
10741078

10751079
def test_query_arguments(self):
1076-
path = self.handler.translate_path('/filename')
1077-
self.assertEqual(path, self.translated)
1078-
path = self.handler.translate_path('/filename?foo=bar')
1079-
self.assertEqual(path, self.translated)
1080-
path = self.handler.translate_path('/filename?a=b&spam=eggs#zot')
1081-
self.assertEqual(path, self.translated)
1080+
path = self.handler_1.translate_path('/filename')
1081+
self.assertEqual(path, self.translated_1)
1082+
path = self.handler_2.translate_path('/filename')
1083+
self.assertEqual(path, self.translated_2)
1084+
path = self.handler_3.translate_path('/filename')
1085+
self.assertEqual(path, self.translated_3)
1086+
1087+
path = self.handler_1.translate_path('/filename?foo=bar')
1088+
self.assertEqual(path, self.translated_1)
1089+
path = self.handler_2.translate_path('/filename?foo=bar')
1090+
self.assertEqual(path, self.translated_2)
1091+
path = self.handler_3.translate_path('/filename?foo=bar')
1092+
self.assertEqual(path, self.translated_3)
1093+
1094+
path = self.handler_1.translate_path('/filename?a=b&spam=eggs#zot')
1095+
self.assertEqual(path, self.translated_1)
1096+
path = self.handler_2.translate_path('/filename?a=b&spam=eggs#zot')
1097+
self.assertEqual(path, self.translated_2)
1098+
path = self.handler_3.translate_path('/filename?a=b&spam=eggs#zot')
1099+
self.assertEqual(path, self.translated_3)
10821100

10831101
def test_start_with_double_slash(self):
1084-
path = self.handler.translate_path('//filename')
1085-
self.assertEqual(path, self.translated)
1086-
path = self.handler.translate_path('//filename?foo=bar')
1087-
self.assertEqual(path, self.translated)
1102+
path = self.handler_1.translate_path('//filename')
1103+
self.assertEqual(path, self.translated_1)
1104+
path = self.handler_2.translate_path('//filename')
1105+
self.assertEqual(path, self.translated_2)
1106+
path = self.handler_3.translate_path('//filename')
1107+
self.assertEqual(path, self.translated_3)
1108+
1109+
path = self.handler_1.translate_path('//filename?foo=bar')
1110+
self.assertEqual(path, self.translated_1)
1111+
path = self.handler_2.translate_path('//filename?foo=bar')
1112+
self.assertEqual(path, self.translated_2)
1113+
path = self.handler_3.translate_path('//filename?foo=bar')
1114+
self.assertEqual(path, self.translated_3)
10881115

10891116
def test_windows_colon(self):
10901117
with support.swap_attr(server.os, 'path', ntpath):
1091-
path = self.handler.translate_path('c:c:c:foo/filename')
1118+
path = self.handler_1.translate_path('c:c:c:foo/filename')
1119+
path = path.replace(ntpath.sep, os.sep)
1120+
self.assertEqual(path, self.translated_1)
1121+
path = self.handler_2.translate_path('c:c:c:foo/filename')
1122+
path = path.replace(ntpath.sep, os.sep)
1123+
self.assertEqual(path, self.translated_2)
1124+
path = self.handler_3.translate_path('c:c:c:foo/filename')
10921125
path = path.replace(ntpath.sep, os.sep)
1093-
self.assertEqual(path, self.translated)
1126+
self.assertEqual(path, self.translated_3)
10941127

1095-
path = self.handler.translate_path('\\c:../filename')
1128+
path = self.handler_1.translate_path('\\c:../filename')
1129+
path = path.replace(ntpath.sep, os.sep)
1130+
self.assertEqual(path, self.translated_1)
1131+
path = self.handler_2.translate_path('\\c:../filename')
1132+
path = path.replace(ntpath.sep, os.sep)
1133+
self.assertEqual(path, self.translated_2)
1134+
path = self.handler_3.translate_path('\\c:../filename')
10961135
path = path.replace(ntpath.sep, os.sep)
1097-
self.assertEqual(path, self.translated)
1136+
self.assertEqual(path, self.translated_3)
10981137

1099-
path = self.handler.translate_path('c:\\c:..\\foo/filename')
1138+
path = self.handler_1.translate_path('c:\\c:..\\foo/filename')
11001139
path = path.replace(ntpath.sep, os.sep)
1101-
self.assertEqual(path, self.translated)
1140+
self.assertEqual(path, self.translated_1)
1141+
path = self.handler_2.translate_path('c:\\c:..\\foo/filename')
1142+
path = path.replace(ntpath.sep, os.sep)
1143+
self.assertEqual(path, self.translated_2)
1144+
path = self.handler_3.translate_path('c:\\c:..\\foo/filename')
1145+
path = path.replace(ntpath.sep, os.sep)
1146+
self.assertEqual(path, self.translated_3)
11021147

1103-
path = self.handler.translate_path('c:c:foo\\c:c:bar/filename')
1148+
path = self.handler_1.translate_path('c:c:foo\\c:c:bar/filename')
1149+
path = path.replace(ntpath.sep, os.sep)
1150+
self.assertEqual(path, self.translated_1)
1151+
path = self.handler_2.translate_path('c:c:foo\\c:c:bar/filename')
1152+
path = path.replace(ntpath.sep, os.sep)
1153+
self.assertEqual(path, self.translated_2)
1154+
path = self.handler_3.translate_path('c:c:foo\\c:c:bar/filename')
11041155
path = path.replace(ntpath.sep, os.sep)
1105-
self.assertEqual(path, self.translated)
1156+
self.assertEqual(path, self.translated_3)
11061157

11071158

11081159
class MiscTestCase(unittest.TestCase):
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Allow passing a :term:`path-like object` as ``directory`` argument to the
2+
:class:`http.server.SimpleHTTPRequestHandler` class. Patch by Géry Ogam.

0 commit comments

Comments
 (0)