support lang tag on a vhost basis
This commit is contained in:
parent
f1d01ae465
commit
67b3258969
@ -19,6 +19,7 @@ localhost:
|
|||||||
Trusted:
|
Trusted:
|
||||||
- /private
|
- /private
|
||||||
Whitelist: "whitelist"
|
Whitelist: "whitelist"
|
||||||
|
Lang: "en,eo"
|
||||||
localhost2:
|
localhost2:
|
||||||
Hostname: "gemini.foo.bar"
|
Hostname: "gemini.foo.bar"
|
||||||
RootDir: "/var/gemini2"
|
RootDir: "/var/gemini2"
|
||||||
|
@ -62,6 +62,7 @@ type GeminiConfig struct {
|
|||||||
RootDir string
|
RootDir string
|
||||||
CGIDir string
|
CGIDir string
|
||||||
AccessControl CapsuleAcl
|
AccessControl CapsuleAcl
|
||||||
|
Lang string
|
||||||
}
|
}
|
||||||
|
|
||||||
type CapsuleAcl struct {
|
type CapsuleAcl struct {
|
||||||
@ -75,12 +76,13 @@ func (c *GeminiConfig) String() string {
|
|||||||
return fmt.Sprintf("Gemini Config: %v Files:%v CGI:%v", c.Hostname, c.RootDir, c.CGIDir)
|
return fmt.Sprintf("Gemini Config: %v Files:%v CGI:%v", c.Hostname, c.RootDir, c.CGIDir)
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateFile(selector string) Response {
|
func generateFile(selector, extended_meta string) Response {
|
||||||
meta := mime.TypeByExtension(filepath.Ext(selector))
|
meta := mime.TypeByExtension(filepath.Ext(selector))
|
||||||
if meta == "" {
|
if meta == "" {
|
||||||
//assume plain UTF-8 text
|
//assume plain UTF-8 text
|
||||||
meta = "text/gemini; charset=utf-8"
|
meta = "text/gemini; charset=utf-8"
|
||||||
}
|
}
|
||||||
|
meta = meta + "; " + extended_meta
|
||||||
file, err := os.Open(selector)
|
file, err := os.Open(selector)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("Failed to read file")
|
panic("Failed to read file")
|
||||||
@ -90,7 +92,7 @@ func generateFile(selector string) Response {
|
|||||||
return Response{STATUS_SUCCESS, meta, string(buf)}
|
return Response{STATUS_SUCCESS, meta, string(buf)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateDirectory(path string) Response {
|
func generateDirectory(path, extended_meta string) Response {
|
||||||
var dirpage string
|
var dirpage string
|
||||||
files, err := ioutil.ReadDir(path)
|
files, err := ioutil.ReadDir(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -105,12 +107,16 @@ func generateDirectory(path string) Response {
|
|||||||
}
|
}
|
||||||
if file.Name() == "index.gmi" || file.Name() == "index.gemini" {
|
if file.Name() == "index.gmi" || file.Name() == "index.gemini" {
|
||||||
//Found an index file, return that instead
|
//Found an index file, return that instead
|
||||||
return generateFile(path + file.Name())
|
return generateFile(path+file.Name(), extended_meta)
|
||||||
} else {
|
} else {
|
||||||
dirpage += fmt.Sprintf("=> %s %s\r\n", url.PathEscape(file.Name()), file.Name())
|
dirpage += fmt.Sprintf("=> %s %s\r\n", url.PathEscape(file.Name()), file.Name())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Response{STATUS_SUCCESS, "text/gemini", dirpage}
|
meta := "text/gemini"
|
||||||
|
if extended_meta != "" {
|
||||||
|
meta = meta + "; " + extended_meta
|
||||||
|
}
|
||||||
|
return Response{STATUS_SUCCESS, meta, dirpage}
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateCGI(selector *url.URL, c *conn) Response {
|
func generateCGI(selector *url.URL, c *conn) Response {
|
||||||
|
@ -224,7 +224,12 @@ func (s *Server) ParseRequest(req string, c *conn) Response {
|
|||||||
return Response{STATUS_TEMPORARY_FAILURE, "Unable to access file", ""}
|
return Response{STATUS_TEMPORARY_FAILURE, "Unable to access file", ""}
|
||||||
case fi.IsDir():
|
case fi.IsDir():
|
||||||
if strings.HasSuffix(u.Path, "/") {
|
if strings.HasSuffix(u.Path, "/") {
|
||||||
return generateDirectory(selector)
|
//build extended meta first
|
||||||
|
ext := ""
|
||||||
|
if capsule.Lang != "" {
|
||||||
|
ext = "lang=" + capsule.Lang
|
||||||
|
}
|
||||||
|
return generateDirectory(selector, ext)
|
||||||
} else {
|
} else {
|
||||||
return Response{STATUS_REDIRECT_PERMANENT, "gemini://" + u.Hostname() + u.Path + "/", ""}
|
return Response{STATUS_REDIRECT_PERMANENT, "gemini://" + u.Hostname() + u.Path + "/", ""}
|
||||||
}
|
}
|
||||||
@ -236,7 +241,12 @@ func (s *Server) ParseRequest(req string, c *conn) Response {
|
|||||||
return generateCGI(u, c)
|
return generateCGI(u, c)
|
||||||
} else {
|
} else {
|
||||||
//Normal file found
|
//Normal file found
|
||||||
return generateFile(selector)
|
//build extended meta first
|
||||||
|
ext := ""
|
||||||
|
if capsule.Lang != "" {
|
||||||
|
ext = "lang=" + capsule.Lang
|
||||||
|
}
|
||||||
|
return generateFile(selector, ext)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user