slidge-whatsapp 0.2.5__cp312-cp312-manylinux_2_36_aarch64.whl → 0.2.7__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/config.py +3 -0
- slidge_whatsapp/event.go +31 -26
- slidge_whatsapp/gateway.go +13 -9
- slidge_whatsapp/gateway.py +2 -2
- slidge_whatsapp/generated/_whatsapp.cpython-312-aarch64-linux-gnu.h +183 -183
- slidge_whatsapp/generated/_whatsapp.cpython-312-aarch64-linux-gnu.so +0 -0
- slidge_whatsapp/generated/build.py +148 -148
- slidge_whatsapp/generated/whatsapp.c +1490 -1490
- slidge_whatsapp/generated/whatsapp.go +1217 -1217
- slidge_whatsapp/generated/whatsapp.py +1210 -1210
- slidge_whatsapp/generated/whatsapp_go.h +183 -183
- slidge_whatsapp/go.mod +15 -12
- slidge_whatsapp/go.sum +35 -29
- slidge_whatsapp/media/media.go +21 -11
- slidge_whatsapp/session.go +73 -66
- slidge_whatsapp/vendor/github.com/ebitengine/purego/dlfcn.go +4 -4
- slidge_whatsapp/vendor/github.com/ebitengine/purego/dlfcn_darwin.go +0 -5
- slidge_whatsapp/vendor/github.com/ebitengine/purego/internal/fakecgo/go_libinit.go +3 -0
- slidge_whatsapp/vendor/github.com/ebitengine/purego/internal/fakecgo/symbols.go +40 -20
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/CHANGELOG.md +14 -1
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/ffi.go +2 -2
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/fun.go +10 -2
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib.go +1 -1
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib_unix.go +1 -1
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib_windows.go +1 -1
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/README.md +2 -7
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/callback.go +2 -1
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c +8510 -5090
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h +344 -150
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3.go +57 -23
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.c +4 -0
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.go +4 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/.gitignore +4 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/LICENSE +202 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/README.md +4 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid.go +35 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_gccgo.go +26 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.3.c +23 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.3.go +22 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.4.go +35 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.4.s +18 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.5.go +28 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.5.s +44 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_slow.go +24 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_gccgo_go1.8.go +17 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.23.go +38 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.5.go +57 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.6.go +43 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.9.go +37 -0
- slidge_whatsapp/vendor/github.com/rs/zerolog/CONTRIBUTING.md +43 -0
- slidge_whatsapp/vendor/github.com/rs/zerolog/README.md +31 -0
- slidge_whatsapp/vendor/github.com/rs/zerolog/console.go +20 -5
- slidge_whatsapp/vendor/github.com/rs/zerolog/log/log.go +131 -0
- slidge_whatsapp/vendor/github.com/rs/zerolog/log.go +1 -1
- slidge_whatsapp/vendor/github.com/rs/zerolog/sampler.go +4 -1
- slidge_whatsapp/vendor/github.com/rs/zerolog/writer.go +9 -0
- slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/GroupCipher.go +17 -6
- slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/GroupSessionBuilder.go +17 -7
- slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/state/store/SenderKeyStore.go +4 -2
- slidge_whatsapp/vendor/go.mau.fi/libsignal/keys/chain/ChainKey.go +1 -0
- slidge_whatsapp/vendor/go.mau.fi/libsignal/keys/identity/IdentityKey.go +1 -0
- slidge_whatsapp/vendor/go.mau.fi/libsignal/logger/DefaultLogger.go +2 -2
- slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/FingerprintProtocol.pb.go +3 -2
- slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/LocalStorageProtocol.pb.go +3 -2
- slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/WhisperTextProtocol.pb.go +3 -2
- slidge_whatsapp/vendor/go.mau.fi/libsignal/session/Session.go +41 -17
- slidge_whatsapp/vendor/go.mau.fi/libsignal/session/SessionCipher.go +64 -30
- slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/IdentityKeyStore.go +5 -3
- slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/MessageKeyStore.go +6 -4
- slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/PreKeyStore.go +6 -4
- slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/SessionStore.go +8 -6
- slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/SignedPreKeyStore.go +7 -5
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/connlog.go +257 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/database.go +309 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/iter.go +233 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/json.go +47 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/log.go +129 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/massinsert.go +164 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/queryhelper.go +137 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/reflectscan.go +30 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/transaction.go +180 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/upgrades.go +250 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/upgradetable.go +331 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exerrors/dualerror.go +33 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exerrors/must.go +23 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exhttp/cors.go +32 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exhttp/handleerrors.go +64 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exhttp/json.go +36 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exhttp/middleware.go +30 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exhttp/networkerror.go +37 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exstrings/stringutil.go +76 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exsync/event.go +88 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exsync/returnonce.go +25 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exsync/ringbuffer.go +139 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exsync/syncmap.go +94 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exsync/syncset.go +136 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/callermarshal.go +28 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/defaults.go +32 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/generics.go +45 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/writer.go +81 -0
- slidge_whatsapp/vendor/go.mau.fi/util/ptr/ptr.go +43 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/decode.go +27 -26
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/encode.go +4 -3
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/keys.go +5 -4
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate.go +27 -25
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/armadillomessage.go +40 -7
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/binary/encoder.go +1 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/broadcast.go +5 -4
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/call.go +1 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/client.go +119 -37
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/connectionevents.go +29 -11
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download-to-file.go +63 -30
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download.go +74 -34
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/errors.go +1 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/group.go +61 -31
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/internals.go +188 -152
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/keepalive.go +3 -2
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/mediaconn.go +5 -3
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/mediaretry.go +2 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/message.go +444 -135
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/msgsecret.go +118 -31
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/notification.go +78 -42
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/pair-code.go +7 -4
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/pair.go +42 -18
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/prekeys.go +9 -5
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/presence.go +2 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/privacysettings.go +10 -11
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/extra.go +7 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloAddMessage/InstamadilloAddMessage.pb.go +983 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloAddMessage/InstamadilloAddMessage.proto +85 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloAddMessage/extra.go +3 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeActionLog/InstamadilloCoreTypeActionLog.pb.go +197 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeActionLog/InstamadilloCoreTypeActionLog.proto +13 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeAdminMessage/InstamadilloCoreTypeAdminMessage.pb.go +279 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeAdminMessage/InstamadilloCoreTypeAdminMessage.proto +21 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeCollection/InstamadilloCoreTypeCollection.pb.go +137 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeCollection/InstamadilloCoreTypeCollection.proto +10 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeLink/InstamadilloCoreTypeLink.pb.go +313 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeLink/InstamadilloCoreTypeLink.proto +27 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeMedia/InstamadilloCoreTypeMedia.pb.go +1299 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeMedia/InstamadilloCoreTypeMedia.proto +112 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeText/InstamadilloCoreTypeText.pb.go +514 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeText/InstamadilloCoreTypeText.proto +47 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloDeleteMessage/InstamadilloDeleteMessage.pb.go +123 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloDeleteMessage/InstamadilloDeleteMessage.proto +7 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloDeleteMessage/extra.go +3 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloSupplementMessage/InstamadilloSupplementMessage.pb.go +720 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloSupplementMessage/InstamadilloSupplementMessage.proto +59 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloSupplementMessage/extra.go +3 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloTransportPayload/InstamadilloTransportPayload.pb.go +365 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloTransportPayload/InstamadilloTransportPayload.proto +33 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloXmaContentRef/InstamadilloXmaContentRef.pb.go +1238 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloXmaContentRef/InstamadilloXmaContentRef.proto +105 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waAdv/WAAdv.pb.go +39 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.pb.go +354 -175
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.proto +5 -5
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.pb.go +170 -15
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.proto +4 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCert/WACert.pb.go +29 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waChatLockSettings/WAProtobufsChatLockSettings.pb.go +13 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.pb.go +344 -31
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.proto +26 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/{WAWebProtobufsCompanionReg.pb.go → WACompanionReg.pb.go} +184 -89
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/{WAWebProtobufsCompanionReg.proto → WACompanionReg.proto} +2 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waConsumerApplication/WAConsumerApplication.pb.go +173 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.pb.go +78 -16
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.proto +5 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.pb.go +7428 -2151
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.proto +373 -44
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.pb.go +456 -135
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.proto +14 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waLidMigrationSyncPayload/WAWebProtobufLidMigrationSyncPayload.pb.go +198 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waLidMigrationSyncPayload/WAWebProtobufLidMigrationSyncPayload.proto +14 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.pb.go +162 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.proto +1 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.pb.go +32 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.proto +1 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.pb.go +192 -52
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.proto +8 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/WAMsgTransport.pb.go +60 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/extra.go +7 -6
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMultiDevice/WAMultiDevice.pb.go +39 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waServerSync/WAServerSync.pb.go +61 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waStatusAttributions/WAStatusAttributions.pb.go +800 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waStatusAttributions/WAStatusAttributions.proto +72 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.pb.go +1344 -438
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.proto +52 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waUserPassword/WAProtobufsUserPassword.pb.go +27 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waVnameCert/WAWebProtobufsVnameCert.pb.go +59 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.pb.go +382 -78
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.proto +8 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.pb.go +563 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.proto +4 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/receipt.go +25 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/reportingfields.json +1 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/reportingtoken.go +176 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/retry.go +39 -21
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/send.go +261 -75
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/sendfb.go +28 -16
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/clientpayload.go +3 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/noop.go +85 -43
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/signal.go +75 -88
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/container.go +86 -65
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/lidmap.go +186 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/store.go +291 -167
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/00-latest-schema.sql +155 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/03-message-secrets.sql +11 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/04-privacy-tokens.sql +8 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/05-account-jid-format.sql +2 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/06-facebook-uuid.sql +2 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/07-account-lid.sql +2 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/08-lid-mapping.sql +5 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/09-decryption-buffer.sql +10 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/10-chat-db-lid-migration-ts.sql +2 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/upgrades.go +22 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/store.go +107 -56
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/botmap.go +210 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/events/events.go +13 -2
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/group.go +15 -6
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/jid.go +7 -8
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/message.go +18 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/update.go +3 -2
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/upload.go +1 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/user.go +47 -29
- slidge_whatsapp/vendor/golang.org/x/exp/LICENSE +27 -0
- slidge_whatsapp/vendor/golang.org/x/exp/PATENTS +22 -0
- slidge_whatsapp/vendor/golang.org/x/exp/constraints/constraints.go +54 -0
- slidge_whatsapp/vendor/golang.org/x/net/http/httpguts/guts.go +50 -0
- slidge_whatsapp/vendor/golang.org/x/net/http/httpguts/httplex.go +347 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/.gitignore +2 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/ascii.go +53 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/ciphers.go +641 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/client_conn_pool.go +311 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/config.go +122 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/config_go124.go +61 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/config_pre_go124.go +16 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/databuffer.go +149 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/errors.go +145 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/flow.go +120 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/frame.go +1702 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/gotrack.go +170 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/encode.go +245 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/hpack.go +523 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/huffman.go +226 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/static_table.go +188 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/tables.go +403 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/http2.go +432 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/pipe.go +184 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/server.go +3350 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/timer.go +20 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/transport.go +3287 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/unencrypted.go +32 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/write.go +381 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/writesched.go +251 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_priority.go +451 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_random.go +77 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_roundrobin.go +119 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/go118.go +13 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/idna10.0.0.go +769 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/idna9.0.0.go +717 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/pre_go118.go +11 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/punycode.go +217 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables10.0.0.go +4559 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables11.0.0.go +4653 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables12.0.0.go +4733 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables13.0.0.go +4959 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables15.0.0.go +5144 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables9.0.0.go +4486 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/trie.go +51 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/trie12.0.0.go +30 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/trie13.0.0.go +30 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/trieval.go +119 -0
- slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/ascii.go +53 -0
- slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/headermap.go +115 -0
- slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/request.go +467 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/syscall_darwin.go +148 -1
- slidge_whatsapp/vendor/golang.org/x/sys/unix/syscall_linux.go +16 -26
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +84 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +20 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +84 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +20 -0
- slidge_whatsapp/vendor/golang.org/x/sys/windows/security_windows.go +44 -5
- slidge_whatsapp/vendor/golang.org/x/sys/windows/syscall_windows.go +4 -2
- slidge_whatsapp/vendor/golang.org/x/sys/windows/types_windows.go +239 -0
- slidge_whatsapp/vendor/golang.org/x/sys/windows/zsyscall_windows.go +9 -0
- slidge_whatsapp/vendor/golang.org/x/text/LICENSE +27 -0
- slidge_whatsapp/vendor/golang.org/x/text/PATENTS +22 -0
- slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule.go +336 -0
- slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go +11 -0
- slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go +14 -0
- slidge_whatsapp/vendor/golang.org/x/text/transform/transform.go +709 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/bidi.go +359 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/bracket.go +335 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/core.go +1071 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/prop.go +206 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go +1815 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go +1887 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go +1923 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go +1955 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go +2042 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go +1781 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/trieval.go +48 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/composition.go +512 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/forminfo.go +279 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/input.go +109 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/iter.go +458 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/normalize.go +610 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/readwriter.go +125 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go +7657 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go +7693 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go +7710 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go +7760 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go +7907 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go +7637 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/transform.go +88 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/trie.go +54 -0
- 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 +3 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +16 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/strs/{strings_unsafe_go121.go → strings_unsafe.go} +0 -2
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/version/version.go +1 -1
- slidge_whatsapp/vendor/google.golang.org/protobuf/proto/merge.go +6 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +2 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/{value_unsafe_go121.go → value_unsafe.go} +0 -2
- slidge_whatsapp/vendor/modules.txt +52 -13
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/METADATA +1 -1
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/RECORD +330 -184
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/WHEEL +1 -1
- slidge_whatsapp/vendor/github.com/rs/zerolog/CNAME +0 -1
- slidge_whatsapp/vendor/github.com/rs/zerolog/_config.yml +0 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waAdv/WAAdv.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCert/WACert.pb.raw +0 -23
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waChatLockSettings/WAProtobufsChatLockSettings.pb.raw +0 -7
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/WAWebProtobufsCompanionReg.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waConsumerApplication/WAConsumerApplication.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/WAMsgTransport.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMultiDevice/WAMultiDevice.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waServerSync/WAServerSync.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waUserPassword/WAProtobufsUserPassword.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waVnameCert/WAWebProtobufsVnameCert.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrade.go +0 -296
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go120.go +0 -94
- slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go120.go +0 -98
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/LICENSE +0 -0
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
// Copyright 2015 The Go Authors. All rights reserved.
|
|
2
|
+
// Use of this source code is governed by a BSD-style
|
|
3
|
+
// license that can be found in the LICENSE file.
|
|
4
|
+
|
|
5
|
+
// Transport code's client connection pooling.
|
|
6
|
+
|
|
7
|
+
package http2
|
|
8
|
+
|
|
9
|
+
import (
|
|
10
|
+
"context"
|
|
11
|
+
"errors"
|
|
12
|
+
"net"
|
|
13
|
+
"net/http"
|
|
14
|
+
"sync"
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
// ClientConnPool manages a pool of HTTP/2 client connections.
|
|
18
|
+
type ClientConnPool interface {
|
|
19
|
+
// GetClientConn returns a specific HTTP/2 connection (usually
|
|
20
|
+
// a TLS-TCP connection) to an HTTP/2 server. On success, the
|
|
21
|
+
// returned ClientConn accounts for the upcoming RoundTrip
|
|
22
|
+
// call, so the caller should not omit it. If the caller needs
|
|
23
|
+
// to, ClientConn.RoundTrip can be called with a bogus
|
|
24
|
+
// new(http.Request) to release the stream reservation.
|
|
25
|
+
GetClientConn(req *http.Request, addr string) (*ClientConn, error)
|
|
26
|
+
MarkDead(*ClientConn)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// clientConnPoolIdleCloser is the interface implemented by ClientConnPool
|
|
30
|
+
// implementations which can close their idle connections.
|
|
31
|
+
type clientConnPoolIdleCloser interface {
|
|
32
|
+
ClientConnPool
|
|
33
|
+
closeIdleConnections()
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
var (
|
|
37
|
+
_ clientConnPoolIdleCloser = (*clientConnPool)(nil)
|
|
38
|
+
_ clientConnPoolIdleCloser = noDialClientConnPool{}
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
// TODO: use singleflight for dialing and addConnCalls?
|
|
42
|
+
type clientConnPool struct {
|
|
43
|
+
t *Transport
|
|
44
|
+
|
|
45
|
+
mu sync.Mutex // TODO: maybe switch to RWMutex
|
|
46
|
+
// TODO: add support for sharing conns based on cert names
|
|
47
|
+
// (e.g. share conn for googleapis.com and appspot.com)
|
|
48
|
+
conns map[string][]*ClientConn // key is host:port
|
|
49
|
+
dialing map[string]*dialCall // currently in-flight dials
|
|
50
|
+
keys map[*ClientConn][]string
|
|
51
|
+
addConnCalls map[string]*addConnCall // in-flight addConnIfNeeded calls
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
func (p *clientConnPool) GetClientConn(req *http.Request, addr string) (*ClientConn, error) {
|
|
55
|
+
return p.getClientConn(req, addr, dialOnMiss)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const (
|
|
59
|
+
dialOnMiss = true
|
|
60
|
+
noDialOnMiss = false
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMiss bool) (*ClientConn, error) {
|
|
64
|
+
// TODO(dneil): Dial a new connection when t.DisableKeepAlives is set?
|
|
65
|
+
if isConnectionCloseRequest(req) && dialOnMiss {
|
|
66
|
+
// It gets its own connection.
|
|
67
|
+
traceGetConn(req, addr)
|
|
68
|
+
const singleUse = true
|
|
69
|
+
cc, err := p.t.dialClientConn(req.Context(), addr, singleUse)
|
|
70
|
+
if err != nil {
|
|
71
|
+
return nil, err
|
|
72
|
+
}
|
|
73
|
+
return cc, nil
|
|
74
|
+
}
|
|
75
|
+
for {
|
|
76
|
+
p.mu.Lock()
|
|
77
|
+
for _, cc := range p.conns[addr] {
|
|
78
|
+
if cc.ReserveNewRequest() {
|
|
79
|
+
// When a connection is presented to us by the net/http package,
|
|
80
|
+
// the GetConn hook has already been called.
|
|
81
|
+
// Don't call it a second time here.
|
|
82
|
+
if !cc.getConnCalled {
|
|
83
|
+
traceGetConn(req, addr)
|
|
84
|
+
}
|
|
85
|
+
cc.getConnCalled = false
|
|
86
|
+
p.mu.Unlock()
|
|
87
|
+
return cc, nil
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if !dialOnMiss {
|
|
91
|
+
p.mu.Unlock()
|
|
92
|
+
return nil, ErrNoCachedConn
|
|
93
|
+
}
|
|
94
|
+
traceGetConn(req, addr)
|
|
95
|
+
call := p.getStartDialLocked(req.Context(), addr)
|
|
96
|
+
p.mu.Unlock()
|
|
97
|
+
<-call.done
|
|
98
|
+
if shouldRetryDial(call, req) {
|
|
99
|
+
continue
|
|
100
|
+
}
|
|
101
|
+
cc, err := call.res, call.err
|
|
102
|
+
if err != nil {
|
|
103
|
+
return nil, err
|
|
104
|
+
}
|
|
105
|
+
if cc.ReserveNewRequest() {
|
|
106
|
+
return cc, nil
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// dialCall is an in-flight Transport dial call to a host.
|
|
112
|
+
type dialCall struct {
|
|
113
|
+
_ incomparable
|
|
114
|
+
p *clientConnPool
|
|
115
|
+
// the context associated with the request
|
|
116
|
+
// that created this dialCall
|
|
117
|
+
ctx context.Context
|
|
118
|
+
done chan struct{} // closed when done
|
|
119
|
+
res *ClientConn // valid after done is closed
|
|
120
|
+
err error // valid after done is closed
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// requires p.mu is held.
|
|
124
|
+
func (p *clientConnPool) getStartDialLocked(ctx context.Context, addr string) *dialCall {
|
|
125
|
+
if call, ok := p.dialing[addr]; ok {
|
|
126
|
+
// A dial is already in-flight. Don't start another.
|
|
127
|
+
return call
|
|
128
|
+
}
|
|
129
|
+
call := &dialCall{p: p, done: make(chan struct{}), ctx: ctx}
|
|
130
|
+
if p.dialing == nil {
|
|
131
|
+
p.dialing = make(map[string]*dialCall)
|
|
132
|
+
}
|
|
133
|
+
p.dialing[addr] = call
|
|
134
|
+
go call.dial(call.ctx, addr)
|
|
135
|
+
return call
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// run in its own goroutine.
|
|
139
|
+
func (c *dialCall) dial(ctx context.Context, addr string) {
|
|
140
|
+
const singleUse = false // shared conn
|
|
141
|
+
c.res, c.err = c.p.t.dialClientConn(ctx, addr, singleUse)
|
|
142
|
+
|
|
143
|
+
c.p.mu.Lock()
|
|
144
|
+
delete(c.p.dialing, addr)
|
|
145
|
+
if c.err == nil {
|
|
146
|
+
c.p.addConnLocked(addr, c.res)
|
|
147
|
+
}
|
|
148
|
+
c.p.mu.Unlock()
|
|
149
|
+
|
|
150
|
+
close(c.done)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// addConnIfNeeded makes a NewClientConn out of c if a connection for key doesn't
|
|
154
|
+
// already exist. It coalesces concurrent calls with the same key.
|
|
155
|
+
// This is used by the http1 Transport code when it creates a new connection. Because
|
|
156
|
+
// the http1 Transport doesn't de-dup TCP dials to outbound hosts (because it doesn't know
|
|
157
|
+
// the protocol), it can get into a situation where it has multiple TLS connections.
|
|
158
|
+
// This code decides which ones live or die.
|
|
159
|
+
// The return value used is whether c was used.
|
|
160
|
+
// c is never closed.
|
|
161
|
+
func (p *clientConnPool) addConnIfNeeded(key string, t *Transport, c net.Conn) (used bool, err error) {
|
|
162
|
+
p.mu.Lock()
|
|
163
|
+
for _, cc := range p.conns[key] {
|
|
164
|
+
if cc.CanTakeNewRequest() {
|
|
165
|
+
p.mu.Unlock()
|
|
166
|
+
return false, nil
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
call, dup := p.addConnCalls[key]
|
|
170
|
+
if !dup {
|
|
171
|
+
if p.addConnCalls == nil {
|
|
172
|
+
p.addConnCalls = make(map[string]*addConnCall)
|
|
173
|
+
}
|
|
174
|
+
call = &addConnCall{
|
|
175
|
+
p: p,
|
|
176
|
+
done: make(chan struct{}),
|
|
177
|
+
}
|
|
178
|
+
p.addConnCalls[key] = call
|
|
179
|
+
go call.run(t, key, c)
|
|
180
|
+
}
|
|
181
|
+
p.mu.Unlock()
|
|
182
|
+
|
|
183
|
+
<-call.done
|
|
184
|
+
if call.err != nil {
|
|
185
|
+
return false, call.err
|
|
186
|
+
}
|
|
187
|
+
return !dup, nil
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
type addConnCall struct {
|
|
191
|
+
_ incomparable
|
|
192
|
+
p *clientConnPool
|
|
193
|
+
done chan struct{} // closed when done
|
|
194
|
+
err error
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
func (c *addConnCall) run(t *Transport, key string, nc net.Conn) {
|
|
198
|
+
cc, err := t.NewClientConn(nc)
|
|
199
|
+
|
|
200
|
+
p := c.p
|
|
201
|
+
p.mu.Lock()
|
|
202
|
+
if err != nil {
|
|
203
|
+
c.err = err
|
|
204
|
+
} else {
|
|
205
|
+
cc.getConnCalled = true // already called by the net/http package
|
|
206
|
+
p.addConnLocked(key, cc)
|
|
207
|
+
}
|
|
208
|
+
delete(p.addConnCalls, key)
|
|
209
|
+
p.mu.Unlock()
|
|
210
|
+
close(c.done)
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// p.mu must be held
|
|
214
|
+
func (p *clientConnPool) addConnLocked(key string, cc *ClientConn) {
|
|
215
|
+
for _, v := range p.conns[key] {
|
|
216
|
+
if v == cc {
|
|
217
|
+
return
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if p.conns == nil {
|
|
221
|
+
p.conns = make(map[string][]*ClientConn)
|
|
222
|
+
}
|
|
223
|
+
if p.keys == nil {
|
|
224
|
+
p.keys = make(map[*ClientConn][]string)
|
|
225
|
+
}
|
|
226
|
+
p.conns[key] = append(p.conns[key], cc)
|
|
227
|
+
p.keys[cc] = append(p.keys[cc], key)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
func (p *clientConnPool) MarkDead(cc *ClientConn) {
|
|
231
|
+
p.mu.Lock()
|
|
232
|
+
defer p.mu.Unlock()
|
|
233
|
+
for _, key := range p.keys[cc] {
|
|
234
|
+
vv, ok := p.conns[key]
|
|
235
|
+
if !ok {
|
|
236
|
+
continue
|
|
237
|
+
}
|
|
238
|
+
newList := filterOutClientConn(vv, cc)
|
|
239
|
+
if len(newList) > 0 {
|
|
240
|
+
p.conns[key] = newList
|
|
241
|
+
} else {
|
|
242
|
+
delete(p.conns, key)
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
delete(p.keys, cc)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
func (p *clientConnPool) closeIdleConnections() {
|
|
249
|
+
p.mu.Lock()
|
|
250
|
+
defer p.mu.Unlock()
|
|
251
|
+
// TODO: don't close a cc if it was just added to the pool
|
|
252
|
+
// milliseconds ago and has never been used. There's currently
|
|
253
|
+
// a small race window with the HTTP/1 Transport's integration
|
|
254
|
+
// where it can add an idle conn just before using it, and
|
|
255
|
+
// somebody else can concurrently call CloseIdleConns and
|
|
256
|
+
// break some caller's RoundTrip.
|
|
257
|
+
for _, vv := range p.conns {
|
|
258
|
+
for _, cc := range vv {
|
|
259
|
+
cc.closeIfIdle()
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
func filterOutClientConn(in []*ClientConn, exclude *ClientConn) []*ClientConn {
|
|
265
|
+
out := in[:0]
|
|
266
|
+
for _, v := range in {
|
|
267
|
+
if v != exclude {
|
|
268
|
+
out = append(out, v)
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// If we filtered it out, zero out the last item to prevent
|
|
272
|
+
// the GC from seeing it.
|
|
273
|
+
if len(in) != len(out) {
|
|
274
|
+
in[len(in)-1] = nil
|
|
275
|
+
}
|
|
276
|
+
return out
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// noDialClientConnPool is an implementation of http2.ClientConnPool
|
|
280
|
+
// which never dials. We let the HTTP/1.1 client dial and use its TLS
|
|
281
|
+
// connection instead.
|
|
282
|
+
type noDialClientConnPool struct{ *clientConnPool }
|
|
283
|
+
|
|
284
|
+
func (p noDialClientConnPool) GetClientConn(req *http.Request, addr string) (*ClientConn, error) {
|
|
285
|
+
return p.getClientConn(req, addr, noDialOnMiss)
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// shouldRetryDial reports whether the current request should
|
|
289
|
+
// retry dialing after the call finished unsuccessfully, for example
|
|
290
|
+
// if the dial was canceled because of a context cancellation or
|
|
291
|
+
// deadline expiry.
|
|
292
|
+
func shouldRetryDial(call *dialCall, req *http.Request) bool {
|
|
293
|
+
if call.err == nil {
|
|
294
|
+
// No error, no need to retry
|
|
295
|
+
return false
|
|
296
|
+
}
|
|
297
|
+
if call.ctx == req.Context() {
|
|
298
|
+
// If the call has the same context as the request, the dial
|
|
299
|
+
// should not be retried, since any cancellation will have come
|
|
300
|
+
// from this request.
|
|
301
|
+
return false
|
|
302
|
+
}
|
|
303
|
+
if !errors.Is(call.err, context.Canceled) && !errors.Is(call.err, context.DeadlineExceeded) {
|
|
304
|
+
// If the call error is not because of a context cancellation or a deadline expiry,
|
|
305
|
+
// the dial should not be retried.
|
|
306
|
+
return false
|
|
307
|
+
}
|
|
308
|
+
// Only retry if the error is a context cancellation error or deadline expiry
|
|
309
|
+
// and the context associated with the call was canceled or expired.
|
|
310
|
+
return call.ctx.Err() != nil
|
|
311
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// Copyright 2024 The Go Authors. All rights reserved.
|
|
2
|
+
// Use of this source code is governed by a BSD-style
|
|
3
|
+
// license that can be found in the LICENSE file.
|
|
4
|
+
|
|
5
|
+
package http2
|
|
6
|
+
|
|
7
|
+
import (
|
|
8
|
+
"math"
|
|
9
|
+
"net/http"
|
|
10
|
+
"time"
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
// http2Config is a package-internal version of net/http.HTTP2Config.
|
|
14
|
+
//
|
|
15
|
+
// http.HTTP2Config was added in Go 1.24.
|
|
16
|
+
// When running with a version of net/http that includes HTTP2Config,
|
|
17
|
+
// we merge the configuration with the fields in Transport or Server
|
|
18
|
+
// to produce an http2Config.
|
|
19
|
+
//
|
|
20
|
+
// Zero valued fields in http2Config are interpreted as in the
|
|
21
|
+
// net/http.HTTPConfig documentation.
|
|
22
|
+
//
|
|
23
|
+
// Precedence order for reconciling configurations is:
|
|
24
|
+
//
|
|
25
|
+
// - Use the net/http.{Server,Transport}.HTTP2Config value, when non-zero.
|
|
26
|
+
// - Otherwise use the http2.{Server.Transport} value.
|
|
27
|
+
// - If the resulting value is zero or out of range, use a default.
|
|
28
|
+
type http2Config struct {
|
|
29
|
+
MaxConcurrentStreams uint32
|
|
30
|
+
MaxDecoderHeaderTableSize uint32
|
|
31
|
+
MaxEncoderHeaderTableSize uint32
|
|
32
|
+
MaxReadFrameSize uint32
|
|
33
|
+
MaxUploadBufferPerConnection int32
|
|
34
|
+
MaxUploadBufferPerStream int32
|
|
35
|
+
SendPingTimeout time.Duration
|
|
36
|
+
PingTimeout time.Duration
|
|
37
|
+
WriteByteTimeout time.Duration
|
|
38
|
+
PermitProhibitedCipherSuites bool
|
|
39
|
+
CountError func(errType string)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// configFromServer merges configuration settings from
|
|
43
|
+
// net/http.Server.HTTP2Config and http2.Server.
|
|
44
|
+
func configFromServer(h1 *http.Server, h2 *Server) http2Config {
|
|
45
|
+
conf := http2Config{
|
|
46
|
+
MaxConcurrentStreams: h2.MaxConcurrentStreams,
|
|
47
|
+
MaxEncoderHeaderTableSize: h2.MaxEncoderHeaderTableSize,
|
|
48
|
+
MaxDecoderHeaderTableSize: h2.MaxDecoderHeaderTableSize,
|
|
49
|
+
MaxReadFrameSize: h2.MaxReadFrameSize,
|
|
50
|
+
MaxUploadBufferPerConnection: h2.MaxUploadBufferPerConnection,
|
|
51
|
+
MaxUploadBufferPerStream: h2.MaxUploadBufferPerStream,
|
|
52
|
+
SendPingTimeout: h2.ReadIdleTimeout,
|
|
53
|
+
PingTimeout: h2.PingTimeout,
|
|
54
|
+
WriteByteTimeout: h2.WriteByteTimeout,
|
|
55
|
+
PermitProhibitedCipherSuites: h2.PermitProhibitedCipherSuites,
|
|
56
|
+
CountError: h2.CountError,
|
|
57
|
+
}
|
|
58
|
+
fillNetHTTPServerConfig(&conf, h1)
|
|
59
|
+
setConfigDefaults(&conf, true)
|
|
60
|
+
return conf
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// configFromTransport merges configuration settings from h2 and h2.t1.HTTP2
|
|
64
|
+
// (the net/http Transport).
|
|
65
|
+
func configFromTransport(h2 *Transport) http2Config {
|
|
66
|
+
conf := http2Config{
|
|
67
|
+
MaxEncoderHeaderTableSize: h2.MaxEncoderHeaderTableSize,
|
|
68
|
+
MaxDecoderHeaderTableSize: h2.MaxDecoderHeaderTableSize,
|
|
69
|
+
MaxReadFrameSize: h2.MaxReadFrameSize,
|
|
70
|
+
SendPingTimeout: h2.ReadIdleTimeout,
|
|
71
|
+
PingTimeout: h2.PingTimeout,
|
|
72
|
+
WriteByteTimeout: h2.WriteByteTimeout,
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Unlike most config fields, where out-of-range values revert to the default,
|
|
76
|
+
// Transport.MaxReadFrameSize clips.
|
|
77
|
+
if conf.MaxReadFrameSize < minMaxFrameSize {
|
|
78
|
+
conf.MaxReadFrameSize = minMaxFrameSize
|
|
79
|
+
} else if conf.MaxReadFrameSize > maxFrameSize {
|
|
80
|
+
conf.MaxReadFrameSize = maxFrameSize
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if h2.t1 != nil {
|
|
84
|
+
fillNetHTTPTransportConfig(&conf, h2.t1)
|
|
85
|
+
}
|
|
86
|
+
setConfigDefaults(&conf, false)
|
|
87
|
+
return conf
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
func setDefault[T ~int | ~int32 | ~uint32 | ~int64](v *T, minval, maxval, defval T) {
|
|
91
|
+
if *v < minval || *v > maxval {
|
|
92
|
+
*v = defval
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
func setConfigDefaults(conf *http2Config, server bool) {
|
|
97
|
+
setDefault(&conf.MaxConcurrentStreams, 1, math.MaxUint32, defaultMaxStreams)
|
|
98
|
+
setDefault(&conf.MaxEncoderHeaderTableSize, 1, math.MaxUint32, initialHeaderTableSize)
|
|
99
|
+
setDefault(&conf.MaxDecoderHeaderTableSize, 1, math.MaxUint32, initialHeaderTableSize)
|
|
100
|
+
if server {
|
|
101
|
+
setDefault(&conf.MaxUploadBufferPerConnection, initialWindowSize, math.MaxInt32, 1<<20)
|
|
102
|
+
} else {
|
|
103
|
+
setDefault(&conf.MaxUploadBufferPerConnection, initialWindowSize, math.MaxInt32, transportDefaultConnFlow)
|
|
104
|
+
}
|
|
105
|
+
if server {
|
|
106
|
+
setDefault(&conf.MaxUploadBufferPerStream, 1, math.MaxInt32, 1<<20)
|
|
107
|
+
} else {
|
|
108
|
+
setDefault(&conf.MaxUploadBufferPerStream, 1, math.MaxInt32, transportDefaultStreamFlow)
|
|
109
|
+
}
|
|
110
|
+
setDefault(&conf.MaxReadFrameSize, minMaxFrameSize, maxFrameSize, defaultMaxReadFrameSize)
|
|
111
|
+
setDefault(&conf.PingTimeout, 1, math.MaxInt64, 15*time.Second)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// adjustHTTP1MaxHeaderSize converts a limit in bytes on the size of an HTTP/1 header
|
|
115
|
+
// to an HTTP/2 MAX_HEADER_LIST_SIZE value.
|
|
116
|
+
func adjustHTTP1MaxHeaderSize(n int64) int64 {
|
|
117
|
+
// http2's count is in a slightly different unit and includes 32 bytes per pair.
|
|
118
|
+
// So, take the net/http.Server value and pad it up a bit, assuming 10 headers.
|
|
119
|
+
const perFieldOverhead = 32 // per http2 spec
|
|
120
|
+
const typicalHeaders = 10 // conservative
|
|
121
|
+
return n + typicalHeaders*perFieldOverhead
|
|
122
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Copyright 2024 The Go Authors. All rights reserved.
|
|
2
|
+
// Use of this source code is governed by a BSD-style
|
|
3
|
+
// license that can be found in the LICENSE file.
|
|
4
|
+
|
|
5
|
+
//go:build go1.24
|
|
6
|
+
|
|
7
|
+
package http2
|
|
8
|
+
|
|
9
|
+
import "net/http"
|
|
10
|
+
|
|
11
|
+
// fillNetHTTPServerConfig sets fields in conf from srv.HTTP2.
|
|
12
|
+
func fillNetHTTPServerConfig(conf *http2Config, srv *http.Server) {
|
|
13
|
+
fillNetHTTPConfig(conf, srv.HTTP2)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// fillNetHTTPTransportConfig sets fields in conf from tr.HTTP2.
|
|
17
|
+
func fillNetHTTPTransportConfig(conf *http2Config, tr *http.Transport) {
|
|
18
|
+
fillNetHTTPConfig(conf, tr.HTTP2)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
func fillNetHTTPConfig(conf *http2Config, h2 *http.HTTP2Config) {
|
|
22
|
+
if h2 == nil {
|
|
23
|
+
return
|
|
24
|
+
}
|
|
25
|
+
if h2.MaxConcurrentStreams != 0 {
|
|
26
|
+
conf.MaxConcurrentStreams = uint32(h2.MaxConcurrentStreams)
|
|
27
|
+
}
|
|
28
|
+
if h2.MaxEncoderHeaderTableSize != 0 {
|
|
29
|
+
conf.MaxEncoderHeaderTableSize = uint32(h2.MaxEncoderHeaderTableSize)
|
|
30
|
+
}
|
|
31
|
+
if h2.MaxDecoderHeaderTableSize != 0 {
|
|
32
|
+
conf.MaxDecoderHeaderTableSize = uint32(h2.MaxDecoderHeaderTableSize)
|
|
33
|
+
}
|
|
34
|
+
if h2.MaxConcurrentStreams != 0 {
|
|
35
|
+
conf.MaxConcurrentStreams = uint32(h2.MaxConcurrentStreams)
|
|
36
|
+
}
|
|
37
|
+
if h2.MaxReadFrameSize != 0 {
|
|
38
|
+
conf.MaxReadFrameSize = uint32(h2.MaxReadFrameSize)
|
|
39
|
+
}
|
|
40
|
+
if h2.MaxReceiveBufferPerConnection != 0 {
|
|
41
|
+
conf.MaxUploadBufferPerConnection = int32(h2.MaxReceiveBufferPerConnection)
|
|
42
|
+
}
|
|
43
|
+
if h2.MaxReceiveBufferPerStream != 0 {
|
|
44
|
+
conf.MaxUploadBufferPerStream = int32(h2.MaxReceiveBufferPerStream)
|
|
45
|
+
}
|
|
46
|
+
if h2.SendPingTimeout != 0 {
|
|
47
|
+
conf.SendPingTimeout = h2.SendPingTimeout
|
|
48
|
+
}
|
|
49
|
+
if h2.PingTimeout != 0 {
|
|
50
|
+
conf.PingTimeout = h2.PingTimeout
|
|
51
|
+
}
|
|
52
|
+
if h2.WriteByteTimeout != 0 {
|
|
53
|
+
conf.WriteByteTimeout = h2.WriteByteTimeout
|
|
54
|
+
}
|
|
55
|
+
if h2.PermitProhibitedCipherSuites {
|
|
56
|
+
conf.PermitProhibitedCipherSuites = true
|
|
57
|
+
}
|
|
58
|
+
if h2.CountError != nil {
|
|
59
|
+
conf.CountError = h2.CountError
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Copyright 2024 The Go Authors. All rights reserved.
|
|
2
|
+
// Use of this source code is governed by a BSD-style
|
|
3
|
+
// license that can be found in the LICENSE file.
|
|
4
|
+
|
|
5
|
+
//go:build !go1.24
|
|
6
|
+
|
|
7
|
+
package http2
|
|
8
|
+
|
|
9
|
+
import "net/http"
|
|
10
|
+
|
|
11
|
+
// Pre-Go 1.24 fallback.
|
|
12
|
+
// The Server.HTTP2 and Transport.HTTP2 config fields were added in Go 1.24.
|
|
13
|
+
|
|
14
|
+
func fillNetHTTPServerConfig(conf *http2Config, srv *http.Server) {}
|
|
15
|
+
|
|
16
|
+
func fillNetHTTPTransportConfig(conf *http2Config, tr *http.Transport) {}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// Copyright 2014 The Go Authors. All rights reserved.
|
|
2
|
+
// Use of this source code is governed by a BSD-style
|
|
3
|
+
// license that can be found in the LICENSE file.
|
|
4
|
+
|
|
5
|
+
package http2
|
|
6
|
+
|
|
7
|
+
import (
|
|
8
|
+
"errors"
|
|
9
|
+
"fmt"
|
|
10
|
+
"sync"
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
// Buffer chunks are allocated from a pool to reduce pressure on GC.
|
|
14
|
+
// The maximum wasted space per dataBuffer is 2x the largest size class,
|
|
15
|
+
// which happens when the dataBuffer has multiple chunks and there is
|
|
16
|
+
// one unread byte in both the first and last chunks. We use a few size
|
|
17
|
+
// classes to minimize overheads for servers that typically receive very
|
|
18
|
+
// small request bodies.
|
|
19
|
+
//
|
|
20
|
+
// TODO: Benchmark to determine if the pools are necessary. The GC may have
|
|
21
|
+
// improved enough that we can instead allocate chunks like this:
|
|
22
|
+
// make([]byte, max(16<<10, expectedBytesRemaining))
|
|
23
|
+
var dataChunkPools = [...]sync.Pool{
|
|
24
|
+
{New: func() interface{} { return new([1 << 10]byte) }},
|
|
25
|
+
{New: func() interface{} { return new([2 << 10]byte) }},
|
|
26
|
+
{New: func() interface{} { return new([4 << 10]byte) }},
|
|
27
|
+
{New: func() interface{} { return new([8 << 10]byte) }},
|
|
28
|
+
{New: func() interface{} { return new([16 << 10]byte) }},
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
func getDataBufferChunk(size int64) []byte {
|
|
32
|
+
switch {
|
|
33
|
+
case size <= 1<<10:
|
|
34
|
+
return dataChunkPools[0].Get().(*[1 << 10]byte)[:]
|
|
35
|
+
case size <= 2<<10:
|
|
36
|
+
return dataChunkPools[1].Get().(*[2 << 10]byte)[:]
|
|
37
|
+
case size <= 4<<10:
|
|
38
|
+
return dataChunkPools[2].Get().(*[4 << 10]byte)[:]
|
|
39
|
+
case size <= 8<<10:
|
|
40
|
+
return dataChunkPools[3].Get().(*[8 << 10]byte)[:]
|
|
41
|
+
default:
|
|
42
|
+
return dataChunkPools[4].Get().(*[16 << 10]byte)[:]
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
func putDataBufferChunk(p []byte) {
|
|
47
|
+
switch len(p) {
|
|
48
|
+
case 1 << 10:
|
|
49
|
+
dataChunkPools[0].Put((*[1 << 10]byte)(p))
|
|
50
|
+
case 2 << 10:
|
|
51
|
+
dataChunkPools[1].Put((*[2 << 10]byte)(p))
|
|
52
|
+
case 4 << 10:
|
|
53
|
+
dataChunkPools[2].Put((*[4 << 10]byte)(p))
|
|
54
|
+
case 8 << 10:
|
|
55
|
+
dataChunkPools[3].Put((*[8 << 10]byte)(p))
|
|
56
|
+
case 16 << 10:
|
|
57
|
+
dataChunkPools[4].Put((*[16 << 10]byte)(p))
|
|
58
|
+
default:
|
|
59
|
+
panic(fmt.Sprintf("unexpected buffer len=%v", len(p)))
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// dataBuffer is an io.ReadWriter backed by a list of data chunks.
|
|
64
|
+
// Each dataBuffer is used to read DATA frames on a single stream.
|
|
65
|
+
// The buffer is divided into chunks so the server can limit the
|
|
66
|
+
// total memory used by a single connection without limiting the
|
|
67
|
+
// request body size on any single stream.
|
|
68
|
+
type dataBuffer struct {
|
|
69
|
+
chunks [][]byte
|
|
70
|
+
r int // next byte to read is chunks[0][r]
|
|
71
|
+
w int // next byte to write is chunks[len(chunks)-1][w]
|
|
72
|
+
size int // total buffered bytes
|
|
73
|
+
expected int64 // we expect at least this many bytes in future Write calls (ignored if <= 0)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
var errReadEmpty = errors.New("read from empty dataBuffer")
|
|
77
|
+
|
|
78
|
+
// Read copies bytes from the buffer into p.
|
|
79
|
+
// It is an error to read when no data is available.
|
|
80
|
+
func (b *dataBuffer) Read(p []byte) (int, error) {
|
|
81
|
+
if b.size == 0 {
|
|
82
|
+
return 0, errReadEmpty
|
|
83
|
+
}
|
|
84
|
+
var ntotal int
|
|
85
|
+
for len(p) > 0 && b.size > 0 {
|
|
86
|
+
readFrom := b.bytesFromFirstChunk()
|
|
87
|
+
n := copy(p, readFrom)
|
|
88
|
+
p = p[n:]
|
|
89
|
+
ntotal += n
|
|
90
|
+
b.r += n
|
|
91
|
+
b.size -= n
|
|
92
|
+
// If the first chunk has been consumed, advance to the next chunk.
|
|
93
|
+
if b.r == len(b.chunks[0]) {
|
|
94
|
+
putDataBufferChunk(b.chunks[0])
|
|
95
|
+
end := len(b.chunks) - 1
|
|
96
|
+
copy(b.chunks[:end], b.chunks[1:])
|
|
97
|
+
b.chunks[end] = nil
|
|
98
|
+
b.chunks = b.chunks[:end]
|
|
99
|
+
b.r = 0
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return ntotal, nil
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
func (b *dataBuffer) bytesFromFirstChunk() []byte {
|
|
106
|
+
if len(b.chunks) == 1 {
|
|
107
|
+
return b.chunks[0][b.r:b.w]
|
|
108
|
+
}
|
|
109
|
+
return b.chunks[0][b.r:]
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Len returns the number of bytes of the unread portion of the buffer.
|
|
113
|
+
func (b *dataBuffer) Len() int {
|
|
114
|
+
return b.size
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Write appends p to the buffer.
|
|
118
|
+
func (b *dataBuffer) Write(p []byte) (int, error) {
|
|
119
|
+
ntotal := len(p)
|
|
120
|
+
for len(p) > 0 {
|
|
121
|
+
// If the last chunk is empty, allocate a new chunk. Try to allocate
|
|
122
|
+
// enough to fully copy p plus any additional bytes we expect to
|
|
123
|
+
// receive. However, this may allocate less than len(p).
|
|
124
|
+
want := int64(len(p))
|
|
125
|
+
if b.expected > want {
|
|
126
|
+
want = b.expected
|
|
127
|
+
}
|
|
128
|
+
chunk := b.lastChunkOrAlloc(want)
|
|
129
|
+
n := copy(chunk[b.w:], p)
|
|
130
|
+
p = p[n:]
|
|
131
|
+
b.w += n
|
|
132
|
+
b.size += n
|
|
133
|
+
b.expected -= int64(n)
|
|
134
|
+
}
|
|
135
|
+
return ntotal, nil
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
func (b *dataBuffer) lastChunkOrAlloc(want int64) []byte {
|
|
139
|
+
if len(b.chunks) != 0 {
|
|
140
|
+
last := b.chunks[len(b.chunks)-1]
|
|
141
|
+
if b.w < len(last) {
|
|
142
|
+
return last
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
chunk := getDataBufferChunk(want)
|
|
146
|
+
b.chunks = append(b.chunks, chunk)
|
|
147
|
+
b.w = 0
|
|
148
|
+
return chunk
|
|
149
|
+
}
|