Skip to content

http.server does not support HTTP range requests #86809

Open

Description

@AraHaan
mannequin
BPO 42643
Nosy @AraHaan, @sblondon, @DavidBord
PRs
  • gh-86809: Add support for HTTP range requests #24228
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = None
    created_at = <Date 2020-12-15.02:24:06.143>
    labels = ['type-feature', 'library', '3.9', '3.10']
    title = 'http.server does not support HTTP range requests'
    updated_at = <Date 2021-02-20.22:02:16.315>
    user = 'https://github.com/AraHaan'

    bugs.python.org fields:

    activity = <Date 2021-02-20.22:02:16.315>
    actor = 'DavidBord'
    assignee = 'none'
    closed = False
    closed_date = None
    closer = None
    components = ['Library (Lib)']
    creation = <Date 2020-12-15.02:24:06.143>
    creator = 'Decorater'
    dependencies = []
    files = []
    hgrepos = []
    issue_num = 42643
    keywords = ['patch']
    message_count = 4.0
    messages = ['383028', '383029', '383685', '387429']
    nosy_count = 3.0
    nosy_names = ['Decorater', 'sblondon', 'DavidBord']
    pr_nums = ['24228']
    priority = 'normal'
    resolution = None
    stage = 'patch review'
    status = 'open'
    superseder = None
    type = 'enhancement'
    url = 'https://bugs.python.org/issue42643'
    versions = ['Python 3.9', 'Python 3.10']

    Linked PRs

    Activity

    1. AraHaan commented on Dec 15, 2020

      AraHaanmannequin
      MannequinAuthor

      I have issues with range requests on http.server module (ran from python -m http.server command)

      When requesting files to download from an program written in C (which uses range requests to update an progress bar) it ignores this and simply forces download of the entire thing at once) which in turn on my program makes the progress bar never update to display the progress of the download to the user.

      https://tools.ietf.org/id/draft-ietf-httpbis-p5-range-09.html#range.units

      It is a part from HTTP/1.1, I think this would be something good to actually have to support partial requests (if they request an range in the header of their request), for directory listings (which can be used to download files from), it could be considered helpful it be able to request specific byte ranges inside of the files to download at a time to split up bandwidth to not overwhelm an file server.

    2. added
      stdlibStandard Library Python modules in the Lib/ directory
      type-featureA feature request or enhancement
      on Dec 15, 2020
    3. AraHaan commented on Dec 15, 2020

      AraHaanmannequin
      MannequinAuthor

      It seems there are some packages that supports the range requests too:

      https://github.com/danvk/RangeHTTPServer

      Not sure if that supports python 3 or not. It could be used to make a patch for http.server though.

    4. sblondon commented on Dec 24, 2020

      sblondonmannequin
      Mannequin

      RangeHTTPServer seems to support python3: there is a try-except clause to manage the different import of SimpleHTTPServer:
      https://github.com/danvk/RangeHTTPServer/blob/master/RangeHTTPServer/__main__.py#L13

      The code is under Apache 2.0 licence. I don't know if it can be integrated in codebase under the PSF licence.

      Another question needs to be answered previously: does the maintainers want to add such feature to SimpleHTTPServer (which goal is to be very basic)? They could prefer to add a header refusing the Range header:
      Accept-Ranges: none

      https://tools.ietf.org/id/draft-ietf-httpbis-p5-range-09.html#header.accept-ranges

    5. DavidBord commented on Feb 20, 2021

      DavidBordmannequin
      Mannequin

      I would appreciate a code review - thank you

    6. transferred this issue fromon Apr 10, 2022
    7. Le-Syl21 commented on Mar 3, 2023

      @Le-Syl21

      Hi,

      I've just install RangeHTTPServer to try but it's don't work as expected. it don't care about port anymore

      It don't use the new directory arguments from python3.

      The Range HTTP is need for PXE KickStart install https://access.redhat.com/solutions/1231383

      Redhat extract: If HTTP installation is used, confirm that the HTTP RANGE option is supported by the web server. Thehttpd package shipped by Red Hat supports it by default.

      I will try to fork this project to made a new one too make it work with improuvement...

    8. danvk commented on Mar 3, 2023

      @danvk

      I created RangeHTTPServer many years ago but can't remember the last time I used it. I'd be very happy if this functionality made it into SimpleHTTPServer and I could archive the repo.

    9. 11 remaining items

    10. ford-prefect commented on Jul 7, 2025

      @ford-prefect

      Would it make sense to return Accept-Ranges: none in the mean time?

    11. DrusTheAxe commented on Jul 20, 2025

      @DrusTheAxe

      Will this be addressed? Is there a target release or ETA?

    12. picnixz commented on Jul 20, 2025

      @picnixz
      Member

      I'm waiting for the PR to be updated and yes, it should be in 3.15. We have a few months for that.

    13. sakgoyal commented on Sep 24, 2025

      @sakgoyal
    14. sakgoyal commented on Sep 25, 2025

      @sakgoyal
      RANGE_RE = re.compile(r"bytes=(((\d+)?-(\d+)?)((?:, )((\d+)?-(\d+)?))*)$")
      
      def parse_range_header(test: str, fsize: int):
          """test: range header to parse, fsize: size of the file"""
          match = RANGE_RE.match(test)
          if not match:
              return None
      
          ranges = []
          range_specs: list[str] = match.group(1).split(', ')
          for spec in range_specs:
              splitted: list[str] = spec.split('-')
              if len(splitted) > 2:
                  return None
              start_str, end_str = splitted
              start = int(start_str) if start_str else None
              end = int(end_str) if end_str else None
              ranges.append((start, end))
          return ranges

      this is a much better regex to use.

      test cases available here:
      https://gist.github.com/sakgoyal/813339e39bd7b33338975976790f84d0

    15. vadimkantorov commented on Aug 9, 2026

      @vadimkantorov

      Also hit this when serving locally pmtiles map format which relies on range HTTP queries

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    No one assigned

      Labels

      stdlibStandard Library Python modules in the Lib/ directorytype-featureA feature request or enhancement

      Projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions