diff options
Diffstat (limited to 'roseh.moe.go')
| -rw-r--r-- | roseh.moe.go | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/roseh.moe.go b/roseh.moe.go index 59878c4..02428f3 100644 --- a/roseh.moe.go +++ b/roseh.moe.go @@ -261,6 +261,12 @@ func writeHoleFile(part *multipart.Part) (string, error) { return hole, f.Close() } +func decryptedSize(size int64) int64 { + size -= 32 + segments := (size + (blockSize - 1)) / blockSize + return size - segments*16 +} + var errNoHole = errors.New("no such hole") func readHoleFile(w http.ResponseWriter, hole string) error { @@ -277,6 +283,10 @@ func readHoleFile(w http.ResponseWriter, hole string) error { return err } defer f.Close() + stat, err := f.Stat() + if err != nil { + return err + } r := oae2.NewReader(f, encryptionKey, blockSize) buf := make([]byte, 8) if _, err := io.ReadFull(r, buf); err != nil { @@ -289,6 +299,8 @@ func readHoleFile(w http.ResponseWriter, hole string) error { } fileName := string(buf) w.Header().Set("Content-Disposition", "attachment; filename*=UTF-8''"+fileName) + fileSize := decryptedSize(stat.Size()) - 8 - int64(fileNameLen) + w.Header().Set("Content-Length", strconv.FormatInt(fileSize, 10)) _, err = io.Copy(w, r) return err } |
