decode.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. // Copyright 2014 Alvaro J. Genial. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package form
  5. import (
  6. "fmt"
  7. "io"
  8. "io/ioutil"
  9. "net/url"
  10. "reflect"
  11. "strconv"
  12. "time"
  13. )
  14. // NewDecoder returns a new form Decoder.
  15. func NewDecoder(r io.Reader) *Decoder {
  16. return &Decoder{r, defaultDelimiter, defaultEscape, false, false}
  17. }
  18. // Decoder decodes data from a form (application/x-www-form-urlencoded).
  19. type Decoder struct {
  20. r io.Reader
  21. d rune
  22. e rune
  23. ignoreUnknown bool
  24. ignoreCase bool
  25. }
  26. // DelimitWith sets r as the delimiter used for composite keys by Decoder d and returns the latter; it is '.' by default.
  27. func (d *Decoder) DelimitWith(r rune) *Decoder {
  28. d.d = r
  29. return d
  30. }
  31. // EscapeWith sets r as the escape used for delimiters (and to escape itself) by Decoder d and returns the latter; it is '\\' by default.
  32. func (d *Decoder) EscapeWith(r rune) *Decoder {
  33. d.e = r
  34. return d
  35. }
  36. // Decode reads in and decodes form-encoded data into dst.
  37. func (d Decoder) Decode(dst interface{}) error {
  38. bs, err := ioutil.ReadAll(d.r)
  39. if err != nil {
  40. return err
  41. }
  42. vs, err := url.ParseQuery(string(bs))
  43. if err != nil {
  44. return err
  45. }
  46. v := reflect.ValueOf(dst)
  47. return d.decodeNode(v, parseValues(d.d, d.e, vs, canIndexOrdinally(v)))
  48. }
  49. // IgnoreUnknownKeys if set to true it will make the Decoder ignore values
  50. // that are not found in the destination object instead of returning an error.
  51. func (d *Decoder) IgnoreUnknownKeys(ignoreUnknown bool) {
  52. d.ignoreUnknown = ignoreUnknown
  53. }
  54. // IgnoreCase if set to true it will make the Decoder try to set values in the
  55. // destination object even if the case does not match.
  56. func (d *Decoder) IgnoreCase(ignoreCase bool) {
  57. d.ignoreCase = ignoreCase
  58. }
  59. // DecodeString decodes src into dst.
  60. func (d Decoder) DecodeString(dst interface{}, src string) error {
  61. vs, err := url.ParseQuery(src)
  62. if err != nil {
  63. return err
  64. }
  65. v := reflect.ValueOf(dst)
  66. return d.decodeNode(v, parseValues(d.d, d.e, vs, canIndexOrdinally(v)))
  67. }
  68. // DecodeValues decodes vs into dst.
  69. func (d Decoder) DecodeValues(dst interface{}, vs url.Values) error {
  70. v := reflect.ValueOf(dst)
  71. return d.decodeNode(v, parseValues(d.d, d.e, vs, canIndexOrdinally(v)))
  72. }
  73. // DecodeString decodes src into dst.
  74. func DecodeString(dst interface{}, src string) error {
  75. return NewDecoder(nil).DecodeString(dst, src)
  76. }
  77. // DecodeValues decodes vs into dst.
  78. func DecodeValues(dst interface{}, vs url.Values) error {
  79. return NewDecoder(nil).DecodeValues(dst, vs)
  80. }
  81. func (d Decoder) decodeNode(v reflect.Value, n node) (err error) {
  82. defer func() {
  83. if e := recover(); e != nil {
  84. err = fmt.Errorf("%v", e)
  85. }
  86. }()
  87. if v.Kind() == reflect.Slice {
  88. return fmt.Errorf("could not decode directly into slice; use pointer to slice")
  89. }
  90. d.decodeValue(v, n)
  91. return nil
  92. }
  93. func (d Decoder) decodeValue(v reflect.Value, x interface{}) {
  94. t := v.Type()
  95. k := v.Kind()
  96. if k == reflect.Ptr && v.IsNil() {
  97. v.Set(reflect.New(t.Elem()))
  98. }
  99. if unmarshalValue(v, x) {
  100. return
  101. }
  102. empty := isEmpty(x)
  103. switch k {
  104. case reflect.Ptr:
  105. d.decodeValue(v.Elem(), x)
  106. return
  107. case reflect.Interface:
  108. if !v.IsNil() {
  109. d.decodeValue(v.Elem(), x)
  110. return
  111. } else if empty {
  112. return // Allow nil interfaces only if empty.
  113. } else {
  114. panic("form: cannot decode non-empty value into into nil interface")
  115. }
  116. }
  117. if empty {
  118. v.Set(reflect.Zero(t)) // Treat the empty string as the zero value.
  119. return
  120. }
  121. switch k {
  122. case reflect.Struct:
  123. if t.ConvertibleTo(timeType) {
  124. d.decodeTime(v, x)
  125. } else if t.ConvertibleTo(urlType) {
  126. d.decodeURL(v, x)
  127. } else {
  128. d.decodeStruct(v, x)
  129. }
  130. case reflect.Slice:
  131. d.decodeSlice(v, x)
  132. case reflect.Array:
  133. d.decodeArray(v, x)
  134. case reflect.Map:
  135. d.decodeMap(v, x)
  136. case reflect.Invalid, reflect.Uintptr, reflect.UnsafePointer, reflect.Chan, reflect.Func:
  137. panic(t.String() + " has unsupported kind " + k.String())
  138. default:
  139. d.decodeBasic(v, x)
  140. }
  141. }
  142. func (d Decoder) decodeStruct(v reflect.Value, x interface{}) {
  143. t := v.Type()
  144. for k, c := range getNode(x) {
  145. if f, ok := findField(v, k, d.ignoreCase); !ok && k == "" {
  146. panic(getString(x) + " cannot be decoded as " + t.String())
  147. } else if !ok {
  148. if !d.ignoreUnknown {
  149. panic(k + " doesn't exist in " + t.String())
  150. }
  151. } else if !f.CanSet() {
  152. panic(k + " cannot be set in " + t.String())
  153. } else {
  154. d.decodeValue(f, c)
  155. }
  156. }
  157. }
  158. func (d Decoder) decodeMap(v reflect.Value, x interface{}) {
  159. t := v.Type()
  160. if v.IsNil() {
  161. v.Set(reflect.MakeMap(t))
  162. }
  163. for k, c := range getNode(x) {
  164. i := reflect.New(t.Key()).Elem()
  165. d.decodeValue(i, k)
  166. w := v.MapIndex(i)
  167. if w.IsValid() { // We have an actual element value to decode into.
  168. if w.Kind() == reflect.Interface {
  169. w = w.Elem()
  170. }
  171. w = reflect.New(w.Type()).Elem()
  172. } else if t.Elem().Kind() != reflect.Interface { // The map's element type is concrete.
  173. w = reflect.New(t.Elem()).Elem()
  174. } else {
  175. // The best we can do here is to decode as either a string (for scalars) or a map[string]interface {} (for the rest).
  176. // We could try to guess the type based on the string (e.g. true/false => bool) but that'll get ugly fast,
  177. // especially if we have to guess the kind (slice vs. array vs. map) and index type (e.g. string, int, etc.)
  178. switch c.(type) {
  179. case node:
  180. w = reflect.MakeMap(stringMapType)
  181. case string:
  182. w = reflect.New(stringType).Elem()
  183. default:
  184. panic("value is neither node nor string")
  185. }
  186. }
  187. d.decodeValue(w, c)
  188. v.SetMapIndex(i, w)
  189. }
  190. }
  191. func (d Decoder) decodeArray(v reflect.Value, x interface{}) {
  192. t := v.Type()
  193. for k, c := range getNode(x) {
  194. i, err := strconv.Atoi(k)
  195. if err != nil {
  196. panic(k + " is not a valid index for type " + t.String())
  197. }
  198. if l := v.Len(); i >= l {
  199. panic("index is above array size")
  200. }
  201. d.decodeValue(v.Index(i), c)
  202. }
  203. }
  204. func (d Decoder) decodeSlice(v reflect.Value, x interface{}) {
  205. t := v.Type()
  206. if t.Elem().Kind() == reflect.Uint8 {
  207. // Allow, but don't require, byte slices to be encoded as a single string.
  208. if s, ok := x.(string); ok {
  209. v.SetBytes([]byte(s))
  210. return
  211. }
  212. }
  213. // NOTE: Implicit indexing is currently done at the parseValues level,
  214. // so if if an implicitKey reaches here it will always replace the last.
  215. implicit := 0
  216. for k, c := range getNode(x) {
  217. var i int
  218. if k == implicitKey {
  219. i = implicit
  220. implicit++
  221. } else {
  222. explicit, err := strconv.Atoi(k)
  223. if err != nil {
  224. panic(k + " is not a valid index for type " + t.String())
  225. }
  226. i = explicit
  227. implicit = explicit + 1
  228. }
  229. // "Extend" the slice if it's too short.
  230. if l := v.Len(); i >= l {
  231. delta := i - l + 1
  232. v.Set(reflect.AppendSlice(v, reflect.MakeSlice(t, delta, delta)))
  233. }
  234. d.decodeValue(v.Index(i), c)
  235. }
  236. }
  237. func (d Decoder) decodeBasic(v reflect.Value, x interface{}) {
  238. t := v.Type()
  239. switch k, s := t.Kind(), getString(x); k {
  240. case reflect.Bool:
  241. if b, e := strconv.ParseBool(s); e == nil {
  242. v.SetBool(b)
  243. } else {
  244. panic("could not parse bool from " + strconv.Quote(s))
  245. }
  246. case reflect.Int,
  247. reflect.Int8,
  248. reflect.Int16,
  249. reflect.Int32,
  250. reflect.Int64:
  251. if i, e := strconv.ParseInt(s, 10, 64); e == nil {
  252. v.SetInt(i)
  253. } else {
  254. panic("could not parse int from " + strconv.Quote(s))
  255. }
  256. case reflect.Uint,
  257. reflect.Uint8,
  258. reflect.Uint16,
  259. reflect.Uint32,
  260. reflect.Uint64:
  261. if u, e := strconv.ParseUint(s, 10, 64); e == nil {
  262. v.SetUint(u)
  263. } else {
  264. panic("could not parse uint from " + strconv.Quote(s))
  265. }
  266. case reflect.Float32,
  267. reflect.Float64:
  268. if f, e := strconv.ParseFloat(s, 64); e == nil {
  269. v.SetFloat(f)
  270. } else {
  271. panic("could not parse float from " + strconv.Quote(s))
  272. }
  273. case reflect.Complex64,
  274. reflect.Complex128:
  275. var c complex128
  276. if n, err := fmt.Sscanf(s, "%g", &c); n == 1 && err == nil {
  277. v.SetComplex(c)
  278. } else {
  279. panic("could not parse complex from " + strconv.Quote(s))
  280. }
  281. case reflect.String:
  282. v.SetString(s)
  283. default:
  284. panic(t.String() + " has unsupported kind " + k.String())
  285. }
  286. }
  287. func (d Decoder) decodeTime(v reflect.Value, x interface{}) {
  288. t := v.Type()
  289. s := getString(x)
  290. // TODO: Find a more efficient way to do this.
  291. for _, f := range allowedTimeFormats {
  292. if p, err := time.Parse(f, s); err == nil {
  293. v.Set(reflect.ValueOf(p).Convert(v.Type()))
  294. return
  295. }
  296. }
  297. panic("cannot decode string `" + s + "` as " + t.String())
  298. }
  299. func (d Decoder) decodeURL(v reflect.Value, x interface{}) {
  300. t := v.Type()
  301. s := getString(x)
  302. if u, err := url.Parse(s); err == nil {
  303. v.Set(reflect.ValueOf(*u).Convert(v.Type()))
  304. return
  305. }
  306. panic("cannot decode string `" + s + "` as " + t.String())
  307. }
  308. var allowedTimeFormats = []string{
  309. "2006-01-02T15:04:05.999999999Z07:00",
  310. "2006-01-02T15:04:05.999999999Z07",
  311. "2006-01-02T15:04:05.999999999Z",
  312. "2006-01-02T15:04:05.999999999",
  313. "2006-01-02T15:04:05Z07:00",
  314. "2006-01-02T15:04:05Z07",
  315. "2006-01-02T15:04:05Z",
  316. "2006-01-02T15:04:05",
  317. "2006-01-02T15:04Z",
  318. "2006-01-02T15:04",
  319. "2006-01-02T15Z",
  320. "2006-01-02T15",
  321. "2006-01-02",
  322. "2006-01",
  323. "2006",
  324. "15:04:05.999999999Z07:00",
  325. "15:04:05.999999999Z07",
  326. "15:04:05.999999999Z",
  327. "15:04:05.999999999",
  328. "15:04:05Z07:00",
  329. "15:04:05Z07",
  330. "15:04:05Z",
  331. "15:04:05",
  332. "15:04Z",
  333. "15:04",
  334. "15Z",
  335. "15",
  336. }