func runFunc(c context.Context, w http.ResponseWriter, req *http.Request) { defer req.Body.Close() var inv invocation if err := gob.NewDecoder(req.Body).Decode(&inv); err != nil { log.Errorf(c, "delay: failed decoding task payload: %v", err) log.Warningf(c, "delay: dropping task") return } f := funcs[inv.Key] if f == nil { log.Errorf(c, "delay: no func with key %q found", inv.Key) log.Warningf(c, "delay: dropping task") return } ft := f.fv.Type() in := []reflect.Value{reflect.ValueOf(c)} for _, arg := range inv.Args { var v reflect.Value if arg != nil { v = reflect.ValueOf(arg) } else { // Task was passed a nil argument, so we must construct // the zero value for the argument here. n := len(in) // we're constructing the nth argument var at reflect.Type if !ft.IsVariadic() || n < ft.NumIn()-1 { at = ft.In(n) } else { at = ft.In(ft.NumIn() - 1).Elem() } v = reflect.Zero(at) } in = append(in, v) } out := f.fv.Call(in) if n := ft.NumOut(); n > 0 && ft.Out(n-1) == errorType { if errv := out[n-1]; !errv.IsNil() { log.Errorf(c, "delay: func failed (will retry): %v", errv.Interface()) w.WriteHeader(http.StatusInternalServerError) return } } }
// Enabled returns whether an API's capabilities are enabled. // The wildcard "*" capability matches every capability of an API. // If the underlying RPC fails (if the package is unknown, for example), // false is returned and information is written to the application log. func Enabled(ctx context.Context, api, capability string) bool { req := &pb.IsEnabledRequest{ Package: &api, Capability: []string{capability}, } res := &pb.IsEnabledResponse{} if err := internal.Call(ctx, "capability_service", "IsEnabled", req, res); err != nil { log.Warningf(ctx, "capability.Enabled: RPC failed: %v", err) return false } switch *res.SummaryStatus { case pb.IsEnabledResponse_ENABLED, pb.IsEnabledResponse_SCHEDULED_FUTURE, pb.IsEnabledResponse_SCHEDULED_NOW: return true case pb.IsEnabledResponse_UNKNOWN: log.Errorf(ctx, "capability.Enabled: unknown API capability %s/%s", api, capability) return false default: return false } }