code: func (r *WithAttrRequest) fromHTTP(req *http.Request) {
  	r.Signer = blob.ParseOrZero(req.FormValue("signer"))
  	r.Value = req.FormValue("value")
  	fuzzy := req.FormValue("fuzzy") // exact match if empty
  	fuzzyMatch := false
  	if fuzzy != "" {
  		lowered := strings.ToLower(fuzzy)
  		if lowered == "true" || lowered == "t" {
  			fuzzyMatch = true
  		}
  	}
  	r.Attr = req.FormValue("attr") // all attributes if empty
  	if r.Attr == "" {              // and force fuzzy in that case.
  		fuzzyMatch = true
  	}
  	r.Fuzzy = fuzzyMatch
  	max := req.FormValue("max")
  	if max != "" {
  		maxR, err := strconv.Atoi(max)
  		if err != nil {
  			panic(httputil.InvalidParameterError("max"))
  		}
  		r.N = maxR
  	}
  	r.N = r.n()
  	if at := req.FormValue("at"); at != "" {
  		r.At = time.Time(types.ParseTime3339OrZero(at))
  	}
  }
docs: // fromHTTP panics with an httputil value on failure