Skip to content

bpo-28707: Add the directory parameter to http.server.SimpleHTTPRequestHandler and http.server module #1776

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 24, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions Doc/library/http.server.rst
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ of which this module provides three different variants:
delays, it now always returns the IP address.


.. class:: SimpleHTTPRequestHandler(request, client_address, server)
.. class:: SimpleHTTPRequestHandler(request, client_address, server, directory=None)

This class serves files from the current directory and below, directly
mapping the directory structure to HTTP requests.
Expand All @@ -323,6 +323,10 @@ of which this module provides three different variants:
``application/octet-stream``. The mapping is used case-insensitively,
and so should contain only lower-cased keys.

.. attribute:: directory

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

The :class:`SimpleHTTPRequestHandler` class defines the following methods:

.. method:: do_HEAD()
Expand Down Expand Up @@ -397,6 +401,14 @@ following command causes the server to bind to localhost only::
.. versionadded:: 3.4
``--bind`` argument was introduced.

By default, server uses the current directory. The option ``-d/--directory``
specifies a directory to which it should serve the files. For example,
the following command uses a specific directory::

python -m http.server --directory /tmp/

.. versionadded:: 3.7
``--directory`` specify alternate directory

.. class:: CGIHTTPRequestHandler(request, client_address, server)

Expand Down Expand Up @@ -442,4 +454,3 @@ following command causes the server to bind to localhost only::
the ``--cgi`` option::

python -m http.server --cgi 8000

5 changes: 5 additions & 0 deletions Doc/whatsnew/3.7.rst
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,11 @@ If-Modified-Since header. The server returns the 304 response status if the
target file was not modified after the time specified in the header.
(Contributed by Pierre Quentel in :issue:`29654`.)

Add the parameter ``directory`` to the :class:`~http.server.SimpleHTTPRequestHandler`
and the ``--directory`` to the command line of the module :mod:`~http.server`.
With this parameter, the server serves the specified directory, by default it uses the current working directory.
(Contributed by Stéphane Wirtel and Julien Palard in :issue:`28707`.)

locale
------

Expand Down
15 changes: 13 additions & 2 deletions Lib/http/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@
import sys
import time
import urllib.parse
from functools import partial

from http import HTTPStatus

Expand Down Expand Up @@ -634,6 +635,12 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):

server_version = "SimpleHTTP/" + __version__

def __init__(self, *args, directory=None, **kwargs):
if directory is None:
directory = os.getcwd()
self.directory = directory
super().__init__(*args, **kwargs)

def do_GET(self):
"""Serve a GET request."""
f = self.send_head()
Expand Down Expand Up @@ -806,7 +813,7 @@ def translate_path(self, path):
path = posixpath.normpath(path)
words = path.split('/')
words = filter(None, words)
path = os.getcwd()
path = self.directory
for word in words:
if os.path.dirname(word) or word in (os.curdir, os.pardir):
# Ignore components that are not a simple file/directory name
Expand Down Expand Up @@ -1234,6 +1241,9 @@ def test(HandlerClass=BaseHTTPRequestHandler,
parser.add_argument('--bind', '-b', default='', metavar='ADDRESS',
help='Specify alternate bind address '
'[default: all interfaces]')
parser.add_argument('--directory', '-d', default=os.getcwd(),
help='Specify alternative directory '
'[default:current directory]')
parser.add_argument('port', action='store',
default=8000, type=int,
nargs='?',
Expand All @@ -1242,5 +1252,6 @@ def test(HandlerClass=BaseHTTPRequestHandler,
if args.cgi:
handler_class = CGIHTTPRequestHandler
else:
handler_class = SimpleHTTPRequestHandler
handler_class = partial(SimpleHTTPRequestHandler,
directory=args.directory)
test(HandlerClass=handler_class, port=args.port, bind=args.bind)
7 changes: 6 additions & 1 deletion Lib/test/test_httpservers.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import tempfile
import time
import datetime
from unittest import mock
from io import BytesIO

import unittest
Expand Down Expand Up @@ -782,7 +783,11 @@ def test_query_with_continuous_slashes(self):


class SocketlessRequestHandler(SimpleHTTPRequestHandler):
def __init__(self):
def __init__(self, *args, **kwargs):
request = mock.Mock()
request.makefile.return_value = BytesIO()
super().__init__(request, None, None)

self.get_called = False
self.protocol_version = "HTTP/1.1"

Expand Down