aboutsummaryrefslogtreecommitdiff
path: root/src/net/http
diff options
context:
space:
mode:
authorEmmanuel Odeke <odeke@ualberta.ca>2015-11-16 20:24:58 -0700
committerBrad Fitzpatrick <bradfitz@golang.org>2015-11-17 18:00:15 +0000
commit8b1152a599ea6d5f0515bcec3c5131445cc87f5c (patch)
tree252b3444b75dec2aace5cd6f310324186d4d9032 /src/net/http
parentce8f49f42ff98a87a6766aa50efa0449c4525ce3 (diff)
downloadgo-8b1152a599ea6d5f0515bcec3c5131445cc87f5c.tar.xz
net/http: add/update mp4 sniffing
Completes sniffing for mp4 signature according to the spec at: https://mimesniff.spec.whatwg.org/#signature-for-mp4 Clause 6.2.1 Fixes #8773 Change-Id: Icfc4a23324ae249db52c94a21c0e8509e1833e19 Reviewed-on: https://go-review.googlesource.com/16951 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/net/http')
-rw-r--r--src/net/http/sniff.go27
-rw-r--r--src/net/http/sniff_test.go4
2 files changed, 10 insertions, 21 deletions
diff --git a/src/net/http/sniff.go b/src/net/http/sniff.go
index 3602969031..18810bad06 100644
--- a/src/net/http/sniff.go
+++ b/src/net/http/sniff.go
@@ -102,10 +102,9 @@ var sniffSignatures = []sniffSig{
&exactSig{[]byte("\x50\x4B\x03\x04"), "application/zip"},
&exactSig{[]byte("\x1F\x8B\x08"), "application/x-gzip"},
- // TODO(dsymonds): Re-enable this when the spec is sorted w.r.t. MP4.
- //mp4Sig(0),
+ mp4Sig{},
- textSig(0), // should be last
+ textSig{}, // should be last
}
type exactSig struct {
@@ -166,12 +165,14 @@ func (h htmlSig) match(data []byte, firstNonWS int) string {
}
var mp4ftype = []byte("ftyp")
+var mp4 = []byte("mp4")
-type mp4Sig int
+type mp4Sig struct{}
func (mp4Sig) match(data []byte, firstNonWS int) string {
- // c.f. section 6.1.
- if len(data) < 8 {
+ // https://mimesniff.spec.whatwg.org/#signature-for-mp4
+ // c.f. section 6.2.1
+ if len(data) < 12 {
return ""
}
boxSize := int(binary.BigEndian.Uint32(data[:4]))
@@ -186,24 +187,14 @@ func (mp4Sig) match(data []byte, firstNonWS int) string {
// minor version number
continue
}
- seg := string(data[st : st+3])
- switch seg {
- case "mp4", "iso", "M4V", "M4P", "M4B":
+ if bytes.Equal(data[st:st+3], mp4) {
return "video/mp4"
- /* The remainder are not in the spec.
- case "M4A":
- return "audio/mp4"
- case "3gp":
- return "video/3gpp"
- case "jp2":
- return "image/jp2" // JPEG 2000
- */
}
}
return ""
}
-type textSig int
+type textSig struct{}
func (textSig) match(data []byte, firstNonWS int) string {
// c.f. section 5, step 4.
diff --git a/src/net/http/sniff_test.go b/src/net/http/sniff_test.go
index 24ca27afc1..f04b59040f 100644
--- a/src/net/http/sniff_test.go
+++ b/src/net/http/sniff_test.go
@@ -40,9 +40,7 @@ var sniffTests = []struct {
{"GIF 87a", []byte(`GIF87a`), "image/gif"},
{"GIF 89a", []byte(`GIF89a...`), "image/gif"},
- // TODO(dsymonds): Re-enable this when the spec is sorted w.r.t. MP4.
- //{"MP4 video", []byte("\x00\x00\x00\x18ftypmp42\x00\x00\x00\x00mp42isom<\x06t\xbfmdat"), "video/mp4"},
- //{"MP4 audio", []byte("\x00\x00\x00\x20ftypM4A \x00\x00\x00\x00M4A mp42isom\x00\x00\x00\x00"), "audio/mp4"},
+ {"MP4 video", []byte("\x00\x00\x00\x18ftypmp42\x00\x00\x00\x00mp42isom<\x06t\xbfmdat"), "video/mp4"},
}
func TestDetectContentType(t *testing.T) {