"fmt"
"io"
"net/http"
- "strconv"
"strings"
"sync"
stat, err := object.Stat()
if err != nil {
- w.WriteHeader(http.StatusInternalServerError)
+ er := minio.ToErrorResponse(err)
+ w.WriteHeader(er.StatusCode)
w.Write([]byte(fmt.Sprintf("failed to stat object %q: %+v", objPath, err)))
return
}
w.Header().Set("content-type", stat.ContentType)
+ w.Header().Set("content-length", fmt.Sprintf("%d", stat.Size))
w.WriteHeader(http.StatusOK)
- if strings.HasPrefix(stat.ContentType, "text/") || strings.HasPrefix(stat.ContentType, "application/") {
- buf := make([]byte, 32*1024)
- var out []byte
- for {
- nr, err := object.Read(buf)
- if nr == 0 && err != nil {
- break
- }
- end := nr
- for i := nr; i > 0; i-- {
- if buf[i-1] != '\000' {
- end = i
- break
- }
- }
- out = append(out, buf[:end]...)
-
- if err == io.EOF {
- break
- }
- }
- w.Header().Set("content-length", strconv.Itoa(len(out)))
- for nw := 0; nw < len(out); {
- c, err := w.Write(out[nw:])
- if err != nil {
- break
- }
- nw += c
- }
- } else {
- io.Copy(w, object)
- }
+ io.CopyN(w, object, stat.Size)
}
func (a *S3Action) minioClient() (mc *minio.Client, err error) {