]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: add/update mp4 sniffing
authorEmmanuel Odeke <odeke@ualberta.ca>
Tue, 17 Nov 2015 03:24:58 +0000 (20:24 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 17 Nov 2015 18:00:15 +0000 (18:00 +0000)
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>

src/net/http/sniff.go
src/net/http/sniff_test.go

index 360296903118b529c5e75ccb7c6ddb807fbc2ef4..18810bad068a2c6244777f93be904fe4fc27c87b 100644 (file)
@@ -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.
index 24ca27afc16745c82362cfa7ea6a46e84ea5a72a..f04b59040fc620943ae681b7481adc89cdcd2bda 100644 (file)
@@ -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) {