Skip to main content

Parse and format HTTP dates, such as Last-Modified and If-Modified-Since headers.

Project description

httpdate

PyPi Version License Continuous Integration Code Coverage Python Versions


httpdate is a Python library for parsing and formatting HTTP date fields that are used in headers like Last-Modified and If-Modified-Since. It does so in strict accordance with RFC 9110 Section 5.6.7.

It has only one dependency, which is my tiny leapseconds library that just provides a tuple of official leap seconds.

HTTP date formats

All HTTP dates (eg, in Last-Modified headers) must be sent in this format:

# IMF-fixdate
Sun, 06 Nov 1994 08:49:37 GMT

However, RFC 9110 states that recipients must also accept two other obsolete formats:

# rfc850-date
Sunday, 06-Nov-94 08:49:37 GMT

# asctime-date
Sun Nov  6 08:49:37 1994

RFC 9110 criteria for the HTTP date field includes the following:

  • It must represent time as an instance of UTC.
  • It must represent weekday names and month names in English.
  • It is case-sensitive.
  • It must not have any additional whitespace.
  • It must be semantically correct (eg, the weekday must be the correct weekday).
  • It can include leap seconds (eg, 23:59:60).
  • It must represent a year of 1900 or above.

It isn't stated explicitly in the RFCs, but httpdate will only consider a leap second semantically correct if it's an official leap second.

Installation

pip install httpdate

Usage

from httpdate import is_valid_httpdate, httpdate_to_unixtime, unixtime_to_httpdate

# Check if an HTTP date (eg, `Last-Modified` header) is valid:
is_valid_httpdate("Sun, 06 Nov 1994 08:49:37 GMT")

try:
    # Parse an HTTP date:
    httpdate_to_unixtime("Sun, 06 Nov 1994 08:49:37 GMT")
    # Parse an HTTP date (rfc850-date):
    httpdate_to_unixtime("Sunday, 06-Nov-94 08:49:37 GMT")
    # Parse an HTTP date (asctime-date):
    httpdate_to_unixtime("Sun Nov  6 08:49:37 1994")
except ValueError:
    # Not a valid HTTP date string.
    pass

# Format a Unix timestamp as an HTTP date:
try:
    unixtime_to_httpdate(784111777)
except ValueError:
    # Outside the range supported by the operating system.
    pass
  • is_valid_httpdate(httpdate):
    • Args
      • httpdate (str): An HTTP date string.
    • Returns
      • bool: True if httpdate is a valid HTTP date string, otherwise False.
    • Raises
      • TypeError if input is not of type str.
  • httpdate_to_unixtime(httpdate):
    • Args
      • httpdate (str): An HTTP date string.
    • Returns
      • int: A Unix timestamp (int) if input is valid.
    • Raises
      • TypeError if input is not of type str.
      • ValueError if httpdate is not a valid HTTP date string.
  • unixtime_to_httpdate(unixtime):
    • Args
      • unixtime (int): A Unix timestamp.
    • Returns
      • str: An HTTP date string.
    • Raises
      • TypeError if input is not of type int.
      • ValueError if unixtime represents a year before 1900, or if it is outside the range supported by the operating system.

Why Unix timestamps?

Unix timestamps are unambiguous, efficient, and can easily be converted to other date-time formats using only the standard library.

When a Last-Modified header is semantically correct, this conversion — from string to Unix timestamp and back to string — is lossless. (The only exception is leap seconds; for example Sat, 31 Dec 2016 23:59:60 GMT would be returned as Sun, 01 Jan 2017 00:00:00 GMT. Recipients should interpret these as being identical anyway.)

If you want to store the original string instead, just use is_valid_httpdate() to validate before storing.

License

httpdate is distributed under the terms of the MIT license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

httpdate-1.1.0.tar.gz (13.9 kB view details)

Uploaded Source

Built Distribution

httpdate-1.1.0-py3-none-any.whl (9.0 kB view details)

Uploaded Python 3

File details

Details for the file httpdate-1.1.0.tar.gz.

File metadata

  • Download URL: httpdate-1.1.0.tar.gz
  • Upload date:
  • Size: 13.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.2

File hashes

Hashes for httpdate-1.1.0.tar.gz
Algorithm Hash digest
SHA256 afdf8c2d9cf941cb1a01e8d10138aef1e39ad9b6bc63d869c18b9bb0ccc9b63b
MD5 8d1068c781750e4bc103aba9dd709240
BLAKE2b-256 fb042b616e38151a10346f7991b5efb94ea42d275d64970eb97c5a761cf36e71

See more details on using hashes here.

File details

Details for the file httpdate-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: httpdate-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 9.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.2

File hashes

Hashes for httpdate-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 38187651126f762a630bb28a51973a6bfba9aa81f9f0e6b0fbe2552b476d61dc
MD5 a7f2bf0eea3d264234ce88ed0bb07381
BLAKE2b-256 450e8c71aa9c11c22042121719ebc7d28fd13627e0aaebeb2d089e19bd8e7580

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page