okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
57b8eb0
main
1package daemon 2 3import ( 4"context" 5"encoding/json" 6"errors" 7"net/http" 8"time" 9) 10 11// executeMutation validates after requestBytes finishes authentication recovery. 12// Covered operations apply receipt recovery around this single attempt. 13func executeMutation (ctx context.Context ,conn * Connection ,operation operation ,statuses []int ,decode func ([]byte ,int )error )error { 14if conn == nil { 15return errors .New ("not connected to Albedo" ) 16 } 17if ctx == nil { 18ctx = context .Background () 19 } 20timeout := operation .Timeout 21if timeout <= 0 { 22timeout = 20 * time .Second 23 } 24reqCtx ,cancel := context .WithTimeout (ctx ,timeout ) 25defer cancel () 26status := 0 27body ,err := requestBytes (reqCtx ,conn ,operation ,responseLimits {successStatuses :statuses ,status :& status ,bodyBytes :1024 * 1024 ,errorBytes :64 * 1024 }) 28if err != nil { 29return err 30 } 31if err = decode (body ,status );err != nil { 32field := "" 33if detail ,ok := errors.AsType [* responseFieldError ](err );ok { 34field = detail .field 35 }else if detail ,ok := errors.AsType [* json.UnmarshalTypeError ](err );ok { 36field = detail .Field 37 } 38return invalidResponse (operation ,field ,err ) 39 } 40return nil 41} 42 43func executeRead (ctx context.Context ,conn * Connection ,operation operation ,decode func ([]byte )error )error { 44if conn == nil { 45return errors .New ("not connected to Albedo" ) 46 } 47if ctx == nil { 48ctx = context .Background () 49 } 50requestCtx ,cancel := context .WithTimeout (ctx ,20 * time .Second ) 51defer cancel () 52body ,err := requestBytes (requestCtx ,conn ,operation ,responseLimits {successStatus :http .StatusOK ,bodyBytes :1024 * 1024 ,errorBytes :64 * 1024 }) 53if err != nil { 54return err 55 } 56if err = decode (body );err != nil { 57field := "" 58if detail ,ok := errors.AsType [* responseFieldError ](err );ok { 59field = detail .field 60 }else if detail ,ok := errors.AsType [* json.UnmarshalTypeError ](err );ok { 61field = detail .Field 62 } 63return & ProtocolError {Code :"invalid_response" ,Operation :operation .Name ,Field :field ,Cause :err } 64 } 65return nil 66}