diff options
author | Michael Hoisie <hoisie@gmail.com> | 2010-02-09 20:47:45 -0800 |
---|---|---|
committer | Michael Hoisie <hoisie@gmail.com> | 2010-02-09 20:47:45 -0800 |
commit | 25066ce98bab56fa229b482e550ec8f465fd49a1 (patch) | |
tree | 86487858ee2d58fbab0193f610b26ddec4def5ad /src/pkg/mime | |
parent | df8959cc5eb078adbafd8e4b8bf088e9c296d4ec (diff) | |
download | golang-25066ce98bab56fa229b482e550ec8f465fd49a1.tar.gz |
mime: new package, use in http
R=rsc
CC=golang-dev
http://codereview.appspot.com/186160
Committer: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/pkg/mime')
-rw-r--r-- | src/pkg/mime/Makefile | 11 | ||||
-rw-r--r-- | src/pkg/mime/mime_test.go | 27 | ||||
-rw-r--r-- | src/pkg/mime/test.types | 8 | ||||
-rw-r--r-- | src/pkg/mime/type.go | 83 |
4 files changed, 129 insertions, 0 deletions
diff --git a/src/pkg/mime/Makefile b/src/pkg/mime/Makefile new file mode 100644 index 000000000..57fc7db44 --- /dev/null +++ b/src/pkg/mime/Makefile @@ -0,0 +1,11 @@ +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +include ../../Make.$(GOARCH) + +TARG=mime +GOFILES=\ + type.go\ + +include ../../Make.pkg diff --git a/src/pkg/mime/mime_test.go b/src/pkg/mime/mime_test.go new file mode 100644 index 000000000..24c54e0e8 --- /dev/null +++ b/src/pkg/mime/mime_test.go @@ -0,0 +1,27 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Tests for type.go + +package mime + +import "testing" + +var typeTests = map[string]string{ + ".t1": "application/test", + ".t2": "text/test; charset=utf-8", + ".png": "image/png", +} + +func TestType(t *testing.T) { + typeFiles = []string{"test.types"} + + for ext, want := range typeTests { + val := TypeByExtension(ext) + if val != want { + t.Errorf("TypeByExtension(%q) = %q, want %q", ext, val, want) + } + + } +} diff --git a/src/pkg/mime/test.types b/src/pkg/mime/test.types new file mode 100644 index 000000000..9b040edd7 --- /dev/null +++ b/src/pkg/mime/test.types @@ -0,0 +1,8 @@ +# Copyright 2010 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + + + # mime package test +application/test t1 # Simple test +text/test t2 # Text test diff --git a/src/pkg/mime/type.go b/src/pkg/mime/type.go new file mode 100644 index 000000000..7024417cb --- /dev/null +++ b/src/pkg/mime/type.go @@ -0,0 +1,83 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// The mime package translates file name extensions to MIME types. +// It consults the local system's mime.types file, which must be installed +// under one of these names: +// +// /etc/mime.types +// /etc/apache2/mime.types +// /etc/apache/mime.types +// +package mime + +import ( + "bufio" + "once" + "os" + "strings" +) + +var typeFiles = []string{ + "/etc/mime.types", + "/etc/apache2/mime.types", + "/etc/apache/mime.types", +} + +var mimeTypes = map[string]string{ + ".css": "text/css", + ".gif": "image/gif", + ".htm": "text/html; charset=utf-8", + ".html": "text/html; charset=utf-8", + ".jpg": "image/jpeg", + ".js": "application/x-javascript", + ".pdf": "application/pdf", + ".png": "image/png", + ".xml": "text/xml; charset=utf-8", +} + +func loadMimeFile(filename string) { + f, err := os.Open(filename, os.O_RDONLY, 0666) + if err != nil { + return + } + + reader := bufio.NewReader(f) + for { + line, err := reader.ReadString('\n') + if err != nil { + f.Close() + return + } + fields := strings.Fields(line) + if len(fields) <= 1 || fields[0][0] == '#' { + continue + } + typename := fields[0] + if strings.HasPrefix(typename, "text/") { + typename += "; charset=utf-8" + } + for _, ext := range fields[1:] { + if ext[0] == '#' { + break + } + mimeTypes["."+ext] = typename + } + } +} + +func initMime() { + for _, filename := range typeFiles { + loadMimeFile(filename) + } +} + +// TypeByExtension returns the MIME type associated with the file extension ext. +// The extension ext should begin with a leading dot, as in ".html". +// When ext has no associated type, TypeByExtension returns "". +func TypeByExtension(ext string) string { + once.Do(initMime) + typ, _ := mimeTypes[ext] + return typ +} |