简单的静态服务器,为每个请求返回旋转的静态文件

时间:2017-08-30 17:50:27

标签: go

我在golang中写了这个简单的服务器:

package main

import (
        "net/http"
)

func main() {
        http.Handle("/", http.FileServer(http.Dir("./static")))
        http.ListenAndServe(":3000", nil)
}

我想添加新功能: 每个请求GET / rotate从/ static文件夹返回一个旋转的文件内容。 例如在/ static文件夹中存在7个文件,对于每个请求服务器返回:file1,file2,file3 ......

我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

下面是一个简单的服务器,可以让您开始实现目标。有关实施的几点注意事项:

  1. 文件名在程序启动期间仅加载一次。如果文件在程序运行时消失,服务器将在轮换时返回404。
  2. 我们需要使用锁定(在这种情况下,通过sync.Mutex),因为每个请求都会在自己的例程中运行。
  3. package main
    
    import (
        "flag"
        "net/http"
        "os"
        "path/filepath"
        "sync"
    )
    
    func main() {
        dir := flag.String("dir", ".", "directory of files to serve")
        flag.Parse()
    
        f, err := os.Open(*dir)
        if err != nil {
            panic(err)
        }
        files, err := f.Readdir(0)
        if err != nil {
            panic(err)
        }
    
        filenames := make([]string, 0, len(files))
        for _, file := range files {
            if !file.IsDir() {
                filenames = append(filenames, file.Name())
            }
        }
    
        var (
            idxLock sync.Mutex
            idx     int
        )
    
        http.HandleFunc("/rotate", func(w http.ResponseWriter, r *http.Request) {
            if len(filenames) == 0 {
                http.NotFound(w, r)
                return
            }
    
            idxLock.Lock()
            i := idx
            idx++
            if idx >= len(filenames) {
                idx = 0
            }
            idxLock.Unlock()
    
            http.ServeFile(w, r, filepath.Join(*dir, filenames[i]))
        })
    
        if err := http.ListenAndServe(":3000", nil); err != nil {
            panic(err)
        }
    }