MCPcopy
hub / github.com/wavetermdev/waveterm / handleWaveFile

Function handleWaveFile

pkg/web/web.go:150–210  ·  view source on GitHub ↗
(w http.ResponseWriter, r *http.Request)

Source from the content-addressed store, hash-verified

148}
149
150func handleWaveFile(w http.ResponseWriter, r *http.Request) {
151 zoneId := r.URL.Query().Get("zoneid")
152 name := r.URL.Query().Get("name")
153 offsetStr := r.URL.Query().Get("offset")
154 var offset int64 = 0
155 if offsetStr != "" {
156 var err error
157 offset, err = strconv.ParseInt(offsetStr, 10, 64)
158 if err != nil {
159 http.Error(w, fmt.Sprintf("invalid offset: %v", err), http.StatusBadRequest)
160 }
161 }
162 if _, err := uuid.Parse(zoneId); err != nil {
163 http.Error(w, fmt.Sprintf("invalid zoneid: %v", err), http.StatusBadRequest)
164 return
165 }
166 if name == "" {
167 http.Error(w, "name is required", http.StatusBadRequest)
168 return
169
170 }
171 file, err := filestore.WFS.Stat(r.Context(), zoneId, name)
172 if err == fs.ErrNotExist {
173 w.WriteHeader(http.StatusNoContent)
174 return
175 }
176 if err != nil {
177 http.Error(w, fmt.Sprintf("error getting file info: %v", err), http.StatusInternalServerError)
178 return
179 }
180 jsonFileBArr, err := json.Marshal(file)
181 if err != nil {
182 http.Error(w, fmt.Sprintf("error serializing file info: %v", err), http.StatusInternalServerError)
183 }
184 // can make more efficient by checking modtime + If-Modified-Since headers to allow caching
185 dataStartIdx := file.DataStartIdx()
186 if offset >= dataStartIdx {
187 dataStartIdx = offset
188 }
189 w.Header().Set(ContentTypeHeaderKey, ContentTypeBinary)
190 w.Header().Set(ContentLengthHeaderKey, fmt.Sprintf("%d", file.Size-dataStartIdx))
191 w.Header().Set(WaveZoneFileInfoHeaderKey, base64.StdEncoding.EncodeToString(jsonFileBArr))
192 w.Header().Set(LastModifiedHeaderKey, time.UnixMilli(file.ModTs).UTC().Format(http.TimeFormat))
193 if dataStartIdx >= file.Size {
194 w.WriteHeader(http.StatusOK)
195 return
196 }
197 for offset := dataStartIdx; offset < file.Size; offset += filestore.DefaultPartDataSize {
198 _, data, err := filestore.WFS.ReadAt(r.Context(), zoneId, name, offset, filestore.DefaultPartDataSize)
199 if err != nil {
200 if offset == 0 {
201 http.Error(w, fmt.Sprintf("error reading file: %v", err), http.StatusInternalServerError)
202 } else {
203 // nothing to do, the headers have already been sent
204 log.Printf("error reading file %s/%s @ %d: %v\n", zoneId, name, offset, err)
205 }
206 return
207 }

Callers

nothing calls this directly

Calls 11

ParseMethod · 0.80
StatMethod · 0.80
DataStartIdxMethod · 0.80
ReadAtMethod · 0.80
WriteMethod · 0.65
GetMethod · 0.45
ErrorMethod · 0.45
ContextMethod · 0.45
WriteHeaderMethod · 0.45
SetMethod · 0.45
HeaderMethod · 0.45

Tested by

no test coverage detected