http/2 is stricter than http/1.1

I am starting to read the draft http/2 spec and realized its quite strict and leaves little to interpreter’s imagination.

Here are the wordcounts for various specs for following words : MUST, REQUIRED, SHALL, SHOULD, RECOMMENDED, MAY, OPTIONAL

RFC Total MUST SHOULD MAY SHALL REQUIRED RECOMMENDED OPTIONAL
rfc2616 (http/1.1) 799 348 (43.55%) 256 (32.04%) 180 (22.53%) 2 5 1 7
rfc723[0-5] (superseeds rfc2616) 668 344 (51.50%) 163 (24.40%) 126 (18.86%) 12 6 7 10
http2-17 (http/2) 296 219 (73.99%) 31 (10.47%) 41 (13.65%) 2 1 1 1

To be fair… http/2 spec does not divulge into header behavior, caching, etc. SHALL, REQUIRED, RECOMMENDED and OPTIONAL were only found in the section defining the keywords.

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in RFC 2119 [RFC2119].

I did not include HTTP/1 for this comparison because the spec does not seem to use upper cased keywords.

Quick and dirty python script to do the word counts.

<pre><code>import re
from httplib2 import Http
from collections import defaultdict

h = Http()

WORDS = ["MUST", "REQUIRED", "SHALL",
   "SHOULD", "RECOMMENDED", "MAY", "OPTIONAL"]

def get_counts(string, counts):
    for w in re.split('\W', string):
        if w:
            for W in WORDS:
                if W == w:
                    counts[w] += 1
    return counts


def count_url(url, counts):
    r,c = h.request(url)
    return get_counts(c, counts)

def summarize(counts):
    total = 0
    for k in counts.keys():
        total += counts[k]
    counts = dict(counts)
    counts["total"] = total
    counts["mustpct"] = counts["MUST"] * 100.0 / total
    counts["shouldpct"] = counts["SHOULD"] * 100.0 / total
    counts["maypct"] = counts["MAY"] * 100.0 / total
    return counts


if __name__ == "__main__":
    print "rfc2616" , summarize(count_url("http://tools.ietf.org/html/rfc2616", defaultdict(int)))
    counts = count_url("https://tools.ietf.org/html/rfc7230", defaultdict(int))
    counts = count_url("https://tools.ietf.org/html/rfc7231", counts)
    counts = count_url("https://tools.ietf.org/html/rfc7232", counts)
    counts = count_url("https://tools.ietf.org/html/rfc7233", counts)
    counts = count_url("https://tools.ietf.org/html/rfc7234", counts)
    counts = count_url("https://tools.ietf.org/html/rfc7235", counts)
    print "rfc723[0-5]", summarize(counts)
    print "draft-ietf-httpbis-http2-17", summarize(count_url("https://tools.ietf.org/id/draft-ietf-httpbis-http2-17.txt", defaultdict(int)))
</code></pre>
Tags:
Categories: