| 1106 | } |
| 1107 | |
| 1108 | func copyReadSeeker(w http.ResponseWriter, f fs.File) (int64, error) { |
| 1109 | if rs, ok := f.(interface { |
| 1110 | Read(p []byte) (int, error) |
| 1111 | }); ok { |
| 1112 | buf := make([]byte, 32*1024) |
| 1113 | var total int64 |
| 1114 | for { |
| 1115 | n, err := rs.Read(buf) |
| 1116 | if n > 0 { |
| 1117 | if _, werr := w.Write(buf[:n]); werr != nil { |
| 1118 | return total, werr |
| 1119 | } |
| 1120 | total += int64(n) |
| 1121 | } |
| 1122 | if err != nil { |
| 1123 | if err.Error() == "EOF" { |
| 1124 | return total, nil |
| 1125 | } |
| 1126 | return total, err |
| 1127 | } |
| 1128 | } |
| 1129 | } |
| 1130 | return 0, nil |
| 1131 | } |