Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

http.FileServer response with wrong mime "Content-Type"

I'm using http.FileServer to serve a directory of mp3 files, which my template then src in javascript. The response, however, uses the Content-Type text/html instead of audio/mpeg. How do I set the mime type which the FileServer responds with, I saw this question Setting the 'charset' property on the Content-Type header in the golang HTTP FileServer , but I'm still not sure how to override the mime type.

My code looks like the following:

fs := http.FileServer(http.Dir(dir))
http.Handle("/media", http.StripPrefix("/media", fs))
http.HandleFunc("/", p.playlistHandler)
http.ListenAndServe(":5177", nil)

and the error I get is:

HTTP "Content-Type" of "text/html" is not supported. Load of media resource http://localhost:5177/media/sample1.mp3 failed.
like image 318
Nevermore Avatar asked Sep 15 '16 20:09

Nevermore


People also ask

How do I change the MIME type of a file?

In the Connections pane, go to the site, application, or directory for which you want to add a MIME type. In the Home pane, double-click MIME Types. In the MIME Types pane, click Add... in the Actions pane. In the Add MIME Type dialog box, add the file name extension and MIME type, and then click OK.

What is mime checking?

MIME stands for "Multipurpose Internet Mail Extensions. It's a way of identifying files on the Internet according to their nature and format. For example, using the "Content-type" header value defined in a HTTP response, the browser can open the file with the proper extension/plugin.

How does the browser tell the Web server what content types it can read?

The Content-Type header is used to indicate the media type of the resource. The media type is a string sent along with the file indicating the format of the file. For example, for image file its media type will be like image/png or image/jpg, etc. In response, it tells about the type of returned content, to the client.


1 Answers

It's not a problem of content types. Your fs handler isn't getting called when you request the mp3. You need to add a / to your pattern /media and the strip prefix like this

http.Handle("/media/", http.StripPrefix("/media/", fs))

The reason is in the documentation of net/http.ServeMux

Patterns name fixed, rooted paths, like "/favicon.ico", or rooted subtrees, like "/images/" (note the trailing slash). Longer patterns take precedence over shorter ones, so that if there are handlers registered for both "/images/" and "/images/thumbnails/", the latter handler will be called for paths beginning "/images/thumbnails/" and the former will receive requests for any other paths in the "/images/" subtree.

With just /media you're registering a handler for a path but with a trailing slash it considers it a rooted subtree and will serve requests under that tree.

like image 53
jcbwlkr Avatar answered Nov 01 '22 20:11

jcbwlkr