@@ -2,6 +2,9 @@ package object
22
33import (
44 "ObjectStorage/src/lib/es"
5+ "ObjectStorage/src/lib/utils"
6+ "compress/gzip"
7+ "fmt"
58 "io"
69 "log"
710 "net/http"
@@ -11,36 +14,56 @@ import (
1114)
1215
1316func get (w http.ResponseWriter , r * http.Request ) {
14- //1.从元数据服务器上获取文件名贺版本号
15- version := 0
1617 name := strings .Split (r .URL .EscapedPath (), "/" )[2 ]
1718 versionId := r .URL .Query ()["version" ]
18- var err error
19+ version := 0
20+ var e error
1921 if len (versionId ) != 0 {
20- version , err = strconv .Atoi (versionId [0 ])
21- if err != nil {
22- log .Println (err )
23- w .WriteHeader (http .StatusInternalServerError )
22+ version , e = strconv .Atoi (versionId [0 ])
23+ if e != nil {
24+ log .Println (e )
25+ w .WriteHeader (http .StatusBadRequest )
2426 return
2527 }
2628 }
27- //2.查看数据是否被删除
28- meta , err := es .GetMetadata (name , version )
29- if err != nil {
30- log .Println (err )
29+ meta , e := es .GetMetadata (name , version )
30+ if e != nil {
31+ log .Println (e )
3132 w .WriteHeader (http .StatusInternalServerError )
3233 return
3334 }
3435 if meta .Hash == "" {
3536 w .WriteHeader (http .StatusNotFound )
3637 return
3738 }
38- //3.若数据存在则向dataServer发起请求
39- stream , err := getStream ( url . PathEscape ( meta .Hash ) )
40- if err != nil {
41- log .Println (err )
39+ hash := url . PathEscape ( meta . Hash )
40+ stream , e := GetStream ( hash , meta .Size )
41+ if e != nil {
42+ log .Println (e )
4243 w .WriteHeader (http .StatusNotFound )
4344 return
4445 }
45- io .Copy (w , stream )
46+ offset := utils .GetOffsetFromHeader (r .Header )
47+ if offset != 0 {
48+ stream .Seek (offset , io .SeekCurrent )
49+ w .Header ().Set ("content-range" , fmt .Sprintf ("bytes %d-%d/%d" , offset , meta .Size - 1 , meta .Size ))
50+ w .WriteHeader (http .StatusPartialContent )
51+ }
52+ acceptGzip := false
53+ encoding := r .Header ["Accept-Encoding" ]
54+ for i := range encoding {
55+ if encoding [i ] == "gzip" {
56+ acceptGzip = true
57+ break
58+ }
59+ }
60+ if acceptGzip {
61+ w .Header ().Set ("content-encoding" , "gzip" )
62+ w2 := gzip .NewWriter (w )
63+ io .Copy (w2 , stream )
64+ w2 .Close ()
65+ } else {
66+ io .Copy (w , stream )
67+ }
68+ stream .Close ()
4669}
0 commit comments