-
Notifications
You must be signed in to change notification settings - Fork 0
/
datevalidate.go
51 lines (43 loc) · 1.26 KB
/
datevalidate.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package validator
import (
"errors"
"fmt"
"net/http"
"time"
"github.com/gin-gonic/gin"
)
const maxTimeGap = 30 * time.Second // 30 secs
func newPublicError(msg string) *gin.Error {
return &gin.Error{
Err: errors.New(msg),
Type: gin.ErrorTypePublic,
}
}
// ErrDateNotInRange error when date not in aceptable range
var ErrDateNotInRange = newPublicError("Date submit is not in aceptable range")
// DateValidator checking validate by time range
type DateValidator struct {
// TimeGap is max time different between client submit timestamp
// and webserve time that considered valid. The time precision is millisecond.
TimeGap time.Duration
}
// NewDateValidator return DateValidator with default value (30 second)
func NewDateValidator() *DateValidator {
return &DateValidator{
TimeGap: maxTimeGap,
}
}
// Validate return error when checking if header date is valid or not
func (v *DateValidator) Validate(r *http.Request) error {
t, err := http.ParseTime(r.Header.Get("date"))
if err != nil {
return newPublicError(fmt.Sprintf("Could not parse date header. Error: %s", err.Error()))
}
serverTime := time.Now()
start := serverTime.Add(-v.TimeGap)
stop := serverTime.Add(v.TimeGap)
if t.Before(start) || t.After(stop) {
return ErrDateNotInRange
}
return nil
}