mirror of
https://github.com/caddyserver/caddy.git
synced 2024-11-29 20:24:11 +08:00
Merge pull request #271 from zmb3/windows_failures
Fix test failures on Windows.
This commit is contained in:
commit
5c3085fe51
|
@ -38,7 +38,7 @@ func TestBasicAuthParse(t *testing.T) {
|
||||||
md5:$apr1$l42y8rex$pOA2VJ0x/0TwaFeAF9nX61`
|
md5:$apr1$l42y8rex$pOA2VJ0x/0TwaFeAF9nX61`
|
||||||
|
|
||||||
var skipHtpassword bool
|
var skipHtpassword bool
|
||||||
htfh, err := ioutil.TempFile("", "basicauth-")
|
htfh, err := ioutil.TempFile(".", "basicauth-")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Logf("Error creating temp file (%v), will skip htpassword test", err)
|
t.Logf("Error creating temp file (%v), will skip htpassword test", err)
|
||||||
skipHtpassword = true
|
skipHtpassword = true
|
||||||
|
|
|
@ -24,7 +24,9 @@ type Controller struct {
|
||||||
// add-ons can use this as a convenience.
|
// add-ons can use this as a convenience.
|
||||||
func NewTestController(input string) *Controller {
|
func NewTestController(input string) *Controller {
|
||||||
return &Controller{
|
return &Controller{
|
||||||
Config: &server.Config{},
|
Config: &server.Config{
|
||||||
|
Root: ".",
|
||||||
|
},
|
||||||
Dispenser: parse.NewDispenser("Testfile", strings.NewReader(input)),
|
Dispenser: parse.NewDispenser("Testfile", strings.NewReader(input)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/hashicorp/go-syslog"
|
"github.com/hashicorp/go-syslog"
|
||||||
|
@ -105,7 +105,7 @@ func errorsParse(c *Controller) (*errors.ErrorHandler, error) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Error page; ensure it exists
|
// Error page; ensure it exists
|
||||||
where = path.Join(c.Root, where)
|
where = filepath.Join(c.Root, where)
|
||||||
f, err := os.Open(where)
|
f, err := os.Open(where)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Warning: Unable to open error page '" + where + "': " + err.Error())
|
fmt.Println("Warning: Unable to open error page '" + where + "': " + err.Error())
|
||||||
|
|
|
@ -114,11 +114,11 @@ func loadParams(c *Controller, mdc *markdown.Config) error {
|
||||||
if _, ok := mdc.Templates[markdown.DefaultTemplate]; ok {
|
if _, ok := mdc.Templates[markdown.DefaultTemplate]; ok {
|
||||||
return c.Err("only one default template is allowed, use alias.")
|
return c.Err("only one default template is allowed, use alias.")
|
||||||
}
|
}
|
||||||
fpath := filepath.Clean(c.Root + string(filepath.Separator) + tArgs[0])
|
fpath := filepath.ToSlash(filepath.Clean(c.Root + string(filepath.Separator) + tArgs[0]))
|
||||||
mdc.Templates[markdown.DefaultTemplate] = fpath
|
mdc.Templates[markdown.DefaultTemplate] = fpath
|
||||||
return nil
|
return nil
|
||||||
case 2:
|
case 2:
|
||||||
fpath := filepath.Clean(c.Root + string(filepath.Separator) + tArgs[1])
|
fpath := filepath.ToSlash(filepath.Clean(c.Root + string(filepath.Separator) + tArgs[1]))
|
||||||
mdc.Templates[tArgs[0]] = fpath
|
mdc.Templates[tArgs[0]] = fpath
|
||||||
return nil
|
return nil
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package setup
|
package setup
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -92,7 +93,7 @@ func TestMarkdownStaticGen(t *testing.T) {
|
||||||
t.Fatalf("An error occured when getting the file content: %v", err)
|
t.Fatalf("An error occured when getting the file content: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
expectedBody := `<!DOCTYPE html>
|
expectedBody := []byte(`<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>first_post</title>
|
<title>first_post</title>
|
||||||
|
@ -104,9 +105,10 @@ func TestMarkdownStaticGen(t *testing.T) {
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
`
|
`)
|
||||||
if string(html) != expectedBody {
|
|
||||||
t.Fatalf("Expected file content: %v got: %v", expectedBody, html)
|
if !bytes.Equal(html, expectedBody) {
|
||||||
|
t.Fatalf("Expected file content: %s got: %s", string(expectedBody), string(html))
|
||||||
}
|
}
|
||||||
|
|
||||||
fp := filepath.Join(c.Root, markdown.DefaultStaticDir)
|
fp := filepath.Join(c.Root, markdown.DefaultStaticDir)
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/mholt/caddy/middleware"
|
"github.com/mholt/caddy/middleware"
|
||||||
|
@ -124,15 +125,18 @@ md5:$apr1$l42y8rex$pOA2VJ0x/0TwaFeAF9nX61`
|
||||||
t.Skipf("Error creating temp file (%v), will skip htpassword test")
|
t.Skipf("Error creating temp file (%v), will skip htpassword test")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
defer os.Remove(htfh.Name())
|
||||||
if _, err = htfh.Write([]byte(htpasswdFile)); err != nil {
|
if _, err = htfh.Write([]byte(htpasswdFile)); err != nil {
|
||||||
t.Fatalf("write htpasswd file %q: %v", htfh.Name(), err)
|
t.Fatalf("write htpasswd file %q: %v", htfh.Name(), err)
|
||||||
}
|
}
|
||||||
htfh.Close()
|
htfh.Close()
|
||||||
defer os.Remove(htfh.Name())
|
|
||||||
|
|
||||||
for i, username := range []string{"sha1", "md5"} {
|
for i, username := range []string{"sha1", "md5"} {
|
||||||
rule := Rule{Username: username, Resources: []string{"/testing"}}
|
rule := Rule{Username: username, Resources: []string{"/testing"}}
|
||||||
if rule.Password, err = GetHtpasswdMatcher(htfh.Name(), rule.Username, "/"); err != nil {
|
|
||||||
|
siteRoot := filepath.Dir(htfh.Name())
|
||||||
|
filename := filepath.Base(htfh.Name())
|
||||||
|
if rule.Password, err = GetHtpasswdMatcher(filename, rule.Username, siteRoot); err != nil {
|
||||||
t.Fatalf("GetHtpasswdMatcher(%q, %q): %v", htfh.Name(), rule.Username, err)
|
t.Fatalf("GetHtpasswdMatcher(%q, %q): %v", htfh.Name(), rule.Username, err)
|
||||||
}
|
}
|
||||||
t.Logf("%d. username=%q password=%v", i, rule.Username, rule.Password)
|
t.Logf("%d. username=%q password=%v", i, rule.Username, rule.Password)
|
||||||
|
|
|
@ -70,7 +70,7 @@ func generateLinks(md Markdown, cfg *Config) (bool, error) {
|
||||||
return generated, g.lastErr
|
return generated, g.lastErr
|
||||||
}
|
}
|
||||||
|
|
||||||
// generateStaticFiles generates static html files from markdowns.
|
// generateStaticHTML generates static HTML files from markdowns.
|
||||||
func generateStaticHTML(md Markdown, cfg *Config) error {
|
func generateStaticHTML(md Markdown, cfg *Config) error {
|
||||||
// If generated site already exists, clear it out
|
// If generated site already exists, clear it out
|
||||||
_, err := os.Stat(cfg.StaticDir)
|
_, err := os.Stat(cfg.StaticDir)
|
||||||
|
@ -98,6 +98,7 @@ func generateStaticHTML(md Markdown, cfg *Config) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
reqPath = filepath.ToSlash(reqPath)
|
||||||
reqPath = "/" + reqPath
|
reqPath = "/" + reqPath
|
||||||
|
|
||||||
// Generate the static file
|
// Generate the static file
|
||||||
|
|
|
@ -116,7 +116,7 @@ func (l *linkGen) generateLinks(md Markdown, cfg *Config) bool {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
reqPath = "/" + reqPath
|
reqPath = "/" + filepath.ToSlash(reqPath)
|
||||||
|
|
||||||
parser := findParser(body)
|
parser := findParser(body)
|
||||||
if parser == nil {
|
if parser == nil {
|
||||||
|
|
|
@ -134,7 +134,10 @@ func (md Markdown) generatePage(c *Config, requestPath string, content []byte) e
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
filePath := filepath.Join(c.StaticDir, requestPath)
|
// the URL will always use "/" as a path separator,
|
||||||
|
// convert that to a native path to support OS that
|
||||||
|
// use different path separators
|
||||||
|
filePath := filepath.Join(c.StaticDir, filepath.FromSlash(requestPath))
|
||||||
|
|
||||||
// If it is index file, use the directory instead
|
// If it is index file, use the directory instead
|
||||||
if md.IsIndexFile(filepath.Base(requestPath)) {
|
if md.IsIndexFile(filepath.Base(requestPath)) {
|
||||||
|
@ -154,7 +157,7 @@ func (md Markdown) generatePage(c *Config, requestPath string, content []byte) e
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Lock()
|
c.Lock()
|
||||||
c.StaticFiles[requestPath] = filePath
|
c.StaticFiles[requestPath] = filepath.ToSlash(filePath)
|
||||||
c.Unlock()
|
c.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ package middleware
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"path/filepath"
|
"path"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
@ -57,12 +57,19 @@ func (f HandlerFunc) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, err
|
||||||
// and false is returned. fpath must end in a forward slash '/'
|
// and false is returned. fpath must end in a forward slash '/'
|
||||||
// otherwise no index files will be tried (directory paths must end
|
// otherwise no index files will be tried (directory paths must end
|
||||||
// in a forward slash according to HTTP).
|
// in a forward slash according to HTTP).
|
||||||
|
//
|
||||||
|
// All paths passed into and returned from this function use '/' as the
|
||||||
|
// path separator, just like URLs. IndexFle handles path manipulation
|
||||||
|
// internally for systems that use different path separators.
|
||||||
func IndexFile(root http.FileSystem, fpath string, indexFiles []string) (string, bool) {
|
func IndexFile(root http.FileSystem, fpath string, indexFiles []string) (string, bool) {
|
||||||
if fpath[len(fpath)-1] != '/' || root == nil {
|
if fpath[len(fpath)-1] != '/' || root == nil {
|
||||||
return "", false
|
return "", false
|
||||||
}
|
}
|
||||||
for _, indexFile := range indexFiles {
|
for _, indexFile := range indexFiles {
|
||||||
fp := filepath.Join(fpath, indexFile)
|
// func (http.FileSystem).Open wants all paths separated by "/",
|
||||||
|
// regardless of operating system convention, so use
|
||||||
|
// path.Join instead of filepath.Join
|
||||||
|
fp := path.Join(fpath, indexFile)
|
||||||
f, err := root.Open(fp)
|
f, err := root.Open(fp)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
f.Close()
|
f.Close()
|
||||||
|
|
|
@ -15,9 +15,12 @@ func TestIndexfile(t *testing.T) {
|
||||||
expectedBoolValue bool //return value
|
expectedBoolValue bool //return value
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
http.Dir("./templates/testdata"), "/images/", []string{"img.htm"},
|
http.Dir("./templates/testdata"),
|
||||||
|
"/images/",
|
||||||
|
[]string{"img.htm"},
|
||||||
false,
|
false,
|
||||||
"/images/img.htm", true,
|
"/images/img.htm",
|
||||||
|
true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for i, test := range tests {
|
for i, test := range tests {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user