Skip to content

Commit 83d1e83

Browse files
committed
feat: switch ContentType from options pattern to fluent
1 parent 7777929 commit 83d1e83

4 files changed

Lines changed: 86 additions & 86 deletions

File tree

http/constants.go

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,19 @@ var (
2424
ResponseChunkDelimeter = []byte("0\r\n") // An http/1.1 chunk delimeter, used for specifying an early end to the response
2525
)
2626

27+
// ContentType represents a Content-Type descriptor for use with the response
28+
// Content-Type header or the request Accept header specifically for
29+
// Trustless Gateway requests and responses.
2730
type ContentType struct {
28-
Mime string
31+
MimeType string
2932
Order ContentTypeOrder
3033
Duplicates bool
3134
Quality float32
3235
}
3336

3437
func (ct ContentType) String() string {
3538
sb := strings.Builder{}
36-
sb.WriteString(ct.Mime)
39+
sb.WriteString(ct.MimeType)
3740
sb.WriteString(";version=")
3841
sb.WriteString(MimeTypeCarVersion)
3942
sb.WriteString(";order=")
@@ -51,37 +54,37 @@ func (ct ContentType) String() string {
5154
return sb.String()
5255
}
5356

54-
type ContentTypeOption func(ct *ContentType)
57+
// WithOrder returns a new ContentType with the specified order.
58+
func (ct ContentType) WithOrder(order ContentTypeOrder) ContentType {
59+
ct.Order = order
60+
return ct
61+
}
5562

56-
func WithContentTypeOrder(order ContentTypeOrder) ContentTypeOption {
57-
return func(ct *ContentType) {
58-
ct.Order = order
59-
}
63+
// WithDuplicates returns a new ContentType with the specified duplicates.
64+
func (ct ContentType) WithDuplicates(duplicates bool) ContentType {
65+
ct.Duplicates = duplicates
66+
return ct
6067
}
6168

62-
func WithContentTypeDuplicates(duplicates bool) ContentTypeOption {
63-
return func(ct *ContentType) {
64-
ct.Duplicates = duplicates
65-
}
69+
// WithMime returns a new ContentType with the specified mime type.
70+
func (ct ContentType) WithMimeType(mime string) ContentType {
71+
ct.MimeType = mime
72+
return ct
6673
}
6774

68-
func WithContentTypeQuality(quality float32) ContentTypeOption {
69-
return func(ct *ContentType) {
70-
ct.Quality = quality
71-
}
75+
// WithQuality returns a new ContentType with the specified quality.
76+
func (ct ContentType) WithQuality(quality float32) ContentType {
77+
ct.Quality = quality
78+
return ct
7279
}
7380

74-
func NewContentType(opt ...ContentTypeOption) ContentType {
75-
ct := ContentType{
76-
Mime: MimeTypeCar,
81+
func DefaultContentType() ContentType {
82+
return ContentType{
83+
MimeType: MimeTypeCar,
7784
Order: DefaultOrder,
7885
Duplicates: DefaultIncludeDupes,
7986
Quality: 1,
8087
}
81-
for _, o := range opt {
82-
o(&ct)
83-
}
84-
return ct
8588
}
8689

8790
// ResponseContentTypeHeader returns the value for the Content-Type header for a
@@ -90,9 +93,7 @@ func NewContentType(opt ...ContentTypeOption) ContentType {
9093
//
9194
// Deprecated: Use NewContentType().String() instead.
9295
func ResponseContentTypeHeader(duplicates bool) string {
93-
ct := NewContentType()
94-
ct.Duplicates = duplicates
95-
return ct.String()
96+
return DefaultContentType().WithDuplicates(duplicates).String()
9697
}
9798

9899
// RequestAcceptHeader returns the value for the Accept header for a Trustless

http/constants_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ func TestContentType(t *testing.T) {
1515
req.Equal("application/vnd.ipld.car;version=1;order=dfs;dups=n", trustlesshttp.ResponseContentTypeHeader(false))
1616
req.Equal("application/vnd.ipld.car;version=1;order=dfs;dups=n", trustlesshttp.RequestAcceptHeader(false))
1717

18-
req.Equal("application/vnd.ipld.car;version=1;order=dfs;dups=y", trustlesshttp.NewContentType().String())
19-
req.Equal("application/vnd.ipld.car;version=1;order=dfs;dups=y;q=0.8", trustlesshttp.NewContentType(trustlesshttp.WithContentTypeQuality(0.8)).String())
20-
req.Equal("application/vnd.ipld.car;version=1;order=dfs;dups=y;q=0.333", trustlesshttp.NewContentType(trustlesshttp.WithContentTypeQuality(1.0/3.0)).String())
21-
req.Equal("application/vnd.ipld.car;version=1;order=dfs;dups=y", trustlesshttp.NewContentType(trustlesshttp.WithContentTypeQuality(-1.0)).String())
22-
req.Equal("application/vnd.ipld.car;version=1;order=dfs;dups=n", trustlesshttp.NewContentType(trustlesshttp.WithContentTypeDuplicates(false)).String())
23-
req.Equal("application/vnd.ipld.car;version=1;order=unk;dups=n", trustlesshttp.NewContentType(trustlesshttp.WithContentTypeDuplicates(false), trustlesshttp.WithContentTypeOrder(trustlesshttp.ContentTypeOrderUnk)).String())
18+
req.Equal("application/vnd.ipld.car;version=1;order=dfs;dups=y", trustlesshttp.DefaultContentType().String())
19+
req.Equal("application/vnd.ipld.car;version=1;order=dfs;dups=y;q=0.8", trustlesshttp.DefaultContentType().WithQuality(0.8).String())
20+
req.Equal("application/vnd.ipld.car;version=1;order=dfs;dups=y;q=0.333", trustlesshttp.DefaultContentType().WithQuality(1.0/3.0).String())
21+
req.Equal("application/vnd.ipld.car;version=1;order=dfs;dups=y", trustlesshttp.DefaultContentType().WithQuality(-1.0).String())
22+
req.Equal("application/vnd.ipld.car;version=1;order=dfs;dups=n", trustlesshttp.DefaultContentType().WithDuplicates(false).String())
23+
req.Equal("application/vnd.ipld.car;version=1;order=unk;dups=n", trustlesshttp.DefaultContentType().WithDuplicates(false).WithOrder(trustlesshttp.ContentTypeOrderUnk).String())
2424
}

http/parse.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ func CheckFormat(req *http.Request) (ContentType, error) {
9797
}
9898

9999
if validFormat {
100-
return NewContentType(), nil // default is acceptable in this case (no accept but format=car)
100+
return DefaultContentType(), nil // default is acceptable in this case (no accept but format=car)
101101
}
102102

103103
return ContentType{}, fmt.Errorf("neither a valid Accept header nor format parameter were provided")
@@ -140,8 +140,7 @@ func parseContentType(header string, strictType bool) (ContentType, bool) {
140140
typeParts := strings.Split(header, ";")
141141
mime := strings.TrimSpace(typeParts[0])
142142
if mime == MimeTypeCar || (!strictType && (mime == "*/*" || mime == "application/*")) {
143-
contentType := NewContentType()
144-
contentType.Mime = mime
143+
contentType := DefaultContentType().WithMimeType(mime)
145144
// parse additional car attributes outlined in IPIP-412
146145
// https://specs.ipfs.tech/http-gateways/trustless-gateway/
147146
for _, nextPart := range typeParts[1:] {

http/parse_test.go

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -113,15 +113,15 @@ func TestCheckFormat(t *testing.T) {
113113
err string
114114
}{
115115
{"empty (err)", "", "", trustlesshttp.ContentType{}, "neither a valid Accept header nor format parameter were provided"},
116-
{"format=bop (err)", "", "format=bop", trustlesshttp.NewContentType(), "invalid format parameter; unsupported: \"bop\""},
117-
{"format=car", "", "format=car", trustlesshttp.NewContentType(), ""},
118-
{"plain accept", "application/vnd.ipld.car", "", trustlesshttp.NewContentType(), ""},
119-
{"accept dups", "application/vnd.ipld.car; dups=y", "", trustlesshttp.NewContentType(), ""},
120-
{"accept no dups", "application/vnd.ipld.car; dups=n", "", trustlesshttp.NewContentType(trustlesshttp.WithContentTypeDuplicates(false)), ""},
121-
{"accept no dups and cruft", "application/vnd.ipld.car; dups=n; bip; bop", "", trustlesshttp.NewContentType(trustlesshttp.WithContentTypeDuplicates(false)), ""},
122-
{"valid accept but format=bop (err)", "application/vnd.ipld.car; dups=y", "format=bop", trustlesshttp.NewContentType(), "invalid format parameter; unsupported: \"bop\""},
123-
{"valid accept but format=car", "application/vnd.ipld.car; dups=y", "format=car", trustlesshttp.NewContentType(), ""},
124-
{"invalid accept but format=car", "application/vnd.ipld.car; dups=YES!", "format=car", trustlesshttp.NewContentType(trustlesshttp.WithContentTypeDuplicates(false)), "invalid Accept header; unsupported"},
116+
{"format=bop (err)", "", "format=bop", trustlesshttp.DefaultContentType(), "invalid format parameter; unsupported: \"bop\""},
117+
{"format=car", "", "format=car", trustlesshttp.DefaultContentType(), ""},
118+
{"plain accept", "application/vnd.ipld.car", "", trustlesshttp.DefaultContentType(), ""},
119+
{"accept dups", "application/vnd.ipld.car; dups=y", "", trustlesshttp.DefaultContentType(), ""},
120+
{"accept no dups", "application/vnd.ipld.car; dups=n", "", trustlesshttp.DefaultContentType().WithDuplicates(false), ""},
121+
{"accept no dups and cruft", "application/vnd.ipld.car; dups=n; bip; bop", "", trustlesshttp.DefaultContentType().WithDuplicates(false), ""},
122+
{"valid accept but format=bop (err)", "application/vnd.ipld.car; dups=y", "format=bop", trustlesshttp.DefaultContentType(), "invalid format parameter; unsupported: \"bop\""},
123+
{"valid accept but format=car", "application/vnd.ipld.car; dups=y", "format=car", trustlesshttp.DefaultContentType(), ""},
124+
{"invalid accept but format=car", "application/vnd.ipld.car; dups=YES!", "format=car", trustlesshttp.DefaultContentType().WithDuplicates(false), "invalid Accept header; unsupported"},
125125
} {
126126
t.Run(tc.name, func(t *testing.T) {
127127
req := &http.Request{}
@@ -143,32 +143,32 @@ func TestCheckFormat(t *testing.T) {
143143

144144
func TestParseContentType(t *testing.T) {
145145
for _, tc := range []struct {
146-
name string
147-
accept string
148-
expectValidContentType bool
149-
expectDups bool
146+
name string
147+
accept string
148+
expectValid bool
149+
expectContentType trustlesshttp.ContentType
150150
}{
151-
{"empty (err)", "", false, false},
152-
{"plain", "application/vnd.ipld.car", true, true},
153-
{"*/*", "*/*", false, false},
154-
{"application/*", "application/*", false, false},
155-
{"dups", "application/vnd.ipld.car; dups=y", true, true},
156-
{"no dups", "application/vnd.ipld.car; dups=n", true, false},
157-
{"no dups and cruft", "application/vnd.ipld.car; dups=n; bip; bop", true, false},
158-
{"version=1", "application/vnd.ipld.car; version=1; dups=n", true, false},
159-
{"version=2", "application/vnd.ipld.car; version=2; dups=n", false, false},
160-
{"order=dfs", "application/vnd.ipld.car; order=dfs; dups=n", true, false},
161-
{"order=unk", "application/vnd.ipld.car; order=unk; dups=n", true, false},
162-
{"order=bork", "application/vnd.ipld.car; order=bork; dups=y", false, false},
163-
{"complete", "application/vnd.ipld.car; order=dfs; dups=y; version=1", true, true},
164-
{"complete (squish)", "application/vnd.ipld.car;order=dfs;dups=y;version=1", true, true},
165-
{"complete (shuffle)", "application/vnd.ipld.car;version=1;dups=y;order=dfs;", true, true},
166-
{"complete (cruft)", "application/vnd.ipld.car;;version=1; bip ; dups=n ;bop;order=dfs;--", true, false},
151+
{"empty (err)", "", false, trustlesshttp.ContentType{}},
152+
{"plain", "application/vnd.ipld.car", true, trustlesshttp.DefaultContentType()},
153+
{"*/*", "*/*", false, trustlesshttp.ContentType{}},
154+
{"application/*", "application/*", false, trustlesshttp.ContentType{}},
155+
{"dups", "application/vnd.ipld.car; dups=y", true, trustlesshttp.DefaultContentType()},
156+
{"no dups", "application/vnd.ipld.car; dups=n", true, trustlesshttp.DefaultContentType().WithDuplicates(false)},
157+
{"no dups and cruft", "application/vnd.ipld.car; dups=n; bip; bop", true, trustlesshttp.DefaultContentType().WithDuplicates(false)},
158+
{"version=1", "application/vnd.ipld.car; version=1; dups=n", true, trustlesshttp.DefaultContentType().WithDuplicates(false)},
159+
{"version=2", "application/vnd.ipld.car; version=2; dups=n", false, trustlesshttp.ContentType{}},
160+
{"order=dfs", "application/vnd.ipld.car; order=dfs; dups=n", true, trustlesshttp.DefaultContentType().WithDuplicates(false)},
161+
{"order=unk", "application/vnd.ipld.car; order=unk; dups=n", true, trustlesshttp.DefaultContentType().WithDuplicates(false).WithOrder(trustlesshttp.ContentTypeOrderUnk)},
162+
{"order=bork", "application/vnd.ipld.car; order=bork; dups=y", false, trustlesshttp.ContentType{}},
163+
{"complete", "application/vnd.ipld.car; order=dfs; dups=y; version=1", true, trustlesshttp.DefaultContentType()},
164+
{"complete (squish)", "application/vnd.ipld.car;order=dfs;dups=y;version=1", true, trustlesshttp.DefaultContentType()},
165+
{"complete (shuffle)", "application/vnd.ipld.car;version=1;dups=y;order=dfs;", true, trustlesshttp.DefaultContentType()},
166+
{"complete (cruft)", "application/vnd.ipld.car;;version=1; bip ; dups=n ;bop;order=dfs;--", true, trustlesshttp.DefaultContentType().WithDuplicates(false)},
167167
} {
168168
t.Run(tc.name, func(t *testing.T) {
169-
valid, dups := trustlesshttp.ParseContentType(tc.accept)
170-
require.Equal(t, tc.expectValidContentType, valid)
171-
require.Equal(t, tc.expectDups, dups)
169+
ct, valid := trustlesshttp.ParseContentType(tc.accept)
170+
require.Equal(t, tc.expectValid, valid)
171+
require.Equal(t, tc.expectContentType, ct)
172172
})
173173
}
174174
}
@@ -180,35 +180,35 @@ func TestParseAccept(t *testing.T) {
180180
expected []trustlesshttp.ContentType
181181
}{
182182
{"empty (err)", "", []trustlesshttp.ContentType{}},
183-
{"plain", "application/vnd.ipld.car", []trustlesshttp.ContentType{{Mime: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
184-
{"*/*", "*/*", []trustlesshttp.ContentType{{Mime: "*/*", Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
185-
{"application/*", "application/*", []trustlesshttp.ContentType{{Mime: "application/*", Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
186-
{"dups", "application/vnd.ipld.car; dups=y", []trustlesshttp.ContentType{{Mime: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
187-
{"no dups", "application/vnd.ipld.car; dups=n", []trustlesshttp.ContentType{{Mime: trustlesshttp.MimeTypeCar, Duplicates: false, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
188-
{"no dups and cruft", "application/vnd.ipld.car; dups=n; bip; bop", []trustlesshttp.ContentType{{Mime: trustlesshttp.MimeTypeCar, Duplicates: false, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
189-
{"version=1", "application/vnd.ipld.car; version=1; dups=n", []trustlesshttp.ContentType{{Mime: trustlesshttp.MimeTypeCar, Duplicates: false, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
183+
{"plain", "application/vnd.ipld.car", []trustlesshttp.ContentType{{MimeType: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
184+
{"*/*", "*/*", []trustlesshttp.ContentType{{MimeType: "*/*", Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
185+
{"application/*", "application/*", []trustlesshttp.ContentType{{MimeType: "application/*", Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
186+
{"dups", "application/vnd.ipld.car; dups=y", []trustlesshttp.ContentType{{MimeType: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
187+
{"no dups", "application/vnd.ipld.car; dups=n", []trustlesshttp.ContentType{{MimeType: trustlesshttp.MimeTypeCar, Duplicates: false, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
188+
{"no dups and cruft", "application/vnd.ipld.car; dups=n; bip; bop", []trustlesshttp.ContentType{{MimeType: trustlesshttp.MimeTypeCar, Duplicates: false, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
189+
{"version=1", "application/vnd.ipld.car; version=1; dups=n", []trustlesshttp.ContentType{{MimeType: trustlesshttp.MimeTypeCar, Duplicates: false, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
190190
{"version=2", "application/vnd.ipld.car; version=2; dups=n", []trustlesshttp.ContentType{}},
191-
{"order=dfs", "application/vnd.ipld.car; order=dfs; dups=n", []trustlesshttp.ContentType{{Mime: trustlesshttp.MimeTypeCar, Duplicates: false, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
192-
{"order=unk", "application/vnd.ipld.car; order=unk; dups=n", []trustlesshttp.ContentType{{Mime: trustlesshttp.MimeTypeCar, Duplicates: false, Order: trustlesshttp.ContentTypeOrderUnk, Quality: 1.0}}},
191+
{"order=dfs", "application/vnd.ipld.car; order=dfs; dups=n", []trustlesshttp.ContentType{{MimeType: trustlesshttp.MimeTypeCar, Duplicates: false, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
192+
{"order=unk", "application/vnd.ipld.car; order=unk; dups=n", []trustlesshttp.ContentType{{MimeType: trustlesshttp.MimeTypeCar, Duplicates: false, Order: trustlesshttp.ContentTypeOrderUnk, Quality: 1.0}}},
193193
{"order=bork", "application/vnd.ipld.car; order=bork; dups=y", []trustlesshttp.ContentType{}},
194-
{"complete", "application/vnd.ipld.car; order=dfs; dups=y; version=1", []trustlesshttp.ContentType{{Mime: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
195-
{"complete (squish)", "application/vnd.ipld.car;order=dfs;dups=y;version=1", []trustlesshttp.ContentType{{Mime: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
196-
{"complete (shuffle)", "application/vnd.ipld.car;version=1;dups=y;order=dfs;", []trustlesshttp.ContentType{{Mime: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
197-
{"complete (cruft)", "application/vnd.ipld.car;;version=1; bip ; dups=n ;bop;order=dfs;--", []trustlesshttp.ContentType{{Mime: trustlesshttp.MimeTypeCar, Duplicates: false, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
198-
{"q", "application/vnd.ipld.car; order=dfs; q=0.77; dups=n", []trustlesshttp.ContentType{{Mime: trustlesshttp.MimeTypeCar, Duplicates: false, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 0.77}}},
194+
{"complete", "application/vnd.ipld.car; order=dfs; dups=y; version=1", []trustlesshttp.ContentType{{MimeType: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
195+
{"complete (squish)", "application/vnd.ipld.car;order=dfs;dups=y;version=1", []trustlesshttp.ContentType{{MimeType: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
196+
{"complete (shuffle)", "application/vnd.ipld.car;version=1;dups=y;order=dfs;", []trustlesshttp.ContentType{{MimeType: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
197+
{"complete (cruft)", "application/vnd.ipld.car;;version=1; bip ; dups=n ;bop;order=dfs;--", []trustlesshttp.ContentType{{MimeType: trustlesshttp.MimeTypeCar, Duplicates: false, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0}}},
198+
{"q", "application/vnd.ipld.car; order=dfs; q=0.77; dups=n", []trustlesshttp.ContentType{{MimeType: trustlesshttp.MimeTypeCar, Duplicates: false, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 0.77}}},
199199
{"q=bork", "application/vnd.ipld.car; order=dfs; q=bork; dups=n", []trustlesshttp.ContentType{}},
200200
{"q=-1", "application/vnd.ipld.car; order=dfs; q=-0.1; dups=n", []trustlesshttp.ContentType{}},
201201

202202
{
203203
"ordered",
204204
"application/vnd.ipld.car;dups=n;order=unk;q=0.8, text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.1, application/vnd.ipld.car;dups=y;order=dfs;q=0.9 , application/vnd.ipld.car, application/vnd.ipld.car;dups=y;order=unk;q=0.7, application/vnd.ipld.car;dups=y;order=dfs;q=0.7",
205205
[]trustlesshttp.ContentType{
206-
{Mime: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0},
207-
{Mime: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 0.9},
208-
{Mime: trustlesshttp.MimeTypeCar, Duplicates: false, Order: trustlesshttp.ContentTypeOrderUnk, Quality: 0.8},
209-
{Mime: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderUnk, Quality: 0.7},
210-
{Mime: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 0.7},
211-
{Mime: "*/*", Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 0.1},
206+
{MimeType: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 1.0},
207+
{MimeType: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 0.9},
208+
{MimeType: trustlesshttp.MimeTypeCar, Duplicates: false, Order: trustlesshttp.ContentTypeOrderUnk, Quality: 0.8},
209+
{MimeType: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderUnk, Quality: 0.7},
210+
{MimeType: trustlesshttp.MimeTypeCar, Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 0.7},
211+
{MimeType: "*/*", Duplicates: true, Order: trustlesshttp.ContentTypeOrderDfs, Quality: 0.1},
212212
},
213213
},
214214
} {

0 commit comments

Comments
 (0)