mirror of
https://github.com/soheilhy/cmux.git
synced 2025-10-18 05:08:08 +08:00
Compare commits
6 Commits
dev/go10
...
dev/settin
Author | SHA1 | Date | |
---|---|---|---|
|
e496b358da | ||
|
444ce56efe | ||
|
cfc68f9888 | ||
|
e96bd75f84 | ||
|
be5b383fd5 | ||
|
b9e684ba4e |
3
cmux.go
3
cmux.go
@@ -116,8 +116,9 @@ type cMux struct {
|
|||||||
func matchersToMatchWriters(matchers []Matcher) []MatchWriter {
|
func matchersToMatchWriters(matchers []Matcher) []MatchWriter {
|
||||||
mws := make([]MatchWriter, 0, len(matchers))
|
mws := make([]MatchWriter, 0, len(matchers))
|
||||||
for _, m := range matchers {
|
for _, m := range matchers {
|
||||||
|
cm := m
|
||||||
mws = append(mws, func(w io.Writer, r io.Reader) bool {
|
mws = append(mws, func(w io.Writer, r io.Reader) bool {
|
||||||
return m(r)
|
return cm(r)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return mws
|
return mws
|
||||||
|
35
cmux_test.go
35
cmux_test.go
@@ -81,7 +81,7 @@ func (l *chanListener) Accept() (net.Conn, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func testListener(t *testing.T) (net.Listener, func()) {
|
func testListener(t *testing.T) (net.Listener, func()) {
|
||||||
l, err := net.Listen("tcp", ":0")
|
l, err := net.Listen("tcp", "127.0.0.1:0")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -622,6 +622,35 @@ func TestErrorHandler(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMultipleMatchers(t *testing.T) {
|
||||||
|
defer leakCheck(t)()
|
||||||
|
errCh := make(chan error)
|
||||||
|
defer func() {
|
||||||
|
select {
|
||||||
|
case err := <-errCh:
|
||||||
|
t.Fatal(err)
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
l, cleanup := testListener(t)
|
||||||
|
defer cleanup()
|
||||||
|
|
||||||
|
matcher := func(r io.Reader) bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
unmatcher := func(r io.Reader) bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
muxl := New(l)
|
||||||
|
lis := muxl.Match(unmatcher, matcher, unmatcher)
|
||||||
|
|
||||||
|
go runTestHTTPServer(errCh, lis)
|
||||||
|
go safeServe(errCh, muxl)
|
||||||
|
|
||||||
|
runTestHTTP1Client(t, l.Addr())
|
||||||
|
}
|
||||||
|
|
||||||
func TestClose(t *testing.T) {
|
func TestClose(t *testing.T) {
|
||||||
defer leakCheck(t)()
|
defer leakCheck(t)()
|
||||||
errCh := make(chan error)
|
errCh := make(chan error)
|
||||||
@@ -659,7 +688,9 @@ func TestClose(t *testing.T) {
|
|||||||
if err != ErrListenerClosed {
|
if err != ErrListenerClosed {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if _, err := c2.Read([]byte{}); err != io.ErrClosedPipe {
|
// The error is either io.ErrClosedPipe or net.OpError wrapping
|
||||||
|
// a net.pipeError depending on the go version.
|
||||||
|
if _, err := c2.Read([]byte{}); !strings.Contains(err.Error(), "closed") {
|
||||||
t.Fatalf("connection is not closed and is leaked: %v", err)
|
t.Fatalf("connection is not closed and is leaked: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -240,6 +240,11 @@ func matchHTTP2Field(w io.Writer, r io.Reader, name string, matches func(string)
|
|||||||
|
|
||||||
switch f := f.(type) {
|
switch f := f.(type) {
|
||||||
case *http2.SettingsFrame:
|
case *http2.SettingsFrame:
|
||||||
|
// Sender acknoweldged the SETTINGS frame. No need to write
|
||||||
|
// SETTINGS again.
|
||||||
|
if f.IsAck() {
|
||||||
|
break
|
||||||
|
}
|
||||||
if err := framer.WriteSettings(); err != nil {
|
if err := framer.WriteSettings(); err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user