FAQ
The problem I'm seeing is that I'm trying to use the http.FileServer with
the Gorilla mux Router.Handle function.

This doesn't work (the image returns a 404)..

   myRouter := mux.NewRouter()
   myRouter.Handle("/images/", http.StripPrefix("/images/",
http.FileServer(http.Dir(HomeFolder + "images/"))))

this works (the image is shown ok)..

   http.Handle("/images/", http.StripPrefix("/images/",
http.FileServer(http.Dir(HomeFolder + "images/"))))


Simple go web server program below, showing the problem...


package main

import (
     "fmt"
     "net/http"
     "io"
     "log"
     "github.com/gorilla/mux"
)

const (
     HomeFolder = "/root/test/"
)

func HomeHandler(w http.ResponseWriter, req *http.Request) {
     io.WriteString(w, htmlContents)
}

func main() {

     myRouter := mux.NewRouter()
     myRouter.HandleFunc("/", HomeHandler)
     //
     // The next line, the image route handler results in
     // the test.png image returning a 404.
     // myRouter.Handle("/images/", http.StripPrefix("/images/",
http.FileServer(http.Dir(HomeFolder + "images/"))))
     //
     myRouter.Host("mydomain.com")
     http.Handle("/", myRouter)

     // This method of setting the image route handler works fine.
     // test.png is shown ok.
     http.Handle("/images/", http.StripPrefix("/images/",
http.FileServer(http.Dir(HomeFolder + "images/"))))

     // HTTP - port 80
     err := http.ListenAndServe(":80", nil)

     if err != nil {
         log.Fatal("ListenAndServe: ", err)
         fmt.Printf("ListenAndServe:%s\n", err.Error())
     }
}

const htmlContents = `<!DOCTYPE HTML>
<html lang="en">
   <head>
     <title>Test page</title>
     <meta charset = "UTF-8" />
   </head>
   <body>
     <p align="center">
         <img src="/images/test.png" height="640" width="480">
     </p>
   </body>
</html>
`

--
You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Search Discussions

  • Toni Cárdenas at Jan 21, 2014 at 6:51 am
    The standard net/http ServeMux (which is the standard handler you are using
    when you use `http.Handle`) and the mux Router have different ways of
    matching an address. See the differences
    between http://golang.org/pkg/net/http/#ServeMux and http://godoc.org/github.com/gorilla/mux.

    So basically, http.Handle('/images/', ...) matches '/images/whatever',
    while myRouter.Handle('/images/', ...) _only_ matches '/images/', and if
    you want to handle '/images/whatever', you have to 1. set a regular
    expression match in your router or 2. use the PathPrefix method on your
    router, like:

    1. myRouter.Handle('/images/{rest}', http.StripPrefix("/images/",
    http.FileServer(http.Dir(HomeFolder + "images/"))))
    2. myRouter.PathPrefix("/images/").Handler(http.StripPrefix("/images/",
    http.FileServer(http.Dir(HomeFolder + "images/"))))
    On Tuesday, January 21, 2014 5:17:14 AM UTC+1, harvey....@gmail.com wrote:

    The problem I'm seeing is that I'm trying to use the http.FileServer with
    the Gorilla mux Router.Handle function.

    This doesn't work (the image returns a 404)..

    myRouter := mux.NewRouter()
    myRouter.Handle("/images/", http.StripPrefix("/images/",
    http.FileServer(http.Dir(HomeFolder + "images/"))))

    this works (the image is shown ok)..

    http.Handle("/images/", http.StripPrefix("/images/",
    http.FileServer(http.Dir(HomeFolder + "images/"))))


    Simple go web server program below, showing the problem...


    package main

    import (
    "fmt"
    "net/http"
    "io"
    "log"
    "github.com/gorilla/mux"
    )

    const (
    HomeFolder = "/root/test/"
    )

    func HomeHandler(w http.ResponseWriter, req *http.Request) {
    io.WriteString(w, htmlContents)
    }

    func main() {

    myRouter := mux.NewRouter()
    myRouter.HandleFunc("/", HomeHandler)
    //
    // The next line, the image route handler results in
    // the test.png image returning a 404.
    // myRouter.Handle("/images/", http.StripPrefix("/images/",
    http.FileServer(http.Dir(HomeFolder + "images/"))))
    //
    myRouter.Host("mydomain.com")
    http.Handle("/", myRouter)

    // This method of setting the image route handler works fine.
    // test.png is shown ok.
    http.Handle("/images/", http.StripPrefix("/images/",
    http.FileServer(http.Dir(HomeFolder + "images/"))))

    // HTTP - port 80
    err := http.ListenAndServe(":80", nil)

    if err != nil {
    log.Fatal("ListenAndServe: ", err)
    fmt.Printf("ListenAndServe:%s\n", err.Error())
    }
    }

    const htmlContents = `<!DOCTYPE HTML>
    <html lang="en">
    <head>
    <title>Test page</title>
    <meta charset = "UTF-8" />
    </head>
    <body>
    <p align="center">
    <img src="/images/test.png" height="640" width="480">
    </p>
    </body>
    </html>
    `
    --
    You received this message because you are subscribed to the Google Groups "golang-nuts" group.
    To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscribe@googlegroups.com.
    For more options, visit https://groups.google.com/groups/opt_out.
  • Harvey Green Au at Jan 21, 2014 at 7:10 am
    Thanks Toni, this is the solution to my issue
    I should have read through the docs on gorilla in more detail!

    On Tuesday, January 21, 2014 2:51:37 PM UTC+8, Toni Cárdenas wrote:

    The standard net/http ServeMux (which is the standard handler you are
    using when you use `http.Handle`) and the mux Router have different ways of
    matching an address. See the differences between
    http://golang.org/pkg/net/http/#ServeMux and
    http://godoc.org/github.com/gorilla/mux.

    So basically, http.Handle('/images/', ...) matches '/images/whatever',
    while myRouter.Handle('/images/', ...) _only_ matches '/images/', and if
    you want to handle '/images/whatever', you have to 1. set a regular
    expression match in your router or 2. use the PathPrefix method on your
    router, like:

    1. myRouter.Handle('/images/{rest}', http.StripPrefix("/images/",
    http.FileServer(http.Dir(HomeFolder + "images/"))))
    2. myRouter.PathPrefix("/images/").Handler(http.StripPrefix("/images/",
    http.FileServer(http.Dir(HomeFolder + "images/"))))
    On Tuesday, January 21, 2014 5:17:14 AM UTC+1, harvey....@gmail.com wrote:

    The problem I'm seeing is that I'm trying to use the http.FileServer with
    the Gorilla mux Router.Handle function.

    This doesn't work (the image returns a 404)..

    myRouter := mux.NewRouter()
    myRouter.Handle("/images/", http.StripPrefix("/images/",
    http.FileServer(http.Dir(HomeFolder + "images/"))))

    this works (the image is shown ok)..

    http.Handle("/images/", http.StripPrefix("/images/",
    http.FileServer(http.Dir(HomeFolder + "images/"))))


    Simple go web server program below, showing the problem...


    package main

    import (
    "fmt"
    "net/http"
    "io"
    "log"
    "github.com/gorilla/mux"
    )

    const (
    HomeFolder = "/root/test/"
    )

    func HomeHandler(w http.ResponseWriter, req *http.Request) {
    io.WriteString(w, htmlContents)
    }

    func main() {

    myRouter := mux.NewRouter()
    myRouter.HandleFunc("/", HomeHandler)
    //
    // The next line, the image route handler results in
    // the test.png image returning a 404.
    // myRouter.Handle("/images/", http.StripPrefix("/images/",
    http.FileServer(http.Dir(HomeFolder + "images/"))))
    //
    myRouter.Host("mydomain.com")
    http.Handle("/", myRouter)

    // This method of setting the image route handler works fine.
    // test.png is shown ok.
    http.Handle("/images/", http.StripPrefix("/images/",
    http.FileServer(http.Dir(HomeFolder + "images/"))))

    // HTTP - port 80
    err := http.ListenAndServe(":80", nil)

    if err != nil {
    log.Fatal("ListenAndServe: ", err)
    fmt.Printf("ListenAndServe:%s\n", err.Error())
    }
    }

    const htmlContents = `<!DOCTYPE HTML>
    <html lang="en">
    <head>
    <title>Test page</title>
    <meta charset = "UTF-8" />
    </head>
    <body>
    <p align="center">
    <img src="/images/test.png" height="640" width="480">
    </p>
    </body>
    </html>
    `
    --
    You received this message because you are subscribed to the Google Groups "golang-nuts" group.
    To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscribe@googlegroups.com.
    For more options, visit https://groups.google.com/groups/opt_out.

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupgolang-nuts @
categoriesgo
postedJan 21, '14 at 4:17a
activeJan 21, '14 at 7:10a
posts3
users2
websitegolang.org

2 users in discussion

Harvey Green Au: 2 posts Toni Cárdenas: 1 post

People

Translate

site design / logo © 2021 Grokbase