slidge-whatsapp 0.2.7__cp312-cp312-manylinux_2_36_aarch64.whl → 0.3.0__cp312-cp312-manylinux_2_36_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of slidge-whatsapp might be problematic. Click here for more details.
- slidge_whatsapp/contact.py +15 -3
- slidge_whatsapp/event.go +144 -48
- slidge_whatsapp/gateway.go +7 -63
- slidge_whatsapp/gateway.py +2 -3
- slidge_whatsapp/generated/_whatsapp.cpython-312-aarch64-linux-gnu.h +146 -129
- slidge_whatsapp/generated/_whatsapp.cpython-312-aarch64-linux-gnu.so +0 -0
- slidge_whatsapp/generated/build.py +114 -100
- slidge_whatsapp/generated/whatsapp.c +1309 -1037
- slidge_whatsapp/generated/whatsapp.go +779 -668
- slidge_whatsapp/generated/whatsapp.py +1168 -1043
- slidge_whatsapp/generated/whatsapp_go.h +146 -129
- slidge_whatsapp/go.mod +18 -15
- slidge_whatsapp/go.sum +38 -26
- slidge_whatsapp/group.py +34 -30
- slidge_whatsapp/media/media.go +1 -1
- slidge_whatsapp/session.go +34 -17
- slidge_whatsapp/session.py +46 -14
- slidge_whatsapp/vendor/github.com/beeper/argo-go/LICENSE +9 -0
- slidge_whatsapp/vendor/github.com/beeper/argo-go/block/blockreader.go +329 -0
- slidge_whatsapp/vendor/github.com/beeper/argo-go/block/blockwriter.go +417 -0
- slidge_whatsapp/vendor/github.com/beeper/argo-go/codec/decoder.go +652 -0
- slidge_whatsapp/vendor/github.com/beeper/argo-go/codec/encoder.go +985 -0
- slidge_whatsapp/vendor/github.com/beeper/argo-go/header/header.go +135 -0
- slidge_whatsapp/vendor/github.com/beeper/argo-go/internal/util/util.go +133 -0
- slidge_whatsapp/vendor/github.com/beeper/argo-go/label/label.go +384 -0
- slidge_whatsapp/vendor/github.com/beeper/argo-go/label/wiremarkers.go +37 -0
- slidge_whatsapp/vendor/github.com/beeper/argo-go/pkg/bitset/bitset.go +197 -0
- slidge_whatsapp/vendor/github.com/beeper/argo-go/pkg/buf/buf.go +420 -0
- slidge_whatsapp/vendor/github.com/beeper/argo-go/pkg/varint/varint.go +246 -0
- slidge_whatsapp/vendor/github.com/beeper/argo-go/wire/wire.go +614 -0
- slidge_whatsapp/vendor/github.com/beeper/argo-go/wirecodec/decode.go +341 -0
- slidge_whatsapp/vendor/github.com/elliotchance/orderedmap/v3/LICENSE +21 -0
- slidge_whatsapp/vendor/github.com/elliotchance/orderedmap/v3/list.go +95 -0
- slidge_whatsapp/vendor/github.com/elliotchance/orderedmap/v3/orderedmap.go +187 -0
- slidge_whatsapp/vendor/github.com/gen2brain/go-fitz/fitz.go +1 -0
- slidge_whatsapp/vendor/github.com/gen2brain/go-fitz/fitz_cgo.go +3 -0
- slidge_whatsapp/vendor/github.com/gen2brain/go-fitz/fitz_nocgo.go +4 -5
- slidge_whatsapp/vendor/github.com/gen2brain/go-fitz/purego_darwin.go +11 -1
- slidge_whatsapp/vendor/github.com/gen2brain/go-fitz/purego_linux.go +10 -0
- slidge_whatsapp/vendor/github.com/gen2brain/go-fitz/purego_windows.go +12 -0
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/.gitignore +0 -2
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/CHANGELOG.md +30 -0
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/COPYRIGHT.txt +6 -1
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/README.md +14 -17
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/abi.go +1 -1
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/abi2.go +7 -0
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/assets/libffi/LICENSE +21 -0
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/assets/libffi/darwin_amd64/libffi.8.dylib +0 -0
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/assets/libffi/darwin_arm64/libffi.8.dylib +0 -0
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/assets/libffi/windows_amd64/libffi-8.dll +0 -0
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/cif.go +15 -0
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/cif_arm64.go +16 -0
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/embed.go +49 -0
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/embed_darwin_amd64.go +10 -0
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/embed_darwin_arm64.go +10 -0
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/embed_windows_amd64.go +10 -0
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/ffi.go +51 -13
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/init.go +22 -9
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/README.md +2 -0
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c +3096 -1651
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h +188 -128
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_userauth.go +13 -140
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3ext.h +4 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.23.go +2 -2
- slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.25.go +37 -0
- slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/LICENSE +19 -0
- slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/argmap.go +37 -0
- slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/collections.go +148 -0
- slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/comment.go +31 -0
- slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/decode.go +216 -0
- slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/definition.go +110 -0
- slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/directive.go +43 -0
- slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/document.go +89 -0
- slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/dumper.go +159 -0
- slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/fragment.go +41 -0
- slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/operation.go +32 -0
- slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/path.go +72 -0
- slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/selection.go +41 -0
- slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/source.go +19 -0
- slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/type.go +68 -0
- slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/value.go +122 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exhttp/handleerrors.go +60 -26
- slidge_whatsapp/vendor/go.mau.fi/util/exhttp/networkerror.go +2 -1
- slidge_whatsapp/vendor/go.mau.fi/util/exstrings/stringutil.go +28 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exsync/event.go +19 -3
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/.pre-commit-config.yaml +3 -3
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/decode.go +1 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/hash.go +1 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate.go +5 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/argo/argo-wire-type-store.argo +63 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/argo/argo.go +62 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/argo/name-to-queryids.json +306 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/armadillomessage.go +3 -2
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/call.go +1 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/client.go +15 -18
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/connectionevents.go +5 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download.go +4 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/errors.go +3 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/group.go +97 -25
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/internals.go +22 -10
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/message.go +10 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/msgsecret.go +2 -14
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/newsletter.go +83 -7
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/notification.go +5 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/pair-code.go +2 -2
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/presence.go +15 -6
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waBotMetadata/WABotMetadata.pb.go +5156 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waBotMetadata/WABotMetadata.proto +516 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/WACompanionReg.pb.go +30 -3
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/WACompanionReg.proto +3 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.pb.go +8532 -11526
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.proto +132 -438
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.pb.go +52 -23
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.proto +3 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waStatusAttributions/WAStatusAttributions.pb.go +225 -73
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waStatusAttributions/WAStatusAttributions.proto +21 -5
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.pb.go +884 -441
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.proto +40 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.pb.go +60 -38
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.proto +3 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/receipt.go +8 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/send.go +6 -4
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/clientpayload.go +1 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/noop.go +3 -2
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/store.go +25 -5
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/store.go +3 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/call.go +1 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/events/events.go +8 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/jid.go +2 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/user.go +2 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/user.go +12 -8
- slidge_whatsapp/vendor/golang.org/x/crypto/curve25519/curve25519.go +1 -1
- slidge_whatsapp/vendor/golang.org/x/net/http2/config.go +44 -2
- slidge_whatsapp/vendor/golang.org/x/net/http2/gotrack.go +14 -3
- slidge_whatsapp/vendor/golang.org/x/net/http2/http2.go +7 -29
- slidge_whatsapp/vendor/golang.org/x/net/http2/server.go +53 -71
- slidge_whatsapp/vendor/golang.org/x/net/http2/transport.go +20 -74
- slidge_whatsapp/vendor/golang.org/x/sys/unix/affinity_linux.go +1 -3
- slidge_whatsapp/vendor/golang.org/x/sys/unix/mkerrors.sh +3 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/syscall_darwin.go +1 -55
- slidge_whatsapp/vendor/golang.org/x/sys/unix/syscall_solaris.go +1 -1
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zerrors_linux.go +47 -16
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +3 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +3 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +3 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +3 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go +3 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +3 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +3 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +3 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +3 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go +3 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +3 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +3 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +3 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +3 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +3 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +4 -4
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go +1 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +1 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +1 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +1 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go +1 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +1 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +1 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +1 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +1 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go +1 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +1 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +1 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +1 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +1 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +1 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/ztypes_linux.go +168 -12
- slidge_whatsapp/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +17 -1
- slidge_whatsapp/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +16 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +18 -2
- slidge_whatsapp/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +16 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go +16 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +17 -1
- slidge_whatsapp/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +16 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +16 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +17 -1
- slidge_whatsapp/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go +18 -2
- slidge_whatsapp/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +16 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +16 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +16 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +16 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +16 -0
- slidge_whatsapp/vendor/golang.org/x/sys/windows/types_windows.go +6 -0
- slidge_whatsapp/vendor/golang.org/x/sys/windows/zsyscall_windows.go +483 -483
- slidge_whatsapp/vendor/google.golang.org/protobuf/encoding/protowire/wire.go +25 -1
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb +0 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/filedesc/editions.go +10 -5
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/filedesc/presence.go +33 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/genid/api_gen.go +6 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +68 -22
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/impl/codec_message_opaque.go +2 -1
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/impl/message_opaque.go +8 -37
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/impl/presence.go +0 -3
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/version/version.go +1 -1
- slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +8 -0
- slidge_whatsapp/vendor/modules.txt +43 -23
- {slidge_whatsapp-0.2.7.dist-info → slidge_whatsapp-0.3.0.dist-info}/METADATA +5 -4
- {slidge_whatsapp-0.2.7.dist-info → slidge_whatsapp-0.3.0.dist-info}/RECORD +208 -161
- {slidge_whatsapp-0.2.7.dist-info → slidge_whatsapp-0.3.0.dist-info}/WHEEL +1 -1
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/abi_amd64.go +0 -7
- slidge_whatsapp/vendor/golang.org/x/net/http2/config_go124.go +0 -61
- slidge_whatsapp/vendor/golang.org/x/net/http2/config_pre_go124.go +0 -16
- slidge_whatsapp/vendor/golang.org/x/net/http2/timer.go +0 -20
- {slidge_whatsapp-0.2.7.dist-info → slidge_whatsapp-0.3.0.dist-info}/entry_points.txt +0 -0
- {slidge_whatsapp-0.2.7.dist-info → slidge_whatsapp-0.3.0.dist-info/licenses}/LICENSE +0 -0
|
@@ -15,21 +15,32 @@ import (
|
|
|
15
15
|
"runtime"
|
|
16
16
|
"strconv"
|
|
17
17
|
"sync"
|
|
18
|
+
"sync/atomic"
|
|
18
19
|
)
|
|
19
20
|
|
|
20
21
|
var DebugGoroutines = os.Getenv("DEBUG_HTTP2_GOROUTINES") == "1"
|
|
21
22
|
|
|
23
|
+
// Setting DebugGoroutines to false during a test to disable goroutine debugging
|
|
24
|
+
// results in race detector complaints when a test leaves goroutines running before
|
|
25
|
+
// returning. Tests shouldn't do this, of course, but when they do it generally shows
|
|
26
|
+
// up as infrequent, hard-to-debug flakes. (See #66519.)
|
|
27
|
+
//
|
|
28
|
+
// Disable goroutine debugging during individual tests with an atomic bool.
|
|
29
|
+
// (Note that it's safe to enable/disable debugging mid-test, so the actual race condition
|
|
30
|
+
// here is harmless.)
|
|
31
|
+
var disableDebugGoroutines atomic.Bool
|
|
32
|
+
|
|
22
33
|
type goroutineLock uint64
|
|
23
34
|
|
|
24
35
|
func newGoroutineLock() goroutineLock {
|
|
25
|
-
if !DebugGoroutines {
|
|
36
|
+
if !DebugGoroutines || disableDebugGoroutines.Load() {
|
|
26
37
|
return 0
|
|
27
38
|
}
|
|
28
39
|
return goroutineLock(curGoroutineID())
|
|
29
40
|
}
|
|
30
41
|
|
|
31
42
|
func (g goroutineLock) check() {
|
|
32
|
-
if !DebugGoroutines {
|
|
43
|
+
if !DebugGoroutines || disableDebugGoroutines.Load() {
|
|
33
44
|
return
|
|
34
45
|
}
|
|
35
46
|
if curGoroutineID() != uint64(g) {
|
|
@@ -38,7 +49,7 @@ func (g goroutineLock) check() {
|
|
|
38
49
|
}
|
|
39
50
|
|
|
40
51
|
func (g goroutineLock) checkNotOn() {
|
|
41
|
-
if !DebugGoroutines {
|
|
52
|
+
if !DebugGoroutines || disableDebugGoroutines.Load() {
|
|
42
53
|
return
|
|
43
54
|
}
|
|
44
55
|
if curGoroutineID() == uint64(g) {
|
|
@@ -11,13 +11,10 @@
|
|
|
11
11
|
// requires Go 1.6 or later)
|
|
12
12
|
//
|
|
13
13
|
// See https://http2.github.io/ for more information on HTTP/2.
|
|
14
|
-
//
|
|
15
|
-
// See https://http2.golang.org/ for a test server running this code.
|
|
16
14
|
package http2 // import "golang.org/x/net/http2"
|
|
17
15
|
|
|
18
16
|
import (
|
|
19
17
|
"bufio"
|
|
20
|
-
"context"
|
|
21
18
|
"crypto/tls"
|
|
22
19
|
"errors"
|
|
23
20
|
"fmt"
|
|
@@ -257,15 +254,13 @@ func (cw closeWaiter) Wait() {
|
|
|
257
254
|
// idle memory usage with many connections.
|
|
258
255
|
type bufferedWriter struct {
|
|
259
256
|
_ incomparable
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
byteTimeout time.Duration // immutable, WriteByteTimeout
|
|
257
|
+
conn net.Conn // immutable
|
|
258
|
+
bw *bufio.Writer // non-nil when data is buffered
|
|
259
|
+
byteTimeout time.Duration // immutable, WriteByteTimeout
|
|
264
260
|
}
|
|
265
261
|
|
|
266
|
-
func newBufferedWriter(
|
|
262
|
+
func newBufferedWriter(conn net.Conn, timeout time.Duration) *bufferedWriter {
|
|
267
263
|
return &bufferedWriter{
|
|
268
|
-
group: group,
|
|
269
264
|
conn: conn,
|
|
270
265
|
byteTimeout: timeout,
|
|
271
266
|
}
|
|
@@ -316,24 +311,18 @@ func (w *bufferedWriter) Flush() error {
|
|
|
316
311
|
type bufferedWriterTimeoutWriter bufferedWriter
|
|
317
312
|
|
|
318
313
|
func (w *bufferedWriterTimeoutWriter) Write(p []byte) (n int, err error) {
|
|
319
|
-
return writeWithByteTimeout(w.
|
|
314
|
+
return writeWithByteTimeout(w.conn, w.byteTimeout, p)
|
|
320
315
|
}
|
|
321
316
|
|
|
322
317
|
// writeWithByteTimeout writes to conn.
|
|
323
318
|
// If more than timeout passes without any bytes being written to the connection,
|
|
324
319
|
// the write fails.
|
|
325
|
-
func writeWithByteTimeout(
|
|
320
|
+
func writeWithByteTimeout(conn net.Conn, timeout time.Duration, p []byte) (n int, err error) {
|
|
326
321
|
if timeout <= 0 {
|
|
327
322
|
return conn.Write(p)
|
|
328
323
|
}
|
|
329
324
|
for {
|
|
330
|
-
|
|
331
|
-
if group == nil {
|
|
332
|
-
now = time.Now()
|
|
333
|
-
} else {
|
|
334
|
-
now = group.Now()
|
|
335
|
-
}
|
|
336
|
-
conn.SetWriteDeadline(now.Add(timeout))
|
|
325
|
+
conn.SetWriteDeadline(time.Now().Add(timeout))
|
|
337
326
|
nn, err := conn.Write(p[n:])
|
|
338
327
|
n += nn
|
|
339
328
|
if n == len(p) || nn == 0 || !errors.Is(err, os.ErrDeadlineExceeded) {
|
|
@@ -419,14 +408,3 @@ func (s *sorter) SortStrings(ss []string) {
|
|
|
419
408
|
// makes that struct also non-comparable, and generally doesn't add
|
|
420
409
|
// any size (as long as it's first).
|
|
421
410
|
type incomparable [0]func()
|
|
422
|
-
|
|
423
|
-
// synctestGroupInterface is the methods of synctestGroup used by Server and Transport.
|
|
424
|
-
// It's defined as an interface here to let us keep synctestGroup entirely test-only
|
|
425
|
-
// and not a part of non-test builds.
|
|
426
|
-
type synctestGroupInterface interface {
|
|
427
|
-
Join()
|
|
428
|
-
Now() time.Time
|
|
429
|
-
NewTimer(d time.Duration) timer
|
|
430
|
-
AfterFunc(d time.Duration, f func()) timer
|
|
431
|
-
ContextWithTimeout(ctx context.Context, d time.Duration) (context.Context, context.CancelFunc)
|
|
432
|
-
}
|
|
@@ -176,39 +176,6 @@ type Server struct {
|
|
|
176
176
|
// so that we don't embed a Mutex in this struct, which will make the
|
|
177
177
|
// struct non-copyable, which might break some callers.
|
|
178
178
|
state *serverInternalState
|
|
179
|
-
|
|
180
|
-
// Synchronization group used for testing.
|
|
181
|
-
// Outside of tests, this is nil.
|
|
182
|
-
group synctestGroupInterface
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
func (s *Server) markNewGoroutine() {
|
|
186
|
-
if s.group != nil {
|
|
187
|
-
s.group.Join()
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
func (s *Server) now() time.Time {
|
|
192
|
-
if s.group != nil {
|
|
193
|
-
return s.group.Now()
|
|
194
|
-
}
|
|
195
|
-
return time.Now()
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
// newTimer creates a new time.Timer, or a synthetic timer in tests.
|
|
199
|
-
func (s *Server) newTimer(d time.Duration) timer {
|
|
200
|
-
if s.group != nil {
|
|
201
|
-
return s.group.NewTimer(d)
|
|
202
|
-
}
|
|
203
|
-
return timeTimer{time.NewTimer(d)}
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// afterFunc creates a new time.AfterFunc timer, or a synthetic timer in tests.
|
|
207
|
-
func (s *Server) afterFunc(d time.Duration, f func()) timer {
|
|
208
|
-
if s.group != nil {
|
|
209
|
-
return s.group.AfterFunc(d, f)
|
|
210
|
-
}
|
|
211
|
-
return timeTimer{time.AfterFunc(d, f)}
|
|
212
179
|
}
|
|
213
180
|
|
|
214
181
|
type serverInternalState struct {
|
|
@@ -423,6 +390,9 @@ func (o *ServeConnOpts) handler() http.Handler {
|
|
|
423
390
|
//
|
|
424
391
|
// The opts parameter is optional. If nil, default values are used.
|
|
425
392
|
func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) {
|
|
393
|
+
if opts == nil {
|
|
394
|
+
opts = &ServeConnOpts{}
|
|
395
|
+
}
|
|
426
396
|
s.serveConn(c, opts, nil)
|
|
427
397
|
}
|
|
428
398
|
|
|
@@ -438,7 +408,7 @@ func (s *Server) serveConn(c net.Conn, opts *ServeConnOpts, newf func(*serverCon
|
|
|
438
408
|
conn: c,
|
|
439
409
|
baseCtx: baseCtx,
|
|
440
410
|
remoteAddrStr: c.RemoteAddr().String(),
|
|
441
|
-
bw: newBufferedWriter(
|
|
411
|
+
bw: newBufferedWriter(c, conf.WriteByteTimeout),
|
|
442
412
|
handler: opts.handler(),
|
|
443
413
|
streams: make(map[uint32]*stream),
|
|
444
414
|
readFrameCh: make(chan readFrameResult),
|
|
@@ -638,11 +608,11 @@ type serverConn struct {
|
|
|
638
608
|
pingSent bool
|
|
639
609
|
sentPingData [8]byte
|
|
640
610
|
goAwayCode ErrCode
|
|
641
|
-
shutdownTimer
|
|
642
|
-
idleTimer
|
|
611
|
+
shutdownTimer *time.Timer // nil until used
|
|
612
|
+
idleTimer *time.Timer // nil if unused
|
|
643
613
|
readIdleTimeout time.Duration
|
|
644
614
|
pingTimeout time.Duration
|
|
645
|
-
readIdleTimer
|
|
615
|
+
readIdleTimer *time.Timer // nil if unused
|
|
646
616
|
|
|
647
617
|
// Owned by the writeFrameAsync goroutine:
|
|
648
618
|
headerWriteBuf bytes.Buffer
|
|
@@ -687,12 +657,12 @@ type stream struct {
|
|
|
687
657
|
flow outflow // limits writing from Handler to client
|
|
688
658
|
inflow inflow // what the client is allowed to POST/etc to us
|
|
689
659
|
state streamState
|
|
690
|
-
resetQueued bool
|
|
691
|
-
gotTrailerHeader bool
|
|
692
|
-
wroteHeaders bool
|
|
693
|
-
readDeadline
|
|
694
|
-
writeDeadline
|
|
695
|
-
closeErr error
|
|
660
|
+
resetQueued bool // RST_STREAM queued for write; set by sc.resetStream
|
|
661
|
+
gotTrailerHeader bool // HEADER frame for trailers was seen
|
|
662
|
+
wroteHeaders bool // whether we wrote headers (not status 100)
|
|
663
|
+
readDeadline *time.Timer // nil if unused
|
|
664
|
+
writeDeadline *time.Timer // nil if unused
|
|
665
|
+
closeErr error // set before cw is closed
|
|
696
666
|
|
|
697
667
|
trailer http.Header // accumulated trailers
|
|
698
668
|
reqTrailer http.Header // handler's Request.Trailer
|
|
@@ -848,7 +818,6 @@ type readFrameResult struct {
|
|
|
848
818
|
// consumer is done with the frame.
|
|
849
819
|
// It's run on its own goroutine.
|
|
850
820
|
func (sc *serverConn) readFrames() {
|
|
851
|
-
sc.srv.markNewGoroutine()
|
|
852
821
|
gate := make(chan struct{})
|
|
853
822
|
gateDone := func() { gate <- struct{}{} }
|
|
854
823
|
for {
|
|
@@ -881,7 +850,6 @@ type frameWriteResult struct {
|
|
|
881
850
|
// At most one goroutine can be running writeFrameAsync at a time per
|
|
882
851
|
// serverConn.
|
|
883
852
|
func (sc *serverConn) writeFrameAsync(wr FrameWriteRequest, wd *writeData) {
|
|
884
|
-
sc.srv.markNewGoroutine()
|
|
885
853
|
var err error
|
|
886
854
|
if wd == nil {
|
|
887
855
|
err = wr.write.writeFrame(sc)
|
|
@@ -965,22 +933,22 @@ func (sc *serverConn) serve(conf http2Config) {
|
|
|
965
933
|
sc.setConnState(http.StateIdle)
|
|
966
934
|
|
|
967
935
|
if sc.srv.IdleTimeout > 0 {
|
|
968
|
-
sc.idleTimer =
|
|
936
|
+
sc.idleTimer = time.AfterFunc(sc.srv.IdleTimeout, sc.onIdleTimer)
|
|
969
937
|
defer sc.idleTimer.Stop()
|
|
970
938
|
}
|
|
971
939
|
|
|
972
940
|
if conf.SendPingTimeout > 0 {
|
|
973
941
|
sc.readIdleTimeout = conf.SendPingTimeout
|
|
974
|
-
sc.readIdleTimer =
|
|
942
|
+
sc.readIdleTimer = time.AfterFunc(conf.SendPingTimeout, sc.onReadIdleTimer)
|
|
975
943
|
defer sc.readIdleTimer.Stop()
|
|
976
944
|
}
|
|
977
945
|
|
|
978
946
|
go sc.readFrames() // closed by defer sc.conn.Close above
|
|
979
947
|
|
|
980
|
-
settingsTimer :=
|
|
948
|
+
settingsTimer := time.AfterFunc(firstSettingsTimeout, sc.onSettingsTimer)
|
|
981
949
|
defer settingsTimer.Stop()
|
|
982
950
|
|
|
983
|
-
lastFrameTime :=
|
|
951
|
+
lastFrameTime := time.Now()
|
|
984
952
|
loopNum := 0
|
|
985
953
|
for {
|
|
986
954
|
loopNum++
|
|
@@ -994,7 +962,7 @@ func (sc *serverConn) serve(conf http2Config) {
|
|
|
994
962
|
case res := <-sc.wroteFrameCh:
|
|
995
963
|
sc.wroteFrame(res)
|
|
996
964
|
case res := <-sc.readFrameCh:
|
|
997
|
-
lastFrameTime =
|
|
965
|
+
lastFrameTime = time.Now()
|
|
998
966
|
// Process any written frames before reading new frames from the client since a
|
|
999
967
|
// written frame could have triggered a new stream to be started.
|
|
1000
968
|
if sc.writingFrameAsync {
|
|
@@ -1077,7 +1045,7 @@ func (sc *serverConn) handlePingTimer(lastFrameReadTime time.Time) {
|
|
|
1077
1045
|
}
|
|
1078
1046
|
|
|
1079
1047
|
pingAt := lastFrameReadTime.Add(sc.readIdleTimeout)
|
|
1080
|
-
now :=
|
|
1048
|
+
now := time.Now()
|
|
1081
1049
|
if pingAt.After(now) {
|
|
1082
1050
|
// We received frames since arming the ping timer.
|
|
1083
1051
|
// Reset it for the next possible timeout.
|
|
@@ -1141,10 +1109,10 @@ func (sc *serverConn) readPreface() error {
|
|
|
1141
1109
|
errc <- nil
|
|
1142
1110
|
}
|
|
1143
1111
|
}()
|
|
1144
|
-
timer :=
|
|
1112
|
+
timer := time.NewTimer(prefaceTimeout) // TODO: configurable on *Server?
|
|
1145
1113
|
defer timer.Stop()
|
|
1146
1114
|
select {
|
|
1147
|
-
case <-timer.C
|
|
1115
|
+
case <-timer.C:
|
|
1148
1116
|
return errPrefaceTimeout
|
|
1149
1117
|
case err := <-errc:
|
|
1150
1118
|
if err == nil {
|
|
@@ -1160,6 +1128,21 @@ var errChanPool = sync.Pool{
|
|
|
1160
1128
|
New: func() interface{} { return make(chan error, 1) },
|
|
1161
1129
|
}
|
|
1162
1130
|
|
|
1131
|
+
func getErrChan() chan error {
|
|
1132
|
+
if inTests {
|
|
1133
|
+
// Channels cannot be reused across synctest tests.
|
|
1134
|
+
return make(chan error, 1)
|
|
1135
|
+
} else {
|
|
1136
|
+
return errChanPool.Get().(chan error)
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
func putErrChan(ch chan error) {
|
|
1141
|
+
if !inTests {
|
|
1142
|
+
errChanPool.Put(ch)
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1163
1146
|
var writeDataPool = sync.Pool{
|
|
1164
1147
|
New: func() interface{} { return new(writeData) },
|
|
1165
1148
|
}
|
|
@@ -1167,7 +1150,7 @@ var writeDataPool = sync.Pool{
|
|
|
1167
1150
|
// writeDataFromHandler writes DATA response frames from a handler on
|
|
1168
1151
|
// the given stream.
|
|
1169
1152
|
func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStream bool) error {
|
|
1170
|
-
ch :=
|
|
1153
|
+
ch := getErrChan()
|
|
1171
1154
|
writeArg := writeDataPool.Get().(*writeData)
|
|
1172
1155
|
*writeArg = writeData{stream.id, data, endStream}
|
|
1173
1156
|
err := sc.writeFrameFromHandler(FrameWriteRequest{
|
|
@@ -1199,7 +1182,7 @@ func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStrea
|
|
|
1199
1182
|
return errStreamClosed
|
|
1200
1183
|
}
|
|
1201
1184
|
}
|
|
1202
|
-
|
|
1185
|
+
putErrChan(ch)
|
|
1203
1186
|
if frameWriteDone {
|
|
1204
1187
|
writeDataPool.Put(writeArg)
|
|
1205
1188
|
}
|
|
@@ -1513,7 +1496,7 @@ func (sc *serverConn) goAway(code ErrCode) {
|
|
|
1513
1496
|
|
|
1514
1497
|
func (sc *serverConn) shutDownIn(d time.Duration) {
|
|
1515
1498
|
sc.serveG.check()
|
|
1516
|
-
sc.shutdownTimer =
|
|
1499
|
+
sc.shutdownTimer = time.AfterFunc(d, sc.onShutdownTimer)
|
|
1517
1500
|
}
|
|
1518
1501
|
|
|
1519
1502
|
func (sc *serverConn) resetStream(se StreamError) {
|
|
@@ -2118,7 +2101,7 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error {
|
|
|
2118
2101
|
// (in Go 1.8), though. That's a more sane option anyway.
|
|
2119
2102
|
if sc.hs.ReadTimeout > 0 {
|
|
2120
2103
|
sc.conn.SetReadDeadline(time.Time{})
|
|
2121
|
-
st.readDeadline =
|
|
2104
|
+
st.readDeadline = time.AfterFunc(sc.hs.ReadTimeout, st.onReadTimeout)
|
|
2122
2105
|
}
|
|
2123
2106
|
|
|
2124
2107
|
return sc.scheduleHandler(id, rw, req, handler)
|
|
@@ -2216,7 +2199,7 @@ func (sc *serverConn) newStream(id, pusherID uint32, state streamState) *stream
|
|
|
2216
2199
|
st.flow.add(sc.initialStreamSendWindowSize)
|
|
2217
2200
|
st.inflow.init(sc.initialStreamRecvWindowSize)
|
|
2218
2201
|
if sc.hs.WriteTimeout > 0 {
|
|
2219
|
-
st.writeDeadline =
|
|
2202
|
+
st.writeDeadline = time.AfterFunc(sc.hs.WriteTimeout, st.onWriteTimeout)
|
|
2220
2203
|
}
|
|
2221
2204
|
|
|
2222
2205
|
sc.streams[id] = st
|
|
@@ -2405,7 +2388,6 @@ func (sc *serverConn) handlerDone() {
|
|
|
2405
2388
|
|
|
2406
2389
|
// Run on its own goroutine.
|
|
2407
2390
|
func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) {
|
|
2408
|
-
sc.srv.markNewGoroutine()
|
|
2409
2391
|
defer sc.sendServeMsg(handlerDoneMsg)
|
|
2410
2392
|
didPanic := true
|
|
2411
2393
|
defer func() {
|
|
@@ -2454,7 +2436,7 @@ func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) erro
|
|
|
2454
2436
|
// waiting for this frame to be written, so an http.Flush mid-handler
|
|
2455
2437
|
// writes out the correct value of keys, before a handler later potentially
|
|
2456
2438
|
// mutates it.
|
|
2457
|
-
errc =
|
|
2439
|
+
errc = getErrChan()
|
|
2458
2440
|
}
|
|
2459
2441
|
if err := sc.writeFrameFromHandler(FrameWriteRequest{
|
|
2460
2442
|
write: headerData,
|
|
@@ -2466,7 +2448,7 @@ func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) erro
|
|
|
2466
2448
|
if errc != nil {
|
|
2467
2449
|
select {
|
|
2468
2450
|
case err := <-errc:
|
|
2469
|
-
|
|
2451
|
+
putErrChan(errc)
|
|
2470
2452
|
return err
|
|
2471
2453
|
case <-sc.doneServing:
|
|
2472
2454
|
return errClientDisconnected
|
|
@@ -2573,7 +2555,7 @@ func (b *requestBody) Read(p []byte) (n int, err error) {
|
|
|
2573
2555
|
if err == io.EOF {
|
|
2574
2556
|
b.sawEOF = true
|
|
2575
2557
|
}
|
|
2576
|
-
if b.conn == nil
|
|
2558
|
+
if b.conn == nil {
|
|
2577
2559
|
return
|
|
2578
2560
|
}
|
|
2579
2561
|
b.conn.noteBodyReadFromHandler(b.stream, n, err)
|
|
@@ -2702,7 +2684,7 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) {
|
|
|
2702
2684
|
var date string
|
|
2703
2685
|
if _, ok := rws.snapHeader["Date"]; !ok {
|
|
2704
2686
|
// TODO(bradfitz): be faster here, like net/http? measure.
|
|
2705
|
-
date =
|
|
2687
|
+
date = time.Now().UTC().Format(http.TimeFormat)
|
|
2706
2688
|
}
|
|
2707
2689
|
|
|
2708
2690
|
for _, v := range rws.snapHeader["Trailer"] {
|
|
@@ -2824,7 +2806,7 @@ func (rws *responseWriterState) promoteUndeclaredTrailers() {
|
|
|
2824
2806
|
|
|
2825
2807
|
func (w *responseWriter) SetReadDeadline(deadline time.Time) error {
|
|
2826
2808
|
st := w.rws.stream
|
|
2827
|
-
if !deadline.IsZero() && deadline.Before(
|
|
2809
|
+
if !deadline.IsZero() && deadline.Before(time.Now()) {
|
|
2828
2810
|
// If we're setting a deadline in the past, reset the stream immediately
|
|
2829
2811
|
// so writes after SetWriteDeadline returns will fail.
|
|
2830
2812
|
st.onReadTimeout()
|
|
@@ -2840,9 +2822,9 @@ func (w *responseWriter) SetReadDeadline(deadline time.Time) error {
|
|
|
2840
2822
|
if deadline.IsZero() {
|
|
2841
2823
|
st.readDeadline = nil
|
|
2842
2824
|
} else if st.readDeadline == nil {
|
|
2843
|
-
st.readDeadline =
|
|
2825
|
+
st.readDeadline = time.AfterFunc(deadline.Sub(time.Now()), st.onReadTimeout)
|
|
2844
2826
|
} else {
|
|
2845
|
-
st.readDeadline.Reset(deadline.Sub(
|
|
2827
|
+
st.readDeadline.Reset(deadline.Sub(time.Now()))
|
|
2846
2828
|
}
|
|
2847
2829
|
})
|
|
2848
2830
|
return nil
|
|
@@ -2850,7 +2832,7 @@ func (w *responseWriter) SetReadDeadline(deadline time.Time) error {
|
|
|
2850
2832
|
|
|
2851
2833
|
func (w *responseWriter) SetWriteDeadline(deadline time.Time) error {
|
|
2852
2834
|
st := w.rws.stream
|
|
2853
|
-
if !deadline.IsZero() && deadline.Before(
|
|
2835
|
+
if !deadline.IsZero() && deadline.Before(time.Now()) {
|
|
2854
2836
|
// If we're setting a deadline in the past, reset the stream immediately
|
|
2855
2837
|
// so writes after SetWriteDeadline returns will fail.
|
|
2856
2838
|
st.onWriteTimeout()
|
|
@@ -2866,9 +2848,9 @@ func (w *responseWriter) SetWriteDeadline(deadline time.Time) error {
|
|
|
2866
2848
|
if deadline.IsZero() {
|
|
2867
2849
|
st.writeDeadline = nil
|
|
2868
2850
|
} else if st.writeDeadline == nil {
|
|
2869
|
-
st.writeDeadline =
|
|
2851
|
+
st.writeDeadline = time.AfterFunc(deadline.Sub(time.Now()), st.onWriteTimeout)
|
|
2870
2852
|
} else {
|
|
2871
|
-
st.writeDeadline.Reset(deadline.Sub(
|
|
2853
|
+
st.writeDeadline.Reset(deadline.Sub(time.Now()))
|
|
2872
2854
|
}
|
|
2873
2855
|
})
|
|
2874
2856
|
return nil
|
|
@@ -3147,7 +3129,7 @@ func (w *responseWriter) Push(target string, opts *http.PushOptions) error {
|
|
|
3147
3129
|
method: opts.Method,
|
|
3148
3130
|
url: u,
|
|
3149
3131
|
header: cloneHeader(opts.Header),
|
|
3150
|
-
done:
|
|
3132
|
+
done: getErrChan(),
|
|
3151
3133
|
}
|
|
3152
3134
|
|
|
3153
3135
|
select {
|
|
@@ -3164,7 +3146,7 @@ func (w *responseWriter) Push(target string, opts *http.PushOptions) error {
|
|
|
3164
3146
|
case <-st.cw:
|
|
3165
3147
|
return errStreamClosed
|
|
3166
3148
|
case err := <-msg.done:
|
|
3167
|
-
|
|
3149
|
+
putErrChan(msg.done)
|
|
3168
3150
|
return err
|
|
3169
3151
|
}
|
|
3170
3152
|
}
|