-
Notifications
You must be signed in to change notification settings - Fork 0
/
request.go
126 lines (100 loc) · 2.65 KB
/
request.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package http
import (
"bytes"
"context"
"io"
"net/http"
"net/http/httptest"
"strings"
)
// Request is an alias of http.Request.
type Request = http.Request
// Header is an alias of http.Header.
type Header = http.Header
const (
// MethodGet is an alias of http.MethodGet.
MethodGet = http.MethodGet
// MethodPost is an alias of http.MethodPost.
MethodPost = http.MethodPost
// StatusOK is an alias of http.StatusOK.
StatusOK = http.StatusOK
// StatusCreated is an lias of http.StatusCreated.
StatusCreated = http.StatusCreated
)
type reader struct {
upstream io.Reader
readErr error
closeErr error
}
func (r *reader) Read(p []byte) (n int, err error) {
if r.readErr != nil {
return 0, r.readErr
}
return r.upstream.Read(p)
}
func (r *reader) Close() error {
return r.closeErr
}
func newReader(upstream io.Reader, readErr, closeErr error) *reader {
return &reader{
upstream: upstream,
readErr: readErr,
closeErr: closeErr,
}
}
// RequestBuilder is a builder that constructs a http request.
type RequestBuilder struct {
r *http.Request
}
// BuildRequest builds a Request.
// nolint: revive
func BuildRequest() *RequestBuilder {
return &RequestBuilder{
r: httptest.NewRequest(http.MethodGet, `/`, newReader(new(bytes.Buffer), nil, nil)),
}
}
func (b *RequestBuilder) clone() *RequestBuilder {
return &RequestBuilder{
r: b.r.Clone(context.Background()),
}
}
// WithMethod sets the http method.
func (b *RequestBuilder) WithMethod(method string) *RequestBuilder {
result := b.clone()
result.r.Method = method
return result
}
// WithURI sets the request uri.
func (b *RequestBuilder) WithURI(uri string) *RequestBuilder {
result := b.clone()
result.r.RequestURI = uri
return result
}
// WithHeader sets the request header.
func (b *RequestBuilder) WithHeader(key, value string) *RequestBuilder {
result := b.clone()
result.r.Header.Set(key, value)
return result
}
// WithBody sets the request body.
func (b *RequestBuilder) WithBody(body string) *RequestBuilder {
result := b.clone()
result.r.Body.(*reader).upstream = strings.NewReader(body)
return result
}
// WithBodyReadError sets the request body that returns an error while reading.
func (b *RequestBuilder) WithBodyReadError(err error) *RequestBuilder {
result := b.clone()
result.r.Body.(*reader).readErr = err
return result
}
// WithBodyCloseError sets the request body that returns an error while closing.
func (b *RequestBuilder) WithBodyCloseError(err error) *RequestBuilder {
result := b.clone()
result.r.Body.(*reader).closeErr = err
return result
}
// Build returns the request.
func (b *RequestBuilder) Build() *http.Request {
return b.r.Clone(context.Background())
}