summaryrefslogtreecommitdiff
path: root/src/pkg/mime
diff options
context:
space:
mode:
authorMichael Hoisie <hoisie@gmail.com>2010-02-09 20:47:45 -0800
committerMichael Hoisie <hoisie@gmail.com>2010-02-09 20:47:45 -0800
commit25066ce98bab56fa229b482e550ec8f465fd49a1 (patch)
tree86487858ee2d58fbab0193f610b26ddec4def5ad /src/pkg/mime
parentdf8959cc5eb078adbafd8e4b8bf088e9c296d4ec (diff)
downloadgolang-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/Makefile11
-rw-r--r--src/pkg/mime/mime_test.go27
-rw-r--r--src/pkg/mime/test.types8
-rw-r--r--src/pkg/mime/type.go83
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
+}