package wire import ( "fmt" "smesh.lol/pkg/blossom" ) // BlossomWorker is the spawn target for the blossom blob-storage domain. // Reads BlossomRequest, performs file I/O, writes BlossomResponse. Loops // forever. Dir is carried in each request so the worker can lazily init. func BlossomWorker(in chan BlossomRequest, out chan BlossomResponse) { var srv *blossom.Server var srvDir string for { req, ok := <-in if !ok { return } dir := string(req.Dir) if srv == nil || dir != srvDir { var err error srv, err = blossom.New(dir) if err != nil { out <- BlossomResponse{ ReqID: req.ReqID, Status: 500, Body: []byte(fmt.Sprintf("blossom init: %v", err)), } continue } srvDir = dir } headers := map[string]string{"content-type": string(req.ContentType)} status, respHeaders, body := srv.HandleRawWithUpstream(string(req.Method), string(req.Path), headers, req.Body, string(req.Upstream)) resp := BlossomResponse{ReqID: req.ReqID, Status: int32(status)} if ct, ok := respHeaders["Content-Type"]; ok { resp.CT = []byte(ct) } if string(req.Method) == "HEAD" { if cl, ok := respHeaders["Content-Length"]; ok { n := int64(0) for i := 0; i < len(cl); i++ { c := cl[i] if c >= '0' && c <= '9' { n = n*10 + int64(c-'0') } } resp.Size = n } } resp.Body = body out <- resp } }