本文整理汇总了Golang中github.com/bradfitz/http2.HeadersFrameParam.StreamID方法的典型用法代码示例。如果您正苦于以下问题:Golang HeadersFrameParam.StreamID方法的具体用法?Golang HeadersFrameParam.StreamID怎么用?Golang HeadersFrameParam.StreamID使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类github.com/bradfitz/http2.HeadersFrameParam
的用法示例。
在下文中一共展示了HeadersFrameParam.StreamID方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: StreamIdentifiersTestGroup
func StreamIdentifiersTestGroup(ctx *Context) *TestGroup {
tg := NewTestGroup("5.1.1", "Stream Identifiers")
tg.AddTestCase(NewTestCase(
"Sends even-numbered stream identifier",
"The endpoint MUST respond with a connection error of type PROTOCOL_ERROR.",
func(ctx *Context) (expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs := commonHeaderFields(ctx)
var hp http2.HeadersFrameParam
hp.StreamID = 2
hp.EndStream = true
hp.EndHeaders = true
hp.BlockFragment = http2Conn.EncodeHeader(hdrs)
http2Conn.fr.WriteHeaders(hp)
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestConnectionError(ctx, http2Conn, actualCodes)
},
))
if ctx.Strict {
tg.AddTestCase(NewTestCase(
"Sends stream identifier that is numerically smaller than previous",
"The endpoint MUST respond with a connection error of type PROTOCOL_ERROR.",
func(ctx *Context) (expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs := commonHeaderFields(ctx)
var hp1 http2.HeadersFrameParam
hp1.StreamID = 5
hp1.EndStream = true
hp1.EndHeaders = true
hp1.BlockFragment = http2Conn.EncodeHeader(hdrs)
http2Conn.fr.WriteHeaders(hp1)
var hp2 http2.HeadersFrameParam
hp2.StreamID = 3
hp2.EndStream = true
hp2.EndHeaders = true
hp2.BlockFragment = http2Conn.EncodeHeader(hdrs)
http2Conn.fr.WriteHeaders(hp2)
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestConnectionError(ctx, http2Conn, actualCodes)
},
))
}
return tg
}
示例2: PriorityTestGroup
func PriorityTestGroup(ctx *Context) *TestGroup {
tg := NewTestGroup("6.3", "PRIORITY")
tg.AddTestCase(NewTestCase(
"Sends a PRIORITY frame with 0x0 stream identifier",
"The endpoint MUST respond with a connection error of type PROTOCOL_ERROR.",
func(ctx *Context) (pass bool, expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs := commonHeaderFields(ctx)
var hp http2.HeadersFrameParam
hp.StreamID = 1
hp.EndStream = false
hp.EndHeaders = true
hp.BlockFragment = http2Conn.EncodeHeader(hdrs)
http2Conn.fr.WriteHeaders(hp)
// PRIORITY Frame
fmt.Fprintf(http2Conn.conn, "\x00\x00\x05\x02\x00\x00\x00\x00\x00")
fmt.Fprintf(http2Conn.conn, "\x80\x00\x00\x01\x0a")
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestConnectionError(ctx, http2Conn, actualCodes)
},
))
tg.AddTestCase(NewTestCase(
"Sends a PRIORITY frame with a length other than 5 octets",
"The endpoint MUST respond with a stream error of type FRAME_SIZE_ERROR.",
func(ctx *Context) (pass bool, expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs := commonHeaderFields(ctx)
var hp http2.HeadersFrameParam
hp.StreamID = 1
hp.EndStream = false
hp.EndHeaders = true
hp.BlockFragment = http2Conn.EncodeHeader(hdrs)
http2Conn.fr.WriteHeaders(hp)
// PRIORITY Frame
fmt.Fprintf(http2Conn.conn, "\x00\x00\x04\x02\x00\x00\x00\x00\x01")
fmt.Fprintf(http2Conn.conn, "\x80\x00\x00\x01")
actualCodes := []http2.ErrCode{http2.ErrCodeFrameSize}
return TestStreamError(ctx, http2Conn, actualCodes)
},
))
return tg
}
示例3: MalformedRequestsAndResponsesTestGroup
func MalformedRequestsAndResponsesTestGroup(ctx *Context) *TestGroup {
tg := NewTestGroup("8.1.2.6", "Malformed Requests and Responses")
tg.AddTestCase(NewTestCase(
"Sends a HEADERS frame that contains the \"content-length\" header field which does not equal the sum of the DATA frame payload lengths",
"The endpoint MUST respond with a stream error of type PROTOCOL_ERROR.",
func(ctx *Context) (pass bool, expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs := commonHeaderFields(ctx)
hdrs = append(hdrs, pair("content-length", "1"))
hdrs[0].Value = "POST"
var hp http2.HeadersFrameParam
hp.StreamID = 1
hp.EndStream = false
hp.EndHeaders = true
hp.BlockFragment = http2Conn.EncodeHeader(hdrs)
http2Conn.fr.WriteHeaders(hp)
http2Conn.fr.WriteData(1, true, []byte("test"))
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestStreamError(ctx, http2Conn, actualCodes)
},
))
tg.AddTestCase(NewTestCase(
"Sends a HEADERS frame that contains the \"content-length\" header field which does not equal the sum of the multiple DATA frame payload lengths",
"The endpoint MUST respond with a stream error of type PROTOCOL_ERROR.",
func(ctx *Context) (pass bool, expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs := commonHeaderFields(ctx)
hdrs = append(hdrs, pair("content-length", "1"))
hdrs[0].Value = "POST"
var hp http2.HeadersFrameParam
hp.StreamID = 1
hp.EndStream = false
hp.EndHeaders = true
hp.BlockFragment = http2Conn.EncodeHeader(hdrs)
http2Conn.fr.WriteHeaders(hp)
http2Conn.fr.WriteData(1, false, []byte("test"))
http2Conn.fr.WriteData(1, true, []byte("test"))
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestStreamError(ctx, http2Conn, actualCodes)
},
))
return tg
}
示例4: RequestPseudoHeaderFieldsTestGroup
func RequestPseudoHeaderFieldsTestGroup(ctx *Context) *TestGroup {
tg := NewTestGroup("8.1.2.3", "Request Pseudo-Header Fields")
tg.AddTestCase(NewTestCase(
"Sends a HEADERS frame that omits mandatory pseudo-header fields",
"The endpoint MUST respond with a stream error of type PROTOCOL_ERROR.",
func(ctx *Context) (pass bool, expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs := commonHeaderFields(ctx)
tmp := hdrs[0:2]
hdrs = append(tmp, hdrs[3])
var hp http2.HeadersFrameParam
hp.StreamID = 1
hp.EndStream = true
hp.EndHeaders = true
hp.BlockFragment = http2Conn.EncodeHeader(hdrs)
http2Conn.fr.WriteHeaders(hp)
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestStreamError(ctx, http2Conn, actualCodes)
},
))
tg.AddTestCase(NewTestCase(
"Sends a HEADERS frame containing more than one pseudo-header fields with the same name",
"The endpoint MUST respond with a stream error of type PROTOCOL_ERROR.",
func(ctx *Context) (pass bool, expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs1 := commonHeaderFields(ctx)
hdrs2 := commonHeaderFields(ctx)
hdrs := append(hdrs1, hdrs2...)
var hp http2.HeadersFrameParam
hp.StreamID = 1
hp.EndStream = true
hp.EndHeaders = true
hp.BlockFragment = http2Conn.EncodeHeader(hdrs)
http2Conn.fr.WriteHeaders(hp)
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestStreamError(ctx, http2Conn, actualCodes)
},
))
return tg
}
示例5: ConnectionSpecificHeaderFieldsTestGroup
func ConnectionSpecificHeaderFieldsTestGroup(ctx *Context) *TestGroup {
tg := NewTestGroup("8.1.2.2", "Connection-Specific Header Fields")
tg.AddTestCase(NewTestCase(
"Sends a HEADERS frame that contains the connection-specific header field",
"The endpoint MUST respond with a stream error of type PROTOCOL_ERROR.",
func(ctx *Context) (pass bool, expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs := commonHeaderFields(ctx)
hdrs = append(hdrs, pair("connection", "keep-alive"))
var hp http2.HeadersFrameParam
hp.StreamID = 1
hp.EndStream = true
hp.EndHeaders = true
hp.BlockFragment = http2Conn.EncodeHeader(hdrs)
http2Conn.fr.WriteHeaders(hp)
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestStreamError(ctx, http2Conn, actualCodes)
},
))
tg.AddTestCase(NewTestCase(
"Sends a HEADERS frame that contains the TE header field that contain any value other than \"trailers\"",
"The endpoint MUST respond with a stream error of type PROTOCOL_ERROR.",
func(ctx *Context) (pass bool, expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs := commonHeaderFields(ctx)
hdrs = append(hdrs, pair("trailers", "test"))
hdrs = append(hdrs, pair("te", "trailers, deflate"))
var hp http2.HeadersFrameParam
hp.StreamID = 1
hp.EndStream = true
hp.EndHeaders = true
hp.BlockFragment = http2Conn.EncodeHeader(hdrs)
http2Conn.fr.WriteHeaders(hp)
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestStreamError(ctx, http2Conn, actualCodes)
},
))
return tg
}
示例6: HttpHeaderFieldsTestGroup
func HttpHeaderFieldsTestGroup(ctx *Context) *TestGroup {
tg := NewTestGroup("8.1.2", "HTTP Header Fields")
tg.AddTestCase(NewTestCase(
"Sends a HEADERS frame that contains the header field name in uppercase letters",
"The endpoint MUST respond with a stream error of type PROTOCOL_ERROR.",
func(ctx *Context) (pass bool, expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs := commonHeaderFields(ctx)
hdrs = append(hdrs, pair("X-TEST", "test"))
var hp http2.HeadersFrameParam
hp.StreamID = 1
hp.EndStream = true
hp.EndHeaders = true
hp.BlockFragment = http2Conn.EncodeHeader(hdrs)
http2Conn.fr.WriteHeaders(hp)
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestStreamError(ctx, http2Conn, actualCodes)
},
))
tg.AddTestGroup(PseudoHeaderFieldsTestGroup(ctx))
tg.AddTestGroup(ConnectionSpecificHeaderFieldsTestGroup(ctx))
tg.AddTestGroup(RequestPseudoHeaderFieldsTestGroup(ctx))
tg.AddTestGroup(MalformedRequestsAndResponsesTestGroup(ctx))
return tg
}
示例7: FrameSizeTestGroup
func FrameSizeTestGroup(ctx *Context) *TestGroup {
tg := NewTestGroup("4.2", "Frame Size")
tg.AddTestCase(NewTestCase(
"Sends large size frame that exceeds the SETTINGS_MAX_FRAME_SIZE",
"The endpoint MUST send a FRAME_SIZE_ERROR error.",
func(ctx *Context) (pass bool, expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs := commonHeaderFields(ctx)
var hp http2.HeadersFrameParam
hp.StreamID = 1
hp.EndStream = false
hp.EndHeaders = true
hp.BlockFragment = http2Conn.EncodeHeader(hdrs)
http2Conn.fr.WriteHeaders(hp)
max_size, ok := http2Conn.Settings[http2.SettingMaxFrameSize]
if !ok {
max_size = 18384
}
http2Conn.fr.WriteData(1, true, []byte(dummyData(int(max_size)+1)))
actualCodes := []http2.ErrCode{http2.ErrCodeFrameSize}
return TestStreamError(ctx, http2Conn, actualCodes)
},
))
return tg
}
示例8: TestHTTPHeaderFields
func TestHTTPHeaderFields(ctx *Context) {
PrintHeader("8.1.2. HTTP Header Fields", 1)
func(ctx *Context) {
desc := "Sends a HEADERS frame that contains the header field name in uppercase letters"
msg := "the endpoint MUST respond with a stream error of type PROTOCOL_ERROR."
result := false
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
var buf bytes.Buffer
hdrs := []hpack.HeaderField{
pair(":method", "GET"),
pair(":scheme", "http"),
pair(":path", "/"),
pair(":authority", ctx.Authority()),
pair("X-TEST", "test"),
}
enc := hpack.NewEncoder(&buf)
for _, hf := range hdrs {
_ = enc.WriteField(hf)
}
var hp http2.HeadersFrameParam
hp.StreamID = 1
hp.EndStream = true
hp.EndHeaders = true
hp.BlockFragment = buf.Bytes()
http2Conn.fr.WriteHeaders(hp)
timeCh := time.After(3 * time.Second)
loop:
for {
select {
case f := <-http2Conn.dataCh:
rf, ok := f.(*http2.RSTStreamFrame)
if ok {
if rf.ErrCode == http2.ErrCodeProtocol {
result = true
break loop
}
}
case <-http2Conn.errCh:
break loop
case <-timeCh:
break loop
}
}
PrintResult(result, desc, msg, 1)
}(ctx)
TestPseudoHeaderFields(ctx)
TestConnectionSpecificHeaderFields(ctx)
TestRequestPseudoHeaderFields(ctx)
TestMalformedRequestsAndResponses(ctx)
}
示例9: RstStreamTestGroup
func RstStreamTestGroup(ctx *Context) *TestGroup {
tg := NewTestGroup("6.4", "RST_STREAM")
tg.AddTestCase(NewTestCase(
"Sends a RST_STREAM frame with 0x0 stream identifier",
"The endpoint MUST respond with a connection error of type PROTOCOL_ERROR.",
func(ctx *Context) (expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
http2Conn.fr.WriteRSTStream(0, http2.ErrCodeCancel)
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestConnectionError(ctx, http2Conn, actualCodes)
},
))
tg.AddTestCase(NewTestCase(
"Sends a RST_STREAM frame on a idle stream",
"The endpoint MUST respond with a connection error of type PROTOCOL_ERROR.",
func(ctx *Context) (expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
http2Conn.fr.WriteRSTStream(1, http2.ErrCodeCancel)
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestConnectionError(ctx, http2Conn, actualCodes)
},
))
tg.AddTestCase(NewTestCase(
"Sends a RST_STREAM frame with a length other than 4 octets",
"The endpoint MUST respond with a connection error of type FRAME_SIZE_ERROR.",
func(ctx *Context) (expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs := commonHeaderFields(ctx)
var hp http2.HeadersFrameParam
hp.StreamID = 1
hp.EndStream = false
hp.EndHeaders = true
hp.BlockFragment = http2Conn.EncodeHeader(hdrs)
http2Conn.fr.WriteHeaders(hp)
// RST_STREAM Frame
fmt.Fprintf(http2Conn.conn, "\x00\x00\x03\x03\x00\x00\x00\x00\x01")
fmt.Fprintf(http2Conn.conn, "\x00\x00\x00")
actualCodes := []http2.ErrCode{http2.ErrCodeFrameSize}
return TestConnectionError(ctx, http2Conn, actualCodes)
},
))
return tg
}
示例10: TestPriority
func TestPriority(ctx *Context) {
PrintHeader("6.3. PRIORITY", 0)
func(ctx *Context) {
desc := "Sends a PRIORITY frame with 0x0 stream identifier"
msg := "The endpoint MUST respond with a connection error of type PROTOCOL_ERROR."
result := false
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
var buf bytes.Buffer
hdrs := []hpack.HeaderField{
pair(":method", "GET"),
pair(":scheme", "http"),
pair(":path", "/"),
pair(":authority", ctx.Authority()),
}
enc := hpack.NewEncoder(&buf)
for _, hf := range hdrs {
_ = enc.WriteField(hf)
}
var hp http2.HeadersFrameParam
hp.StreamID = 1
hp.EndStream = false
hp.EndHeaders = true
hp.BlockFragment = buf.Bytes()
http2Conn.fr.WriteHeaders(hp)
fmt.Fprintf(http2Conn.conn, "\x00\x00\x05\x02\x00\x00\x00\x00\x00")
http2Conn.conn.Write(buf.Bytes())
fmt.Fprintf(http2Conn.conn, "\x80\x00\x00\x01\x0a")
timeCh := time.After(3 * time.Second)
loop:
for {
select {
case f := <-http2Conn.dataCh:
gf, ok := f.(*http2.GoAwayFrame)
if ok {
if gf.ErrCode == http2.ErrCodeProtocol {
result = true
}
}
case <-http2Conn.errCh:
break loop
case <-timeCh:
break loop
}
}
PrintResult(result, desc, msg, 0)
}(ctx)
PrintFooter()
}
示例11: TestMalformedRequestsAndResponses
func TestMalformedRequestsAndResponses(ctx *Context) {
PrintHeader("8.1.2.6. Malformed Requests and Responses", 2)
// 8.1.2.6. ボディを構成する DATA フレームペイロードの長さの合計が "content-length" ヘッダーフィールドの値と等しくない場合、リクエストやレスポンスは不正な形式になります。
func(ctx *Context) {
desc := "Sends a HEADERS frame that contains invalid \"content-length\" header field"
msg := "the endpoint MUST respond with a stream error of type PROTOCOL_ERROR."
result := false
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
var buf bytes.Buffer
hdrs := []hpack.HeaderField{
pair(":method", "POST"),
pair(":scheme", "http"),
pair(":path", "/"),
pair(":authority", ctx.Authority()),
pair("content-length", "1"),
}
enc := hpack.NewEncoder(&buf)
for _, hf := range hdrs {
_ = enc.WriteField(hf)
}
var hp http2.HeadersFrameParam
hp.StreamID = 1
hp.EndStream = false
hp.EndHeaders = true
hp.BlockFragment = buf.Bytes()
http2Conn.fr.WriteHeaders(hp)
http2Conn.fr.WriteData(1, true, []byte("test"))
timeCh := time.After(3 * time.Second)
loop:
for {
select {
case f := <-http2Conn.dataCh:
rf, ok := f.(*http2.RSTStreamFrame)
if ok {
if rf.ErrCode == http2.ErrCodeProtocol {
result = true
break loop
}
}
case <-http2Conn.errCh:
break loop
case <-timeCh:
break loop
}
}
PrintResult(result, desc, msg, 2)
}(ctx)
}
示例12: StreamDependenciesTestGroup
func StreamDependenciesTestGroup(ctx *Context) *TestGroup {
tg := NewTestGroup("5.3.1", "Stream Dependencies")
tg.AddTestCase(NewTestCase(
"Sends HEADERS frame that depend on itself",
"The endpoint MUST treat this as a stream error of type PROTOCOL_ERROR",
func(ctx *Context) (pass bool, expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs := commonHeaderFields(ctx)
var pp http2.PriorityParam
pp.StreamDep = 3
pp.Exclusive = false
pp.Weight = 255
var hp http2.HeadersFrameParam
hp.StreamID = 3
hp.EndStream = true
hp.EndHeaders = true
hp.Priority = pp
hp.BlockFragment = http2Conn.EncodeHeader(hdrs)
http2Conn.fr.WriteHeaders(hp)
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestStreamError(ctx, http2Conn, actualCodes)
},
))
tg.AddTestCase(NewTestCase(
"Sends PRIORITY frame that depend on itself",
"The endpoint MUST treat this as a stream error of type PROTOCOL_ERROR",
func(ctx *Context) (pass bool, expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
var pp http2.PriorityParam
pp.StreamDep = 2
pp.Exclusive = false
pp.Weight = 255
http2Conn.fr.WritePriority(2, pp)
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestStreamError(ctx, http2Conn, actualCodes)
},
))
return tg
}
示例13: StreamConcurrencyTestGroup
func StreamConcurrencyTestGroup(ctx *Context) *TestGroup {
tg := NewTestGroup("5.1.2", "Stream Concurrency")
tg.AddTestCase(NewTestCase(
"Sends HEADERS frames that causes their advertised concurrent stream limit to be exceeded",
"The endpoint MUST treat this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR or REFUSED_STREAM",
func(ctx *Context) (expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
// Skip this test when SETTINGS_MAX_CONCURRENT_STREAMS is unlimited.
_, ok := http2Conn.Settings[http2.SettingMaxConcurrentStreams]
if !ok {
actual = &ResultSkipped{"SETTINGS_MAX_CONCURRENT_STREAMS is unlimited."}
return nil, actual
}
// Set INITIAL_WINDOW_SIZE to zero to prevent the peer from closing the stream
settings := http2.Setting{http2.SettingInitialWindowSize, 0}
http2Conn.fr.WriteSettings(settings)
hdrs := commonHeaderFields(ctx)
hbf := http2Conn.EncodeHeader(hdrs)
var streamID uint32 = 1
for i := 0; i <= int(http2Conn.Settings[http2.SettingMaxConcurrentStreams]); i++ {
var hp http2.HeadersFrameParam
hp.StreamID = streamID
hp.EndStream = true
hp.EndHeaders = true
hp.BlockFragment = hbf
http2Conn.fr.WriteHeaders(hp)
streamID += 2
}
actualCodes := []http2.ErrCode{
http2.ErrCodeProtocol,
http2.ErrCodeRefusedStream,
}
return TestStreamError(ctx, http2Conn, actualCodes)
},
))
return tg
}
示例14: StreamStatesTestGroup
func StreamStatesTestGroup(ctx *Context) *TestGroup {
tg := NewTestGroup("5.1", "Stream States")
tg.AddTestCase(NewTestCase(
"idle: Sends a DATA frame",
"The endpoint MUST treat this as a connection error (Section 5.4.1) of type PROTOCOL_ERROR.",
func(ctx *Context) (expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
http2Conn.fr.WriteData(1, true, []byte("test"))
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestConnectionError(ctx, http2Conn, actualCodes)
},
))
tg.AddTestCase(NewTestCase(
"idle: Sends a RST_STREAM frame",
"The endpoint MUST treat this as a connection error (Section 5.4.1) of type PROTOCOL_ERROR.",
func(ctx *Context) (expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
http2Conn.fr.WriteRSTStream(1, http2.ErrCodeCancel)
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestConnectionError(ctx, http2Conn, actualCodes)
},
))
tg.AddTestCase(NewTestCase(
"idle: Sends a WINDOW_UPDATE frame",
"The endpoint MUST treat this as a connection error (Section 5.4.1) of type PROTOCOL_ERROR.",
func(ctx *Context) (expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
http2Conn.fr.WriteWindowUpdate(1, 100)
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestConnectionError(ctx, http2Conn, actualCodes)
},
))
tg.AddTestCase(NewTestCase(
"idle: Sends a CONTINUATION frame",
"The endpoint MUST treat this as a connection error (Section 5.4.1) of type PROTOCOL_ERROR.",
func(ctx *Context) (expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs := commonHeaderFields(ctx)
blockFragment := http2Conn.EncodeHeader(hdrs)
http2Conn.fr.WriteContinuation(1, true, blockFragment)
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestConnectionError(ctx, http2Conn, actualCodes)
},
))
tg.AddTestCase(NewTestCase(
"half closed (remote): Sends a DATA frame",
"The endpoint MUST respond with a stream error (Section 5.4.2) of type STREAM_CLOSED.",
func(ctx *Context) (expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs := commonHeaderFields(ctx)
blockFragment := http2Conn.EncodeHeader(hdrs)
var hp http2.HeadersFrameParam
hp.StreamID = 1
hp.EndStream = true
hp.EndHeaders = true
hp.BlockFragment = blockFragment
http2Conn.fr.WriteHeaders(hp)
http2Conn.fr.WriteData(1, true, []byte("test"))
actualCodes := []http2.ErrCode{http2.ErrCodeStreamClosed}
return TestStreamError(ctx, http2Conn, actualCodes)
},
))
tg.AddTestCase(NewTestCase(
"half closed (remote): Sends a HEADERS frame",
"The endpoint MUST respond with a stream error (Section 5.4.2) of type STREAM_CLOSED.",
func(ctx *Context) (expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs := commonHeaderFields(ctx)
blockFragment := http2Conn.EncodeHeader(hdrs)
var hp1 http2.HeadersFrameParam
hp1.StreamID = 1
hp1.EndStream = true
hp1.EndHeaders = true
//.........这里部分代码省略.........
示例15: ExtendingHttp2TestGroup
func ExtendingHttp2TestGroup(ctx *Context) *TestGroup {
tg := NewTestGroup("5.5", "Extending HTTP/2")
tg.AddTestCase(NewTestCase(
"Sends an unknown extension frame",
"The endpoint MUST discard frames that have unknown or unsupported types",
func(ctx *Context) (pass bool, expected []Result, actual Result) {
pass = false
expected = []Result{
&ResultFrame{LengthDefault, http2.FramePing, http2.FlagPingAck, ErrCodeDefault},
}
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
// Write a frame of type 0xFF, which isn't yet defined
// as an extension frame. This should be ignored; no GOAWAY,
// RST_STREAM or closing the connection should occur
http2Conn.fr.WriteRawFrame(0xFF, 0x00, 0, []byte("unknown"))
// Now send a normal PING frame, and if this is processed
// without error, then the preceeding unknown frame must have
// been processed and ignored.
data := [8]byte{'h', '2', 's', 'p', 'e', 'c'}
http2Conn.fr.WritePing(false, data)
loop:
for {
f, err := http2Conn.ReadFrame(ctx.Timeout)
if err != nil {
opErr, ok := err.(*net.OpError)
if err == io.EOF || (ok && opErr.Err == syscall.ECONNRESET) {
rf, ok := actual.(*ResultFrame)
if actual == nil || (ok && rf.Type != http2.FrameGoAway) {
actual = &ResultConnectionClose{}
}
} else if err == TIMEOUT {
if actual == nil {
actual = &ResultTestTimeout{}
}
} else {
actual = &ResultError{err}
}
break loop
}
switch f := f.(type) {
case *http2.PingFrame:
actual = CreateResultFrame(f)
if f.FrameHeader.Flags.Has(http2.FlagPingAck) {
pass = true
break loop
}
default:
actual = CreateResultFrame(f)
}
}
return pass, expected, actual
},
))
tg.AddTestCase(NewTestCase(
"Sends an unknown extension frame in the middle of a header block",
"The endpoint MUST treat as a connection error of type PROTOCOL_ERROR.",
func(ctx *Context) (pass bool, expected []Result, actual Result) {
http2Conn := CreateHttp2Conn(ctx, true)
defer http2Conn.conn.Close()
hdrs := commonHeaderFields(ctx)
hdrs = append(hdrs, pair("x-dummy1", dummyData(10000)))
hdrs = append(hdrs, pair("x-dummy2", dummyData(10000)))
blockFragment := http2Conn.EncodeHeader(hdrs)
var hp http2.HeadersFrameParam
hp.StreamID = 1
hp.EndStream = true
hp.EndHeaders = false
hp.BlockFragment = blockFragment[0:16384]
http2Conn.fr.WriteHeaders(hp)
http2Conn.fr.WriteRawFrame(0xFF, 0x01, 0, []byte("unknown"))
actualCodes := []http2.ErrCode{http2.ErrCodeProtocol}
return TestConnectionError(ctx, http2Conn, actualCodes)
},
))
return tg
}