Merge branch 'fasthttp' into ctxCancel

This commit is contained in:
Lawrence, Rendall
2023-03-19 20:36:38 +03:00
10 changed files with 22 additions and 60 deletions
-3
View File
@@ -11,9 +11,6 @@ import (
fu "github.com/sot-tech/mochi/frontend/udp"
"github.com/sot-tech/mochi/pkg/conf"
// Seed math random
_ "github.com/sot-tech/mochi/pkg/randseed"
// Imports to register middleware hooks.
_ "github.com/sot-tech/mochi/middleware/clientapproval"
_ "github.com/sot-tech/mochi/middleware/jwt"
+7 -17
View File
@@ -68,21 +68,18 @@ func mapArrayEqual(boxed map[string][]string, unboxed *queryParams) (bool, strin
// Also note that any error that is encountered during parsing is returned as a
// ClientError, as this method is expected to be used to parse client-provided
// data.
func parseURLData(urlData []byte) (*queryParams, error) {
func parseURLData(urlData []byte) *queryParams {
i := bytes.IndexByte(urlData, '?')
if i >= 0 {
urlData = urlData[i+1:]
}
q := &queryParams{new(fasthttp.Args)}
q.ParseBytes(urlData)
return q, nil
return q
}
func TestParseEmptyURLData(t *testing.T) {
parsedQuery, err := parseURLData(nil)
if err != nil {
t.Fatal(err)
}
parsedQuery := parseURLData(nil)
if parsedQuery == nil {
t.Fatal("Parsed query must not be nil")
}
@@ -90,10 +87,7 @@ func TestParseEmptyURLData(t *testing.T) {
func TestParseValidURLData(t *testing.T) {
for parseIndex, parseVal := range ValidAnnounceArguments {
parsedQueryObj, err := parseURLData([]byte("/announce?" + parseVal.Encode()))
if err != nil {
t.Fatal(err)
}
parsedQueryObj := parseURLData([]byte("/announce?" + parseVal.Encode()))
if eq, exp := mapArrayEqual(parseVal, parsedQueryObj); !eq {
t.Fatalf("Incorrect parse at item %d.\n Expected=%v\n Received=%v\n", parseIndex, parseVal, exp)
@@ -101,9 +95,9 @@ func TestParseValidURLData(t *testing.T) {
}
}
func TestParseShouldNotPanicURLData(t *testing.T) {
func TestParseShouldNotPanicURLData(_ *testing.T) {
for _, parseStr := range shouldNotPanicQueries {
_, _ = parseURLData(parseStr)
_ = parseURLData(parseStr)
}
}
@@ -115,11 +109,7 @@ func BenchmarkParseQuery(b *testing.B) {
b.ResetTimer()
for bCount := 0; bCount < b.N; bCount++ {
i := bCount % len(announceStrings)
parsedQueryObj, err := parseURLData(announceStrings[i])
if err != nil {
b.Error(err, i)
b.Log(parsedQueryObj)
}
_ = parseURLData(announceStrings[i])
}
}
+12 -5
View File
@@ -2,9 +2,9 @@ package udp
import (
"crypto/hmac"
cr "crypto/rand"
"encoding/binary"
"hash"
"math/rand"
"net/netip"
"time"
@@ -70,18 +70,25 @@ func NewConnectionIDGenerator(key []byte, maxClockSkew time.Duration) *Connectio
buff: make([]byte, buffLen),
scratch: make([]byte, scratchLen),
maxClockSkew: int64(maxClockSkew),
s: rand.Uint64(),
}
}
// reset resets the generator.
// This is called by other methods of the generator, it's not necessary to call
// it after getting a generator from a pool.
func (g *ConnectionIDGenerator) reset() {
func (g *ConnectionIDGenerator) reset(init bool) {
g.mac.Reset()
g.connID = g.connID[:connIDLen]
g.buff = g.buff[:buffLen]
g.scratch = g.scratch[:0]
if init {
r := make([]byte, 8)
if _, err := cr.Read(r); err == nil {
g.s = binary.BigEndian.Uint64(r)
} else {
g.s = uint64(time.Now().UnixNano())
}
}
}
// Generate generates an 8-byte connection ID as described in BEP 15 for the
@@ -102,7 +109,7 @@ func (g *ConnectionIDGenerator) reset() {
// will be reused, so it must not be referenced after returning the generator
// to a pool and will be overwritten be subsequent calls to Generate!
func (g *ConnectionIDGenerator) Generate(ip netip.Addr, now time.Time) (out []byte) {
g.reset()
g.reset(true)
var r uint64
r, g.s = xorshift.XorShift64S(g.s)
g.buff[0] = byte(r)
@@ -123,7 +130,7 @@ func (g *ConnectionIDGenerator) Generate(ip netip.Addr, now time.Time) (out []by
// Validate validates the given connection ID for an IP and the current time.
func (g *ConnectionIDGenerator) Validate(connectionID []byte, ip netip.Addr, now time.Time) bool {
g.reset()
g.reset(false)
nowTS := now.Unix()
g.buff[0] = connectionID[0]
// connectionID contains only 2 bytes of timestamp, so we clean little 16 bits to place it and rehash.
-1
View File
@@ -13,7 +13,6 @@ import (
"github.com/cespare/xxhash/v2"
"github.com/sot-tech/mochi/pkg/log"
_ "github.com/sot-tech/mochi/pkg/randseed"
"github.com/stretchr/testify/require"
)
-1
View File
@@ -7,7 +7,6 @@ import (
"github.com/sot-tech/mochi/middleware"
"github.com/sot-tech/mochi/pkg/conf"
"github.com/sot-tech/mochi/pkg/log"
_ "github.com/sot-tech/mochi/pkg/randseed"
"github.com/sot-tech/mochi/storage"
_ "github.com/sot-tech/mochi/storage/memory"
)
+3 -1
View File
@@ -88,7 +88,9 @@ func TestParseInvalidURLData(t *testing.T) {
func TestParseShouldNotPanicURLData(t *testing.T) {
for _, parseStr := range shouldNotPanicQueries {
_, _ = parseQuery(parseStr)
if _, err := parseQuery(parseStr); err != nil {
t.Error(err)
}
}
}
-1
View File
@@ -22,7 +22,6 @@ import (
"github.com/sot-tech/mochi/bittorrent"
"github.com/sot-tech/mochi/pkg/conf"
"github.com/sot-tech/mochi/pkg/log"
_ "github.com/sot-tech/mochi/pkg/randseed"
)
const (
@@ -9,8 +9,6 @@ import (
"github.com/sot-tech/mochi/bittorrent"
"github.com/sot-tech/mochi/pkg/conf"
_ "github.com/sot-tech/mochi/pkg/randseed"
)
var configTests = []struct {
-27
View File
@@ -1,27 +0,0 @@
// Package randseed just seeds (math) rand.Rand
package randseed
import (
cr "crypto/rand"
"math/rand"
"time"
)
func init() {
// Seeding global math random
//nolint:staticcheck
rand.Seed(GenSeed())
}
// GenSeed returns 64bit seed from crypto/rand source or
// from current time, if crypto random read error occurred
func GenSeed() (seed int64) {
r := make([]byte, 8)
if _, err := cr.Read(r); err == nil {
seed = int64(r[0])<<56 | int64(r[1])<<48 | int64(r[2])<<40 | int64(r[3])<<32 |
int64(r[4])<<24 | int64(r[5])<<16 | int64(r[6])<<8 | int64(r[7])
} else {
seed = time.Now().UnixNano()
}
return
}
-2
View File
@@ -13,8 +13,6 @@ import (
"testing"
"github.com/sot-tech/mochi/bittorrent"
// used for seeding global math.Rand
_ "github.com/sot-tech/mochi/pkg/randseed"
"github.com/sot-tech/mochi/storage"
)