headers.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package jws
  2. import (
  3. "context"
  4. "github.com/lestrrat-go/iter/mapiter"
  5. "github.com/lestrrat-go/jwx/internal/iter"
  6. "github.com/pkg/errors"
  7. )
  8. // Iterate returns a channel that successively returns all the
  9. // header name and values.
  10. func (h *stdHeaders) Iterate(ctx context.Context) Iterator {
  11. pairs := h.makePairs()
  12. ch := make(chan *HeaderPair, len(pairs))
  13. go func(ctx context.Context, ch chan *HeaderPair, pairs []*HeaderPair) {
  14. defer close(ch)
  15. for _, pair := range pairs {
  16. select {
  17. case <-ctx.Done():
  18. return
  19. case ch <- pair:
  20. }
  21. }
  22. }(ctx, ch, pairs)
  23. return mapiter.New(ch)
  24. }
  25. func (h *stdHeaders) Walk(ctx context.Context, visitor Visitor) error {
  26. return iter.WalkMap(ctx, h, visitor)
  27. }
  28. func (h *stdHeaders) AsMap(ctx context.Context) (map[string]interface{}, error) {
  29. return iter.AsMap(ctx, h)
  30. }
  31. func (h *stdHeaders) Copy(ctx context.Context, dst Headers) error {
  32. for _, pair := range h.makePairs() {
  33. //nolint:forcetypeassert
  34. key := pair.Key.(string)
  35. if err := dst.Set(key, pair.Value); err != nil {
  36. return errors.Wrapf(err, `failed to set header %q`, key)
  37. }
  38. }
  39. return nil
  40. }
  41. // mergeHeaders merges two headers, and works even if the first Header
  42. // object is nil. This is not exported because ATM it felt like this
  43. // function is not frequently used, and MergeHeaders seemed a clunky name
  44. func mergeHeaders(ctx context.Context, h1, h2 Headers) (Headers, error) {
  45. h3 := NewHeaders()
  46. if h1 != nil {
  47. if err := h1.Copy(ctx, h3); err != nil {
  48. return nil, errors.Wrap(err, `failed to copy headers from first Header`)
  49. }
  50. }
  51. if h2 != nil {
  52. if err := h2.Copy(ctx, h3); err != nil {
  53. return nil, errors.Wrap(err, `failed to copy headers from second Header`)
  54. }
  55. }
  56. return h3, nil
  57. }
  58. func (h *stdHeaders) Merge(ctx context.Context, h2 Headers) (Headers, error) {
  59. return mergeHeaders(ctx, h, h2)
  60. }