Skip to content

Commit 9d96c08

Browse files
author
Jack Tang
committed
ADD: option to sort items in listing page
1 parent 70ebb63 commit 9d96c08

File tree

5 files changed

+130
-122
lines changed

5 files changed

+130
-122
lines changed

internal/server/server.go

+12-3
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ Options:
3737
--store-size BYTE Size of space allowed for storage [default: 0]
3838
--timeout TIMEOUT Read timeout for connections in milliseconds. A zero value means that reads will not timeout [default: 30*1000]
3939
--behind-proxy Respect X-Forwarded-* and similar headers which may be set by proxies [default: false]
40+
--inc Sort filename in increasingly alphabetical order in listing page [default: false]
4041
`
4142

4243
type ServerConf struct {
@@ -51,6 +52,7 @@ type ServerConf struct {
5152
FilesEndpoint string `docopt:"--files-endpoint"`
5253
Timeout int64 `docopt:"--timeout"`
5354
IsBehindProxy bool `docopt:"--behind-proxy"`
55+
Inc bool `docopt:"--inc"`
5456
}
5557

5658
var stdout = log.New(os.Stdout, "[tusd] ", log.Ldate|log.Ltime)
@@ -75,6 +77,7 @@ func Server() {
7577
conf.FilesEndpoint, _ = arguments.String("--files-endpoint")
7678
conf.Timeout = util.GetInt64(arguments, "--timeout")
7779
conf.IsBehindProxy, _ = arguments.Bool("--behind-proxy")
80+
conf.Inc, _ = arguments.Bool("--inc")
7881
fmt.Println(conf)
7982

8083
storeCompoesr := tusd.NewStoreComposer()
@@ -231,9 +234,15 @@ td {
231234
}
232235

233236
// sort file by name
234-
sort.Slice(rows, func(i, j int) bool {
235-
return rows[i].Filename < rows[j].Filename
236-
})
237+
if conf.Inc {
238+
sort.Slice(rows, func(i, j int) bool {
239+
return rows[i].Filename < rows[j].Filename
240+
})
241+
} else {
242+
sort.Slice(rows, func(i, j int) bool {
243+
return rows[i].Filename > rows[j].Filename
244+
})
245+
}
237246

238247
data := struct {
239248
Rows []Row

internal/util/conn.go

+42-42
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,60 @@
11
package util
22

33
import (
4-
"net"
5-
"time"
4+
"net"
5+
"time"
66
)
77

88
// Conn wraps a net.Conn, and sets a deadline for every read
99
// and write operation.
1010
type Conn struct {
11-
net.Conn
12-
ReadTimeout time.Duration
13-
WriteTimeout time.Duration
14-
15-
// closeRecorded will be true if the connection has been closed and the
16-
// corresponding prometheus counter has been decremented. It will be used to
17-
// avoid duplicated modifications to this metric.
18-
closeRecorded bool
11+
net.Conn
12+
ReadTimeout time.Duration
13+
WriteTimeout time.Duration
14+
15+
// closeRecorded will be true if the connection has been closed and the
16+
// corresponding prometheus counter has been decremented. It will be used to
17+
// avoid duplicated modifications to this metric.
18+
closeRecorded bool
1919
}
2020

2121
func (c *Conn) Read(b []byte) (int, error) {
22-
var err error
23-
if c.ReadTimeout > 0 {
24-
err = c.Conn.SetReadDeadline(time.Now().Add(c.ReadTimeout))
25-
} else {
26-
err = c.Conn.SetReadDeadline(time.Time{})
27-
}
28-
29-
if err != nil {
30-
return 0, err
31-
}
32-
33-
return c.Conn.Read(b)
22+
var err error
23+
if c.ReadTimeout > 0 {
24+
err = c.Conn.SetReadDeadline(time.Now().Add(c.ReadTimeout))
25+
} else {
26+
err = c.Conn.SetReadDeadline(time.Time{})
27+
}
28+
29+
if err != nil {
30+
return 0, err
31+
}
32+
33+
return c.Conn.Read(b)
3434
}
3535

3636
func (c *Conn) Write(b []byte) (int, error) {
37-
var err error
38-
if c.WriteTimeout > 0 {
39-
err = c.Conn.SetWriteDeadline(time.Now().Add(c.WriteTimeout))
40-
} else {
41-
err = c.Conn.SetWriteDeadline(time.Time{})
42-
}
43-
44-
if err != nil {
45-
return 0, err
46-
}
47-
48-
return c.Conn.Write(b)
37+
var err error
38+
if c.WriteTimeout > 0 {
39+
err = c.Conn.SetWriteDeadline(time.Now().Add(c.WriteTimeout))
40+
} else {
41+
err = c.Conn.SetWriteDeadline(time.Time{})
42+
}
43+
44+
if err != nil {
45+
return 0, err
46+
}
47+
48+
return c.Conn.Write(b)
4949
}
5050

5151
func (c *Conn) Close() error {
52-
// Only decremented the prometheus counter if the Close function has not been
53-
// invoked before to avoid duplicated modifications.
54-
if !c.closeRecorded {
55-
c.closeRecorded = true
56-
//MetricsOpenConnections.Dec()
57-
}
58-
59-
return c.Conn.Close()
52+
// Only decremented the prometheus counter if the Close function has not been
53+
// invoked before to avoid duplicated modifications.
54+
if !c.closeRecorded {
55+
c.closeRecorded = true
56+
//MetricsOpenConnections.Dec()
57+
}
58+
59+
return c.Conn.Close()
6060
}

internal/util/docopt.go

+15-15
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
package util
22

33
import (
4-
"github.com/docopt/docopt-go"
5-
"strconv"
4+
"github.com/docopt/docopt-go"
5+
"strconv"
66
)
77

88
func GetInt64(arg docopt.Opts, key string) int64 {
9-
s, _ := arg.String(key)
10-
i, _ := strconv.ParseInt(s, 10, 64)
11-
return i
9+
s, _ := arg.String(key)
10+
i, _ := strconv.ParseInt(s, 10, 64)
11+
return i
1212
}
1313

1414
func GetBool(arg docopt.Opts, key string) bool {
15-
v, _ := arg[key]
16-
if b, ok := v.(bool); ok {
17-
return b
18-
}
19-
return false
15+
v, _ := arg[key]
16+
if b, ok := v.(bool); ok {
17+
return b
18+
}
19+
return false
2020
}
2121

2222
func GetString(arg docopt.Opts, key string) string {
23-
v, _ := arg[key]
24-
if s, ok := v.(string); ok {
25-
return s
26-
}
27-
return ""
23+
v, _ := arg[key]
24+
if s, ok := v.(string); ok {
25+
return s
26+
}
27+
return ""
2828
}

internal/util/listener.go

+53-54
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,85 @@
11
package util
22

33
import (
4-
"errors"
5-
"net"
6-
"os"
7-
"time"
4+
"errors"
5+
"net"
6+
"os"
7+
"time"
88
)
99

1010
// Listener wraps a net.Listener, and gives a place to store the timeout
1111
// parameters. On Accept, it will wrap the net.Conn with our own Conn for us.
1212
// Original implementation taken from https://gist.github.com/jbardin/9663312
1313
// Thanks! <3
1414
type Listener struct {
15-
net.Listener
16-
ReadTimeout time.Duration
17-
WriteTimeout time.Duration
15+
net.Listener
16+
ReadTimeout time.Duration
17+
WriteTimeout time.Duration
1818
}
1919

2020
func NewListener(addr string, readTimeout, writeTimeout time.Duration) (net.Listener, error) {
21-
l, err := net.Listen("tcp", addr)
22-
if err != nil {
23-
return nil, err
24-
}
21+
l, err := net.Listen("tcp", addr)
22+
if err != nil {
23+
return nil, err
24+
}
2525

26-
tl := &Listener{
27-
Listener: l,
28-
ReadTimeout: readTimeout,
29-
WriteTimeout: writeTimeout,
30-
}
31-
return tl, nil
26+
tl := &Listener{
27+
Listener: l,
28+
ReadTimeout: readTimeout,
29+
WriteTimeout: writeTimeout,
30+
}
31+
return tl, nil
3232
}
3333

3434
// Binds to a UNIX socket. If the file already exists, try to remove it before
3535
// binding again. This logic is borrowed from Gunicorn
3636
// (see https://github.com/benoitc/gunicorn/blob/a8963ef1a5a76f3df75ce477b55fe0297e3b617d/gunicorn/sock.py#L106)
3737
func NewUnixListener(path string, readTimeout, writeTimeout time.Duration) (net.Listener, error) {
38-
stat, err := os.Stat(path)
38+
stat, err := os.Stat(path)
3939

40-
if err != nil {
41-
if !os.IsNotExist(err) {
42-
return nil, err
43-
}
44-
} else {
45-
if stat.Mode()&os.ModeSocket != 0 {
46-
err = os.Remove(path)
40+
if err != nil {
41+
if !os.IsNotExist(err) {
42+
return nil, err
43+
}
44+
} else {
45+
if stat.Mode()&os.ModeSocket != 0 {
46+
err = os.Remove(path)
4747

48-
if err != nil {
49-
return nil, err
50-
}
51-
} else {
52-
return nil, errors.New("specified path is not a socket")
53-
}
54-
}
48+
if err != nil {
49+
return nil, err
50+
}
51+
} else {
52+
return nil, errors.New("specified path is not a socket")
53+
}
54+
}
5555

56-
l, err := net.Listen("unix", path)
56+
l, err := net.Listen("unix", path)
5757

58-
if err != nil {
59-
return nil, err
60-
}
58+
if err != nil {
59+
return nil, err
60+
}
6161

62-
tl := &Listener{
63-
Listener: l,
64-
ReadTimeout: readTimeout,
65-
WriteTimeout: writeTimeout,
66-
}
62+
tl := &Listener{
63+
Listener: l,
64+
ReadTimeout: readTimeout,
65+
WriteTimeout: writeTimeout,
66+
}
6767

68-
return tl, nil
68+
return tl, nil
6969
}
7070

7171
func (l *Listener) Accept() (net.Conn, error) {
72-
c, err := l.Listener.Accept()
73-
if err != nil {
74-
return nil, err
75-
}
72+
c, err := l.Listener.Accept()
73+
if err != nil {
74+
return nil, err
75+
}
7676

77-
//go MetricsOpenConnections.Inc()
77+
//go MetricsOpenConnections.Inc()
7878

79-
tc := &Conn{
80-
Conn: c,
81-
ReadTimeout: l.ReadTimeout,
82-
WriteTimeout: l.WriteTimeout,
83-
}
84-
return tc, nil
79+
tc := &Conn{
80+
Conn: c,
81+
ReadTimeout: l.ReadTimeout,
82+
WriteTimeout: l.WriteTimeout,
83+
}
84+
return tc, nil
8585
}
86-

internal/util/log.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package util
22

33
import (
4-
"fmt"
5-
"os"
4+
"fmt"
5+
"os"
66
)
77

88
func ExitWithMessages(msg ...interface{}) {
9-
for _, m := range msg {
10-
fmt.Fprintln(os.Stderr, m)
11-
}
12-
//fmt.Fprintln(os.Stderr, msg...)
13-
os.Exit(1)
14-
}
9+
for _, m := range msg {
10+
fmt.Fprintln(os.Stderr, m)
11+
}
12+
//fmt.Fprintln(os.Stderr, msg...)
13+
os.Exit(1)
14+
}

0 commit comments

Comments
 (0)