|
|
@ -10,9 +10,8 @@ import ( |
|
|
|
) |
|
|
|
|
|
|
|
type Needle struct { |
|
|
|
Cookie uint8 "random number to mitigate brute force lookups" |
|
|
|
Cookie uint32 "random number to mitigate brute force lookups" |
|
|
|
Key uint64 "file id" |
|
|
|
AlternateKey uint32 "supplemental id" |
|
|
|
Size uint32 "Data size" |
|
|
|
Data []byte "The actual file data" |
|
|
|
Checksum int32 "CRC32 to check integrity" |
|
|
@ -36,32 +35,28 @@ func NewNeedle(r *http.Request) (n *Needle) { |
|
|
|
func (n *Needle) ParsePath(path string) { |
|
|
|
a := strings.Split(path, "_") |
|
|
|
log.Println("cookie", a[0], "key", a[1], "altKey", a[2]) |
|
|
|
cookie, _ := strconv.Atoi(a[0]) |
|
|
|
n.Cookie = uint8(cookie) |
|
|
|
cookie, _ := strconv.Atoui(a[0]) |
|
|
|
n.Cookie = uint32(cookie) |
|
|
|
n.Key, _ = strconv.Atoui64(a[1]) |
|
|
|
altKey, _ := strconv.Atoui64(a[2]) |
|
|
|
n.AlternateKey = uint32(altKey) |
|
|
|
} |
|
|
|
func (n *Needle) Append(w io.Writer) { |
|
|
|
header := make([]byte, 17) |
|
|
|
header[0] = n.Cookie |
|
|
|
uint64toBytes(header[1:9], n.Key) |
|
|
|
uint32toBytes(header[9:13], n.AlternateKey) |
|
|
|
header := make([]byte, 16) |
|
|
|
uint32toBytes(header[0:4], n.Cookie) |
|
|
|
uint64toBytes(header[4:12], n.Key) |
|
|
|
n.Size = uint32(len(n.Data)) |
|
|
|
uint32toBytes(header[13:17], n.Size) |
|
|
|
uint32toBytes(header[12:16], n.Size) |
|
|
|
w.Write(header) |
|
|
|
w.Write(n.Data) |
|
|
|
rest := 8 - ((n.Size + 17 + 4) % 8) |
|
|
|
rest := 8 - ((n.Size + 16 + 4) % 8) |
|
|
|
uint32toBytes(header[0:4], uint32(n.Checksum)) |
|
|
|
w.Write(header[0 : rest+4]) |
|
|
|
} |
|
|
|
func (n *Needle) Read(r io.Reader, size uint32) { |
|
|
|
bytes := make([]byte, size+17+4) |
|
|
|
bytes := make([]byte, size+16+4) |
|
|
|
r.Read(bytes) |
|
|
|
n.Cookie = bytes[0] |
|
|
|
n.Key = bytesToUint64(bytes[1:9]) |
|
|
|
n.AlternateKey = bytesToUint32(bytes[9:13]) |
|
|
|
n.Size = bytesToUint32(bytes[13:17]) |
|
|
|
n.Data = bytes[17 : 17+size] |
|
|
|
n.Checksum = int32(bytesToUint32(bytes[17+size : 17+size+4])) |
|
|
|
n.Cookie = bytesToUint32(bytes[0:4]) |
|
|
|
n.Key = bytesToUint64(bytes[4:12]) |
|
|
|
n.Size = bytesToUint32(bytes[12:16]) |
|
|
|
n.Data = bytes[16 : 16+size] |
|
|
|
n.Checksum = int32(bytesToUint32(bytes[16+size : 16+size+4])) |
|
|
|
} |