http2/hpack: move initialization to a static table
This shrinks a binary that just does an http.ListenAndServe by about
90kb due to using less code for the static array.
syms
delta name old-size new-size pct-difference
-54206 vendor/golang_org/x/net/http2/hpack.newStaticTable 55233 1027 -98.14%
-4744 runtime.pclntab 1041055 1036311 -0.46%
-204 runtime.findfunctab 10675 10471 -1.91%
8 runtime.typelink 9852 9860 0.08%
41 runtime.gcbss 869 910 4.72%
11711 vendor/golang_org/x/net/http2/hpack.init 572 12283 2047.38%
sections
delta name old-size new-size pct-difference
-41888 .text 2185840 2143952 -1.92%
-37644 .rodata 842131 804487 -4.47%
-4744 .gopclntab 1041055 1036311 -0.46%
-3343 .debug_info 981995 978652 -0.34%
-2931 .debug_line 291295 288364 -1.01%
8 .typelink 9852 9860 0.08%
59 .debug_pubnames 81986 82045 0.07%
96 .symtab 186312 186408 0.05%
113 .debug_pubtypes 137500 137613 0.08%
128 .debug_frame 219140 219268 0.06%
220 .strtab 217109 217329 0.10%
2464 .bss 127752 130216 1.93%
Updates golang/go#6853
Change-Id: I3383e63300585539507b75faac1072264d8f37e7
Reviewed-on: https://go-review.googlesource.com/43090
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/http2/hpack/tables.go b/http2/hpack/tables.go
index 31bd5a5..5d7f635 100644
--- a/http2/hpack/tables.go
+++ b/http2/hpack/tables.go
@@ -131,71 +131,76 @@
// http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-07#appendix-B
var staticTable = newStaticTable()
+var staticTableEntries = [...]HeaderField{
+ pair(":authority", ""),
+ pair(":method", "GET"),
+ pair(":method", "POST"),
+ pair(":path", "/"),
+ pair(":path", "/index.html"),
+ pair(":scheme", "http"),
+ pair(":scheme", "https"),
+ pair(":status", "200"),
+ pair(":status", "204"),
+ pair(":status", "206"),
+ pair(":status", "304"),
+ pair(":status", "400"),
+ pair(":status", "404"),
+ pair(":status", "500"),
+ pair("accept-charset", ""),
+ pair("accept-encoding", "gzip, deflate"),
+ pair("accept-language", ""),
+ pair("accept-ranges", ""),
+ pair("accept", ""),
+ pair("access-control-allow-origin", ""),
+ pair("age", ""),
+ pair("allow", ""),
+ pair("authorization", ""),
+ pair("cache-control", ""),
+ pair("content-disposition", ""),
+ pair("content-encoding", ""),
+ pair("content-language", ""),
+ pair("content-length", ""),
+ pair("content-location", ""),
+ pair("content-range", ""),
+ pair("content-type", ""),
+ pair("cookie", ""),
+ pair("date", ""),
+ pair("etag", ""),
+ pair("expect", ""),
+ pair("expires", ""),
+ pair("from", ""),
+ pair("host", ""),
+ pair("if-match", ""),
+ pair("if-modified-since", ""),
+ pair("if-none-match", ""),
+ pair("if-range", ""),
+ pair("if-unmodified-since", ""),
+ pair("last-modified", ""),
+ pair("link", ""),
+ pair("location", ""),
+ pair("max-forwards", ""),
+ pair("proxy-authenticate", ""),
+ pair("proxy-authorization", ""),
+ pair("range", ""),
+ pair("referer", ""),
+ pair("refresh", ""),
+ pair("retry-after", ""),
+ pair("server", ""),
+ pair("set-cookie", ""),
+ pair("strict-transport-security", ""),
+ pair("transfer-encoding", ""),
+ pair("user-agent", ""),
+ pair("vary", ""),
+ pair("via", ""),
+ pair("www-authenticate", ""),
+}
func newStaticTable() *headerFieldTable {
t := &headerFieldTable{}
t.init()
- t.addEntry(pair(":authority", ""))
- t.addEntry(pair(":method", "GET"))
- t.addEntry(pair(":method", "POST"))
- t.addEntry(pair(":path", "/"))
- t.addEntry(pair(":path", "/index.html"))
- t.addEntry(pair(":scheme", "http"))
- t.addEntry(pair(":scheme", "https"))
- t.addEntry(pair(":status", "200"))
- t.addEntry(pair(":status", "204"))
- t.addEntry(pair(":status", "206"))
- t.addEntry(pair(":status", "304"))
- t.addEntry(pair(":status", "400"))
- t.addEntry(pair(":status", "404"))
- t.addEntry(pair(":status", "500"))
- t.addEntry(pair("accept-charset", ""))
- t.addEntry(pair("accept-encoding", "gzip, deflate"))
- t.addEntry(pair("accept-language", ""))
- t.addEntry(pair("accept-ranges", ""))
- t.addEntry(pair("accept", ""))
- t.addEntry(pair("access-control-allow-origin", ""))
- t.addEntry(pair("age", ""))
- t.addEntry(pair("allow", ""))
- t.addEntry(pair("authorization", ""))
- t.addEntry(pair("cache-control", ""))
- t.addEntry(pair("content-disposition", ""))
- t.addEntry(pair("content-encoding", ""))
- t.addEntry(pair("content-language", ""))
- t.addEntry(pair("content-length", ""))
- t.addEntry(pair("content-location", ""))
- t.addEntry(pair("content-range", ""))
- t.addEntry(pair("content-type", ""))
- t.addEntry(pair("cookie", ""))
- t.addEntry(pair("date", ""))
- t.addEntry(pair("etag", ""))
- t.addEntry(pair("expect", ""))
- t.addEntry(pair("expires", ""))
- t.addEntry(pair("from", ""))
- t.addEntry(pair("host", ""))
- t.addEntry(pair("if-match", ""))
- t.addEntry(pair("if-modified-since", ""))
- t.addEntry(pair("if-none-match", ""))
- t.addEntry(pair("if-range", ""))
- t.addEntry(pair("if-unmodified-since", ""))
- t.addEntry(pair("last-modified", ""))
- t.addEntry(pair("link", ""))
- t.addEntry(pair("location", ""))
- t.addEntry(pair("max-forwards", ""))
- t.addEntry(pair("proxy-authenticate", ""))
- t.addEntry(pair("proxy-authorization", ""))
- t.addEntry(pair("range", ""))
- t.addEntry(pair("referer", ""))
- t.addEntry(pair("refresh", ""))
- t.addEntry(pair("retry-after", ""))
- t.addEntry(pair("server", ""))
- t.addEntry(pair("set-cookie", ""))
- t.addEntry(pair("strict-transport-security", ""))
- t.addEntry(pair("transfer-encoding", ""))
- t.addEntry(pair("user-agent", ""))
- t.addEntry(pair("vary", ""))
- t.addEntry(pair("via", ""))
- t.addEntry(pair("www-authenticate", ""))
+ for _, e := range staticTableEntries[:] {
+ t.addEntry(e)
+ }
return t
}