Skip to content

Commit a76672d

Browse files
committed
refactor(param): decouple some cli param deserialization and normalization
1 parent de1749f commit a76672d

File tree

4 files changed

+96
-100
lines changed

4 files changed

+96
-100
lines changed

src/param/cli.go

Lines changed: 45 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import (
55
"../serverError"
66
"../util"
77
"errors"
8+
"net/http"
89
"os"
10+
"strconv"
911
"strings"
1012
)
1113

@@ -276,51 +278,38 @@ func ParseCli() (params []*Param, printVersion, printHelp bool, errs []error) {
276278

277279
// init param data
278280
params = make([]*Param, 0, len(results))
279-
var err error
280281
var es []error
281282
for _, result := range results {
282283
param := &Param{}
283284

284-
// normalize option
285+
// regular option
286+
param.Root, _ = result.GetString("root")
285287
param.EmptyRoot = result.HasKey("emptyroot")
288+
param.PrefixUrls, _ = result.GetStrings("prefixurls")
286289
param.DefaultSort, _ = result.GetString("defaultsort")
287-
param.GlobalUpload = result.HasKey("globalupload")
288-
param.GlobalMkdir = result.HasKey("globalmkdir")
289-
param.GlobalDelete = result.HasKey("globaldelete")
290-
param.GlobalArchive = result.HasKey("globalarchive")
291-
param.GlobalCors = result.HasKey("globalcors")
292-
param.GlobalAuth = result.HasKey("globalauth")
293290
param.UserMatchCase = result.HasKey("usermatchcase")
294291
param.HostNames, _ = result.GetStrings("hostnames")
295292
param.Theme, _ = result.GetString("theme")
296293
param.ThemeDir, _ = result.GetString("themedir")
297294
param.AccessLog, _ = result.GetString("accesslog")
298295
param.ErrorLog, _ = result.GetString("errorlog")
299296

300-
// root
301-
root, _ := result.GetString("root")
302-
root, err = util.NormalizeFsPath(root)
303-
errs = serverError.AppendError(errs, err)
304-
param.Root = root
305-
306-
// normalize url prefixes
307-
prefixurls, _ := result.GetStrings("prefixurls")
308-
param.PrefixUrls = normalizeUrlPaths(prefixurls)
309-
310297
// force dir slash
311298
if result.HasKey("forcedirslash") {
312-
forceDirSlash, _ := result.GetString("forcedirslash")
313-
param.ForceDirSlash = normalizeRedirectCode(forceDirSlash)
299+
strRedirectCode, _ := result.GetString("forcedirslash")
300+
redirectCode, _ := strconv.Atoi(strRedirectCode)
301+
if redirectCode == 0 {
302+
redirectCode = http.StatusMovedPermanently
303+
}
304+
param.ForceDirSlash = redirectCode
314305
}
315306

316307
// dir indexes
317-
dirIndexes, _ := result.GetStrings("dirindexes")
318-
param.DirIndexes = normalizeFilenames(dirIndexes)
308+
param.DirIndexes, _ = result.GetStrings("dirindexes")
319309

320310
// global restrict access
321311
if result.HasKey("globalrestrictaccess") {
322-
globalRestrictAccesses, _ := result.GetStrings("globalrestrictaccess")
323-
param.GlobalRestrictAccess = util.ExtractHostsFromUrls(globalRestrictAccesses)
312+
param.GlobalRestrictAccess, _ = result.GetStrings("globalrestrictaccess")
324313
}
325314

326315
// restrict access urls
@@ -350,64 +339,41 @@ func ParseCli() (params []*Param, printVersion, printHelp bool, errs []error) {
350339
// certificate
351340
certFiles, _ := result.GetStrings("certs")
352341
keyFiles, _ := result.GetStrings("keys")
353-
certs, es := LoadCertificates(certFiles, keyFiles)
342+
certs, es := loadCertificates(certFiles, keyFiles)
354343
errs = append(errs, es...)
355344
param.Certificates = certs
356345

357-
// normalize aliases
346+
// aliases
358347
arrAlias, _ := result.GetStrings("aliases")
359348
param.Aliases, es = normalizePathMaps(arrAlias)
360349
errs = append(errs, es...)
361350

362-
// normalize upload urls
363-
arrUploadUrls, _ := result.GetStrings("uploadurls")
364-
param.UploadUrls = normalizeUrlPaths(arrUploadUrls)
365-
366-
// normalize upload dirs
367-
arrUploadDirs, _ := result.GetStrings("uploaddirs")
368-
param.UploadDirs = normalizeFsPaths(arrUploadDirs)
369-
370-
// normalize mkdir urls
371-
arrMkdirUrls, _ := result.GetStrings("mkdirurls")
372-
param.MkdirUrls = normalizeUrlPaths(arrMkdirUrls)
373-
374-
// normalize mkdir dirs
375-
arrMkdirDirs, _ := result.GetStrings("mkdirdirs")
376-
param.MkdirDirs = normalizeFsPaths(arrMkdirDirs)
377-
378-
// normalize delete urls
379-
arrDeleteUrls, _ := result.GetStrings("deleteurls")
380-
param.DeleteUrls = normalizeUrlPaths(arrDeleteUrls)
381-
382-
// normalize delete dirs
383-
arrDeleteDirs, _ := result.GetStrings("deletedirs")
384-
param.DeleteDirs = normalizeFsPaths(arrDeleteDirs)
385-
386-
// normalize archive urls
387-
arrArchiveUrls, _ := result.GetStrings("archiveurls")
388-
param.ArchiveUrls = normalizeUrlPaths(arrArchiveUrls)
351+
// upload/mkdir/delete/archive/cors/auth urls/dirs
352+
param.GlobalUpload = result.HasKey("globalupload")
353+
param.UploadUrls, _ = result.GetStrings("uploadurls")
354+
param.UploadDirs, _ = result.GetStrings("uploaddirs")
389355

390-
// normalize archive dirs
391-
arrArchiveDirs, _ := result.GetStrings("archivedirs")
392-
param.ArchiveDirs = normalizeFsPaths(arrArchiveDirs)
356+
param.GlobalMkdir = result.HasKey("globalmkdir")
357+
param.MkdirUrls, _ = result.GetStrings("mkdirurls")
358+
param.MkdirDirs, _ = result.GetStrings("mkdirdirs")
393359

394-
// normalize cors urls
395-
arrCorsUrls, _ := result.GetStrings("corsurls")
396-
param.CorsUrls = normalizeUrlPaths(arrCorsUrls)
360+
param.GlobalDelete = result.HasKey("globaldelete")
361+
param.DeleteUrls, _ = result.GetStrings("deleteurls")
362+
param.DeleteDirs, _ = result.GetStrings("deletedirs")
397363

398-
// normalize cors dirs
399-
arrCorsDirs, _ := result.GetStrings("corsdirs")
400-
param.CorsDirs = normalizeFsPaths(arrCorsDirs)
364+
param.GlobalArchive = result.HasKey("globalarchive")
365+
param.ArchiveUrls, _ = result.GetStrings("archiveurls")
366+
param.ArchiveDirs, _ = result.GetStrings("archivedirs")
401367

402-
// normalize auth urls
403-
arrAuthUrls, _ := result.GetStrings("authurls")
404-
param.AuthUrls = normalizeUrlPaths(arrAuthUrls)
368+
param.GlobalCors = result.HasKey("globalcors")
369+
param.CorsUrls, _ = result.GetStrings("corsurls")
370+
param.CorsDirs, _ = result.GetStrings("corsdirs")
405371

406-
// normalize auth dirs
407-
arrAuthDirs, _ := result.GetStrings("authdirs")
408-
param.AuthDirs = normalizeFsPaths(arrAuthDirs)
372+
param.GlobalAuth = result.HasKey("globalauth")
373+
param.AuthUrls, _ = result.GetStrings("authurls")
374+
param.AuthDirs, _ = result.GetStrings("authdirs")
409375

410-
// normalize users
376+
// users
411377
arrUsersPlain, _ := result.GetStrings("users")
412378
param.UsersPlain = EntriesToUsers(arrUsersPlain)
413379
arrUsersBase64, _ := result.GetStrings("usersbase64")
@@ -421,7 +387,7 @@ func ParseCli() (params []*Param, printVersion, printHelp bool, errs []error) {
421387
arrUsersSha512, _ := result.GetStrings("userssha512")
422388
param.UsersSha512 = EntriesToUsers(arrUsersSha512)
423389

424-
// normalize listen
390+
// listen
425391
listens, _ := result.GetStrings("listens")
426392
param.Listens = append(param.Listens, listens...)
427393

@@ -444,27 +410,17 @@ func ParseCli() (params []*Param, printVersion, printHelp bool, errs []error) {
444410
}
445411
}
446412

447-
// shows
448-
shows, _ := result.GetStrings("shows")
449-
param.Shows = shows
450-
451-
showDirs, _ := result.GetStrings("showdirs")
452-
param.ShowDirs = showDirs
453-
454-
showFiles, _ := result.GetStrings("showfiles")
455-
param.ShowFiles = showFiles
413+
// shows/hides
414+
param.Shows, _ = result.GetStrings("shows")
415+
param.ShowDirs, _ = result.GetStrings("showdirs")
416+
param.ShowFiles, _ = result.GetStrings("showfiles")
417+
param.Hides, _ = result.GetStrings("hides")
418+
param.HideDirs, _ = result.GetStrings("hidedirs")
419+
param.HideFiles, _ = result.GetStrings("hidefiles")
456420

457-
// hides
458-
hides, _ := result.GetStrings("hides")
459-
param.Hides = hides
460-
461-
hideDirs, _ := result.GetStrings("hidedirs")
462-
param.HideDirs = hideDirs
463-
464-
hideFiles, _ := result.GetStrings("hidefiles")
465-
param.HideFiles = hideFiles
421+
es = param.normalize()
422+
errs = append(errs, es...)
466423

467-
param.normalize()
468424
params = append(params, param)
469425
}
470426

src/param/main.go

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package param
22

33
import (
4+
"../serverError"
5+
"../util"
46
"crypto/tls"
57
"os"
68
)
@@ -25,6 +27,7 @@ type Param struct {
2527
RestrictAccessUrls map[string][]string
2628
RestrictAccessDirs map[string][]string
2729

30+
// value: [name, value]
2831
GlobalHeaders [][2]string
2932
HeadersUrls map[string][][2]string
3033
HeadersDirs map[string][][2]string
@@ -83,14 +86,53 @@ type Param struct {
8386
ErrorLog string
8487
}
8588

86-
func (p *Param) normalize() {
87-
_, hasRootAlias := p.Aliases["/"]
89+
func (param *Param) normalize() (errs []error) {
90+
var err error
91+
92+
// root
93+
param.Root, err = util.NormalizeFsPath(param.Root)
94+
errs = serverError.AppendError(errs, err)
95+
96+
// root & empty root && alias
97+
_, hasRootAlias := param.Aliases["/"]
8898
if hasRootAlias {
89-
p.EmptyRoot = false
90-
} else if p.EmptyRoot {
91-
p.Root = os.DevNull
92-
p.Aliases["/"] = os.DevNull
99+
param.EmptyRoot = false
100+
} else if param.EmptyRoot {
101+
param.Root = os.DevNull
102+
param.Aliases["/"] = os.DevNull
93103
} else {
94-
p.Aliases["/"] = p.Root
104+
param.Aliases["/"] = param.Root
105+
}
106+
107+
// url prefixes
108+
param.PrefixUrls = normalizeUrlPaths(param.PrefixUrls)
109+
110+
// // force dir slash
111+
if param.ForceDirSlash != 0 {
112+
param.ForceDirSlash = normalizeRedirectCode(param.ForceDirSlash)
95113
}
114+
115+
// dir indexes
116+
param.DirIndexes = normalizeFilenames(param.DirIndexes)
117+
118+
// global restrict access, nil to disable, non-nil to enable with allowed hosts
119+
if param.GlobalRestrictAccess != nil {
120+
param.GlobalRestrictAccess = util.ExtractHostsFromUrls(param.GlobalRestrictAccess)
121+
}
122+
123+
// upload/mkdir/delete/archive/cors/auth urls/dirs
124+
param.UploadUrls = normalizeUrlPaths(param.UploadUrls)
125+
param.UploadDirs = normalizeFsPaths(param.UploadDirs)
126+
param.MkdirUrls = normalizeUrlPaths(param.MkdirUrls)
127+
param.MkdirDirs = normalizeFsPaths(param.MkdirDirs)
128+
param.DeleteUrls = normalizeUrlPaths(param.DeleteUrls)
129+
param.DeleteDirs = normalizeFsPaths(param.DeleteDirs)
130+
param.ArchiveUrls = normalizeUrlPaths(param.ArchiveUrls)
131+
param.ArchiveDirs = normalizeFsPaths(param.ArchiveDirs)
132+
param.CorsUrls = normalizeUrlPaths(param.CorsUrls)
133+
param.CorsDirs = normalizeFsPaths(param.CorsDirs)
134+
param.AuthUrls = normalizeUrlPaths(param.AuthUrls)
135+
param.AuthDirs = normalizeFsPaths(param.AuthDirs)
136+
137+
return
96138
}

src/param/objUtil.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
"strings"
77
)
88

9-
func LoadCertificates(certFiles, keyFiles []string) ([]tls.Certificate, []error) {
9+
func loadCertificates(certFiles, keyFiles []string) ([]tls.Certificate, []error) {
1010
return goVirtualHost.LoadCertificates(certFiles, keyFiles)
1111
}
1212

src/param/strUtil.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package param
33
import (
44
"../util"
55
"path/filepath"
6-
"strconv"
76
"strings"
87
"unicode/utf8"
98
)
@@ -252,8 +251,7 @@ func normalizeHttpsPort(httpsPort string, listensTLS []string) (string, bool) {
252251
return "", false
253252
}
254253

255-
func normalizeRedirectCode(input string) int {
256-
code, _ := strconv.Atoi(input)
254+
func normalizeRedirectCode(code int) int {
257255
if code <= 300 || code > 399 {
258256
return 301
259257
}

0 commit comments

Comments
 (0)