diff --git a/go.mod b/go.mod index f7bcc72..0835a38 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/gorilla/websocket v1.4.2 github.com/hexops/gotextdiff v1.0.3 github.com/iancoleman/strcase v0.1.3 - github.com/lucas-clemente/quic-go v0.21.0 + github.com/lucas-clemente/quic-go v0.23.0 github.com/mattn/go-colorable v0.1.8 github.com/mattn/go-sqlite3 v1.14.7 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect @@ -41,9 +41,11 @@ require ( github.com/ziutek/mymysql v1.5.4 // indirect gitlab.com/yawning/obfs4.git v0.0.0-20210511220700-e330d1b7024b gitlab.com/yawning/utls.git v0.0.12-1 - golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf // indirect - golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d + golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect + golang.org/x/mod v0.5.0 // indirect + golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 + golang.org/x/tools v0.1.5 // indirect gopkg.in/AlecAivazis/survey.v1 v1.8.8 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect upper.io/db.v3 v3.8.0+incompatible diff --git a/go.sum b/go.sum index 04b714d..568975a 100644 --- a/go.sum +++ b/go.sum @@ -135,6 +135,8 @@ github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gobuffalo/logger v1.0.3 h1:YaXOTHNPCvkqqA7w05A4v0k2tCdpr+sgFlgINbQ6gqc= github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7TCjEhjKxM= github.com/gobuffalo/packd v1.0.0 h1:6ERZvJHfe24rfFmA9OaoKBdC7+c9sydrytMg8SdFGBM= @@ -155,8 +157,8 @@ github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200j github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0 h1:jlYHihg//f7RRwuPfptm04yp4s7O6Kw8EZiVYIGcH0g= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -167,6 +169,9 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -291,8 +296,8 @@ github.com/lib/pq v1.10.0 h1:Zx5DJFEYQXio93kgXnQ09fXNiUKsqv4OUEu2UtGcB1E= github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lucas-clemente/quic-go v0.21.0 h1:ZdC8UBxUSBdPlEv1+4y4SqIBy54VA8bRxN7DmkQ0URs= -github.com/lucas-clemente/quic-go v0.21.0/go.mod h1:BWkfkkOSJD1AxFNBqdjBZi6FznZ96bhdcvZiA+LDrY8= +github.com/lucas-clemente/quic-go v0.23.0 h1:5vFnKtZ6nHDFsc/F3uuiF4T3y/AXaQdxjUqiVw26GZE= +github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -305,12 +310,11 @@ github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/marten-seemann/qpack v0.2.1 h1:jvTsT/HpCn2UZJdP+UUB53FfUUgeOyG5K1ns0OJOGVs= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= -github.com/marten-seemann/qtls-go1-15 v0.1.4 h1:RehYMOyRW8hPVEja1KBVsFVNSm35Jj9Mvs5yNoZZ28A= github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-16 v0.1.3 h1:XEZ1xGorVy9u+lJq+WXNE+hiqRYLNvJGYmwfwKQN2gU= -github.com/marten-seemann/qtls-go1-16 v0.1.3/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-17 v0.1.0-alpha.1 h1:LRFa3YRSlOAf9y56Szfhlh60CQrIMBSK/rneZD1gtuk= -github.com/marten-seemann/qtls-go1-17 v0.1.0-alpha.1/go.mod h1:lQDiKZDfPagLmg1zMtEgoBMSTAORq6M08lBogD5FtBY= +github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= +github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= +github.com/marten-seemann/qtls-go1-17 v0.1.0 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= +github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -366,8 +370,9 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -377,14 +382,17 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= +github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/ooni/oohttp v0.0.0-20210818104219-f8ceac6f2622 h1:Wpu4o3J3fLD4BPqA3CmrnbXVAAWKEjramvfhDUFZp+E= github.com/ooni/oohttp v0.0.0-20210818104219-f8ceac6f2622/go.mod h1:kgtoj+Dn4bmx09hEUgbPI7YX0gkWlu+fz2I0S5auyX4= github.com/ooni/probe-assets v0.3.1 h1:6PDcoJTICJxL8PdeM0+a3ZfkTWrFfCn90fUqTWR0LDA= @@ -602,6 +610,8 @@ github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+A github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE= github.com/xtaci/smux v1.5.12 h1:n9OGjdqQuVZXLh46+L4IR5tR2wvuUFwRABnN/V55bIY= github.com/xtaci/smux v1.5.12/go.mod h1:OMlQbT5vcgl2gb49mFkYo6SMf+zP3rcjcwQz7ZU7IGY= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo= @@ -648,8 +658,8 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210317152858-513c2a44f670/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf h1:B2n+Zi5QeYRDAEodEu72OS36gmTWjgpXr2+cWcBW90o= -golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -661,6 +671,9 @@ golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKG golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0 h1:UG21uOlmZabA4fW5i7ZX6bjw1xELEGg/ZLgZq9auk/Q= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -690,13 +703,17 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201201195509-5d6afe98e0b7/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -708,6 +725,7 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -747,13 +765,16 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201231184435-2d18734c6014/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 h1:c8PlLMqBbOHoqtjteWm5/kbe6rNY2pbRfbIMVnepueo= golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -786,6 +807,10 @@ golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200308013534-11ec41452d41/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -825,6 +850,9 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/AlecAivazis/survey.v1 v1.8.8 h1:5UtTowJZTz1j7NxVzDGKTz6Lm9IWm8DDF6b7a2wq9VY= gopkg.in/AlecAivazis/survey.v1 v1.8.8/go.mod h1:CaHjv79TCgAvXMSFJSVgonHXYWxnhzI3eoHtnX5UgUo= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= diff --git a/internal/engine/netx/quicdialer/system.go b/internal/engine/netx/quicdialer/system.go index 29a1e2b..63016a8 100644 --- a/internal/engine/netx/quicdialer/system.go +++ b/internal/engine/netx/quicdialer/system.go @@ -4,15 +4,15 @@ import ( "net" "time" - "github.com/lucas-clemente/quic-go" "github.com/ooni/probe-cli/v3/internal/engine/netx/trace" "github.com/ooni/probe-cli/v3/internal/errorsx" + "github.com/ooni/probe-cli/v3/internal/quicx" ) // QUICListener listens for QUIC connections. type QUICListener interface { // Listen creates a new listening UDPConn. - Listen(addr *net.UDPAddr) (quic.OOBCapablePacketConn, error) + Listen(addr *net.UDPAddr) (quicx.UDPLikeConn, error) } // QUICListenerSaver is a QUICListener that also implements saving events. @@ -25,22 +25,27 @@ type QUICListenerSaver struct { } // Listen implements QUICListener.Listen. -func (qls *QUICListenerSaver) Listen(addr *net.UDPAddr) (quic.OOBCapablePacketConn, error) { +func (qls *QUICListenerSaver) Listen(addr *net.UDPAddr) (quicx.UDPLikeConn, error) { pconn, err := qls.QUICListener.Listen(addr) if err != nil { return nil, err } - return saverUDPConn{OOBCapablePacketConn: pconn, saver: qls.Saver}, nil + return &saverUDPConn{ + UDPLikeConn: pconn, + saver: qls.Saver, + }, nil } type saverUDPConn struct { - quic.OOBCapablePacketConn + quicx.UDPLikeConn saver *trace.Saver } -func (c saverUDPConn) WriteTo(p []byte, addr net.Addr) (int, error) { +var _ quicx.UDPLikeConn = &saverUDPConn{} + +func (c *saverUDPConn) WriteTo(p []byte, addr net.Addr) (int, error) { start := time.Now() - count, err := c.OOBCapablePacketConn.WriteTo(p, addr) + count, err := c.UDPLikeConn.WriteTo(p, addr) stop := time.Now() c.saver.Write(trace.Event{ Address: addr.String(), @@ -54,16 +59,16 @@ func (c saverUDPConn) WriteTo(p []byte, addr net.Addr) (int, error) { return count, err } -func (c saverUDPConn) ReadMsgUDP(b, oob []byte) (int, int, int, *net.UDPAddr, error) { +func (c *saverUDPConn) ReadFrom(b []byte) (int, net.Addr, error) { start := time.Now() - n, oobn, flags, addr, err := c.OOBCapablePacketConn.ReadMsgUDP(b, oob) + n, addr, err := c.UDPLikeConn.ReadFrom(b) stop := time.Now() var data []byte if n > 0 { data = b[:n] } c.saver.Write(trace.Event{ - Address: addr.String(), + Address: c.safeAddrString(addr), Data: data, Duration: stop.Sub(start), Err: err, @@ -71,5 +76,12 @@ func (c saverUDPConn) ReadMsgUDP(b, oob []byte) (int, int, int, *net.UDPAddr, er Name: errorsx.ReadFromOperation, Time: stop, }) - return n, oobn, flags, addr, err + return n, addr, err +} + +func (c *saverUDPConn) safeAddrString(addr net.Addr) (out string) { + if addr != nil { + out = addr.String() + } + return } diff --git a/internal/engine/netx/quicdialer/system_test.go b/internal/engine/netx/quicdialer/system_test.go index b7a1d61..4e0f1a6 100644 --- a/internal/engine/netx/quicdialer/system_test.go +++ b/internal/engine/netx/quicdialer/system_test.go @@ -3,6 +3,8 @@ package quicdialer_test import ( "context" "crypto/tls" + "errors" + "net" "testing" "github.com/lucas-clemente/quic-go" @@ -10,8 +12,33 @@ import ( "github.com/ooni/probe-cli/v3/internal/engine/netx/trace" "github.com/ooni/probe-cli/v3/internal/errorsx" "github.com/ooni/probe-cli/v3/internal/netxlite" + "github.com/ooni/probe-cli/v3/internal/netxmocks" + "github.com/ooni/probe-cli/v3/internal/quicx" ) +func TestQUICListenerSaverCannotListen(t *testing.T) { + expected := errors.New("mocked error") + qls := &quicdialer.QUICListenerSaver{ + QUICListener: &netxmocks.QUICListener{ + MockListen: func(addr *net.UDPAddr) (quicx.UDPLikeConn, error) { + return nil, expected + }, + }, + Saver: &trace.Saver{}, + } + pconn, err := qls.Listen(&net.UDPAddr{ + IP: []byte{}, + Port: 8080, + Zone: "", + }) + if !errors.Is(err, expected) { + t.Fatal("unexpected error", err) + } + if pconn != nil { + t.Fatal("expected nil pconn here") + } +} + func TestSystemDialerSuccessWithReadWrite(t *testing.T) { // This is the most common use case for collecting reads, writes tlsConf := &tls.Config{ diff --git a/internal/errorsx/quic.go b/internal/errorsx/quic.go index a997769..5ec2064 100644 --- a/internal/errorsx/quic.go +++ b/internal/errorsx/quic.go @@ -7,6 +7,7 @@ import ( "net" "github.com/lucas-clemente/quic-go" + "github.com/ooni/probe-cli/v3/internal/quicx" ) // QUICContextDialer is a dialer for QUIC using Context. @@ -21,7 +22,7 @@ type QUICContextDialer interface { // QUICListener listens for QUIC connections. type QUICListener interface { // Listen creates a new listening UDPConn. - Listen(addr *net.UDPAddr) (quic.OOBCapablePacketConn, error) + Listen(addr *net.UDPAddr) (quicx.UDPLikeConn, error) } // ErrorWrapperQUICListener is a QUICListener that wraps errors. @@ -33,7 +34,7 @@ type ErrorWrapperQUICListener struct { var _ QUICListener = &ErrorWrapperQUICListener{} // Listen implements QUICListener.Listen. -func (qls *ErrorWrapperQUICListener) Listen(addr *net.UDPAddr) (quic.OOBCapablePacketConn, error) { +func (qls *ErrorWrapperQUICListener) Listen(addr *net.UDPAddr) (quicx.UDPLikeConn, error) { pconn, err := qls.QUICListener.Listen(addr) if err != nil { return nil, SafeErrWrapperBuilder{ @@ -44,17 +45,17 @@ func (qls *ErrorWrapperQUICListener) Listen(addr *net.UDPAddr) (quic.OOBCapableP return &errorWrapperUDPConn{pconn}, nil } -// errorWrapperUDPConn is a quic.OOBCapablePacketConn that wraps errors. +// errorWrapperUDPConn is a quicx.UDPLikeConn that wraps errors. type errorWrapperUDPConn struct { - // OOBCapablePacketConn is the underlying conn. - quic.OOBCapablePacketConn + // UDPLikeConn is the underlying conn. + quicx.UDPLikeConn } -var _ quic.OOBCapablePacketConn = &errorWrapperUDPConn{} +var _ quicx.UDPLikeConn = &errorWrapperUDPConn{} -// WriteTo implements quic.OOBCapablePacketConn.WriteTo. +// WriteTo implements quicx.UDPLikeConn.WriteTo. func (c *errorWrapperUDPConn) WriteTo(p []byte, addr net.Addr) (int, error) { - count, err := c.OOBCapablePacketConn.WriteTo(p, addr) + count, err := c.UDPLikeConn.WriteTo(p, addr) if err != nil { return 0, SafeErrWrapperBuilder{ Error: err, @@ -64,16 +65,16 @@ func (c *errorWrapperUDPConn) WriteTo(p []byte, addr net.Addr) (int, error) { return count, nil } -// ReadMsgUDP implements quic.OOBCapablePacketConn.ReadMsgUDP. -func (c *errorWrapperUDPConn) ReadMsgUDP(b, oob []byte) (int, int, int, *net.UDPAddr, error) { - n, oobn, flags, addr, err := c.OOBCapablePacketConn.ReadMsgUDP(b, oob) +// ReadFrom implements quicx.UDPLikeConn.ReadFrom. +func (c *errorWrapperUDPConn) ReadFrom(b []byte) (int, net.Addr, error) { + n, addr, err := c.UDPLikeConn.ReadFrom(b) if err != nil { - return 0, 0, 0, nil, SafeErrWrapperBuilder{ + return 0, nil, SafeErrWrapperBuilder{ Error: err, Operation: ReadFromOperation, }.MaybeBuild() } - return n, oobn, flags, addr, nil + return n, addr, nil } // ErrorWrapperQUICDialer is a dialer that performs quic err wrapping diff --git a/internal/errorsx/quic_test.go b/internal/errorsx/quic_test.go index 3eddc64..2da182c 100644 --- a/internal/errorsx/quic_test.go +++ b/internal/errorsx/quic_test.go @@ -10,12 +10,13 @@ import ( "github.com/lucas-clemente/quic-go" "github.com/ooni/probe-cli/v3/internal/netxmocks" + "github.com/ooni/probe-cli/v3/internal/quicx" ) func TestErrorWrapperQUICListenerSuccess(t *testing.T) { ql := &ErrorWrapperQUICListener{ QUICListener: &netxmocks.QUICListener{ - MockListen: func(addr *net.UDPAddr) (quic.OOBCapablePacketConn, error) { + MockListen: func(addr *net.UDPAddr) (quicx.UDPLikeConn, error) { return &net.UDPConn{}, nil }, }, @@ -30,7 +31,7 @@ func TestErrorWrapperQUICListenerSuccess(t *testing.T) { func TestErrorWrapperQUICListenerFailure(t *testing.T) { ql := &ErrorWrapperQUICListener{ QUICListener: &netxmocks.QUICListener{ - MockListen: func(addr *net.UDPAddr) (quic.OOBCapablePacketConn, error) { + MockListen: func(addr *net.UDPAddr) (quicx.UDPLikeConn, error) { return nil, io.EOF }, }, @@ -46,7 +47,7 @@ func TestErrorWrapperQUICListenerFailure(t *testing.T) { func TestErrorWrapperUDPConnWriteToSuccess(t *testing.T) { quc := &errorWrapperUDPConn{ - OOBCapablePacketConn: &netxmocks.QUICUDPConn{ + UDPLikeConn: &netxmocks.QUICUDPConn{ MockWriteTo: func(p []byte, addr net.Addr) (int, error) { return 10, nil }, @@ -66,7 +67,7 @@ func TestErrorWrapperUDPConnWriteToSuccess(t *testing.T) { func TestErrorWrapperUDPConnWriteToFailure(t *testing.T) { expected := errors.New("mocked error") quc := &errorWrapperUDPConn{ - OOBCapablePacketConn: &netxmocks.QUICUDPConn{ + UDPLikeConn: &netxmocks.QUICUDPConn{ MockWriteTo: func(p []byte, addr net.Addr) (int, error) { return 0, expected }, @@ -83,58 +84,44 @@ func TestErrorWrapperUDPConnWriteToFailure(t *testing.T) { } } -func TestErrorWrapperUDPConnReadMsgUDPSuccess(t *testing.T) { +func TestErrorWrapperUDPConnReadFromSuccess(t *testing.T) { expected := errors.New("mocked error") quc := &errorWrapperUDPConn{ - OOBCapablePacketConn: &netxmocks.QUICUDPConn{ - MockReadMsgUDP: func(b, oob []byte) (int, int, int, *net.UDPAddr, error) { - return 0, 0, 0, nil, expected + UDPLikeConn: &netxmocks.QUICUDPConn{ + MockReadFrom: func(b []byte) (int, net.Addr, error) { + return 0, nil, expected }, }, } b := make([]byte, 128) - oob := make([]byte, 128) - n, oobn, flags, addr, err := quc.ReadMsgUDP(b, oob) + n, addr, err := quc.ReadFrom(b) if !errors.Is(err, expected) { t.Fatal("not the error we expected", err) } if n != 0 { t.Fatal("expected 0 here") } - if oobn != 0 { - t.Fatal("expected 0 here") - } - if flags != 0 { - t.Fatal("expected 0 here") - } if addr != nil { t.Fatal("expected nil here") } } -func TestErrorWrapperUDPConnReadMsgUDPFailure(t *testing.T) { +func TestErrorWrapperUDPConnReadFromFailure(t *testing.T) { quc := &errorWrapperUDPConn{ - OOBCapablePacketConn: &netxmocks.QUICUDPConn{ - MockReadMsgUDP: func(b, oob []byte) (int, int, int, *net.UDPAddr, error) { - return 10, 1, 0, nil, nil + UDPLikeConn: &netxmocks.QUICUDPConn{ + MockReadFrom: func(b []byte) (int, net.Addr, error) { + return 10, nil, nil }, }, } b := make([]byte, 128) - oob := make([]byte, 128) - n, oobn, flags, addr, err := quc.ReadMsgUDP(b, oob) + n, addr, err := quc.ReadFrom(b) if err != nil { t.Fatal("not the error we expected", err) } if n != 10 { t.Fatal("expected 10 here") } - if oobn != 1 { - t.Fatal("expected 1 here") - } - if flags != 0 { - t.Fatal("expected 0 here") - } if addr != nil { t.Fatal("expected nil here") } diff --git a/internal/netxlite/quic.go b/internal/netxlite/quic.go index c4d0fb6..b9c6940 100644 --- a/internal/netxlite/quic.go +++ b/internal/netxlite/quic.go @@ -8,6 +8,7 @@ import ( "strconv" "github.com/lucas-clemente/quic-go" + "github.com/ooni/probe-cli/v3/internal/quicx" ) // QUICContextDialer is a dialer for QUIC using Context. @@ -22,7 +23,7 @@ type QUICContextDialer interface { // QUICListener listens for QUIC connections. type QUICListener interface { // Listen creates a new listening UDPConn. - Listen(addr *net.UDPAddr) (quic.OOBCapablePacketConn, error) + Listen(addr *net.UDPAddr) (quicx.UDPLikeConn, error) } // QUICListenerStdlib is a QUICListener using the standard library. @@ -31,7 +32,7 @@ type QUICListenerStdlib struct{} var _ QUICListener = &QUICListenerStdlib{} // Listen implements QUICListener.Listen. -func (qls *QUICListenerStdlib) Listen(addr *net.UDPAddr) (quic.OOBCapablePacketConn, error) { +func (qls *QUICListenerStdlib) Listen(addr *net.UDPAddr) (quicx.UDPLikeConn, error) { return net.ListenUDP("udp", addr) } @@ -118,13 +119,13 @@ func (d *QUICDialerQUICGo) maybeApplyTLSDefaults(config *tls.Config, port int) * return config } -// quicSessionOwnsConn ensures that we close the PacketConn. +// quicSessionOwnsConn ensures that we close the UDPLikeConn. type quicSessionOwnsConn struct { // EarlySession is the embedded early session quic.EarlySession // conn is the connection we own - conn net.PacketConn + conn quicx.UDPLikeConn } // CloseWithError implements quic.EarlySession.CloseWithError. diff --git a/internal/netxlite/quic_test.go b/internal/netxlite/quic_test.go index a3f0b52..f06a0e0 100644 --- a/internal/netxlite/quic_test.go +++ b/internal/netxlite/quic_test.go @@ -12,6 +12,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/lucas-clemente/quic-go" "github.com/ooni/probe-cli/v3/internal/netxmocks" + "github.com/ooni/probe-cli/v3/internal/quicx" ) func TestQUICDialerQUICGoCannotSplitHostPort(t *testing.T) { @@ -75,7 +76,7 @@ func TestQUICDialerQUICGoCannotListen(t *testing.T) { } systemdialer := QUICDialerQUICGo{ QUICListener: &netxmocks.QUICListener{ - MockListen: func(addr *net.UDPAddr) (quic.OOBCapablePacketConn, error) { + MockListen: func(addr *net.UDPAddr) (quicx.UDPLikeConn, error) { return nil, expected }, }, diff --git a/internal/netxlite/tlshandshaker_test.go b/internal/netxlite/tlshandshaker_test.go index 7a25f54..15451da 100644 --- a/internal/netxlite/tlshandshaker_test.go +++ b/internal/netxlite/tlshandshaker_test.go @@ -185,6 +185,9 @@ func TestUTLSHandshakerChrome(t *testing.T) { } cfg := &tls.Config{ServerName: "google.com"} conn, err := net.Dial("tcp", "google.com:443") + if err != nil { + t.Fatal("unexpected error", err) + } conn, _, err = h.Handshake(context.Background(), conn, cfg) if err != nil { t.Fatal("unexpected error", err) diff --git a/internal/netxmocks/quic.go b/internal/netxmocks/quic.go index 13463b4..57e7040 100644 --- a/internal/netxmocks/quic.go +++ b/internal/netxmocks/quic.go @@ -8,15 +8,16 @@ import ( "time" "github.com/lucas-clemente/quic-go" + "github.com/ooni/probe-cli/v3/internal/quicx" ) // QUICListener is a mockable netxlite.QUICListener. type QUICListener struct { - MockListen func(addr *net.UDPAddr) (quic.OOBCapablePacketConn, error) + MockListen func(addr *net.UDPAddr) (quicx.UDPLikeConn, error) } // Listen calls MockListen. -func (ql *QUICListener) Listen(addr *net.UDPAddr) (quic.OOBCapablePacketConn, error) { +func (ql *QUICListener) Listen(addr *net.UDPAddr) (quicx.UDPLikeConn, error) { return ql.MockListen(addr) } @@ -132,7 +133,6 @@ func (s *QUICEarlySession) ReceiveMessage() ([]byte, error) { // QUICUDPConn is an UDP conn used by QUIC. type QUICUDPConn struct { MockWriteTo func(p []byte, addr net.Addr) (int, error) - MockReadMsgUDP func(b, oob []byte) (int, int, int, *net.UDPAddr, error) MockClose func() error MockLocalAddr func() net.Addr MockRemoteAddr func() net.Addr @@ -141,21 +141,16 @@ type QUICUDPConn struct { MockSetWriteDeadline func(t time.Time) error MockReadFrom func(p []byte) (n int, addr net.Addr, err error) MockSyscallConn func() (syscall.RawConn, error) - MockWriteMsgUDP func(b, oob []byte, addr *net.UDPAddr) (n, oobn int, err error) + MockSetReadBuffer func(n int) error } -var _ quic.OOBCapablePacketConn = &QUICUDPConn{} +var _ quicx.UDPLikeConn = &QUICUDPConn{} // WriteTo calls MockWriteTo. func (c *QUICUDPConn) WriteTo(p []byte, addr net.Addr) (int, error) { return c.MockWriteTo(p, addr) } -// ReadMsgUDP calls MockReadMsgUDP. -func (c *QUICUDPConn) ReadMsgUDP(b, oob []byte) (int, int, int, *net.UDPAddr, error) { - return c.MockReadMsgUDP(b, oob) -} - // Close calls MockClose. func (c *QUICUDPConn) Close() error { return c.MockClose() @@ -196,7 +191,7 @@ func (c *QUICUDPConn) SyscallConn() (syscall.RawConn, error) { return c.MockSyscallConn() } -// WriteMsgUDP calls MockReadMsgUDP. -func (c *QUICUDPConn) WriteMsgUDP(b, oob []byte, addr *net.UDPAddr) (n, oobn int, err error) { - return c.MockWriteMsgUDP(b, oob, addr) +// SetReadBuffer calls MockSetReadBuffer. +func (c *QUICUDPConn) SetReadBuffer(n int) error { + return c.MockSetReadBuffer(n) } diff --git a/internal/netxmocks/quic_test.go b/internal/netxmocks/quic_test.go index f57d311..5fe456c 100644 --- a/internal/netxmocks/quic_test.go +++ b/internal/netxmocks/quic_test.go @@ -12,12 +12,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/lucas-clemente/quic-go" + "github.com/ooni/probe-cli/v3/internal/quicx" ) func TestQUICListenerListen(t *testing.T) { expected := errors.New("mocked error") ql := &QUICListener{ - MockListen: func(addr *net.UDPAddr) (quic.OOBCapablePacketConn, error) { + MockListen: func(addr *net.UDPAddr) (quicx.UDPLikeConn, error) { return nil, expected }, } @@ -287,33 +288,6 @@ func TestQUICUDPConnWriteTo(t *testing.T) { } } -func TestQUICUDPConnReadMsgUDP(t *testing.T) { - expected := errors.New("mocked error") - quc := &QUICUDPConn{ - MockReadMsgUDP: func(b, oob []byte) (int, int, int, *net.UDPAddr, error) { - return 0, 0, 0, nil, expected - }, - } - b := make([]byte, 128) - oob := make([]byte, 128) - n, oobn, flags, addr, err := quc.ReadMsgUDP(b, oob) - if !errors.Is(err, expected) { - t.Fatal("not the error we expected", err) - } - if n != 0 { - t.Fatal("expected zero here") - } - if oobn != 0 { - t.Fatal("expected zero here") - } - if flags != 0 { - t.Fatal("expected zero here") - } - if addr != nil { - t.Fatal("expected nil here") - } -} - func TestQUICUDPConnClose(t *testing.T) { expected := errors.New("mocked error") quc := &QUICUDPConn{ @@ -434,24 +408,15 @@ func TestQUICUDPConnSyscallConn(t *testing.T) { } } -func TestQUICUDPConnWriteMsgUDP(t *testing.T) { +func TestQUICUDPConnSetReadBuffer(t *testing.T) { expected := errors.New("mocked error") quc := &QUICUDPConn{ - MockWriteMsgUDP: func(b, oob []byte, addr *net.UDPAddr) (n int, oobn int, err error) { - return 0, 0, expected + MockSetReadBuffer: func(n int) error { + return expected }, } - b := make([]byte, 128) - oob := make([]byte, 128) - addr := &net.UDPAddr{} - n, oobn, err := quc.WriteMsgUDP(b, oob, addr) + err := quc.SetReadBuffer(1 << 10) if !errors.Is(err, expected) { t.Fatal("not the error we expected", err) } - if n != 0 { - t.Fatal("expected 0 here") - } - if oobn != 0 { - t.Fatal("expected 0 here") - } } diff --git a/internal/quicx/quicx.go b/internal/quicx/quicx.go new file mode 100644 index 0000000..e8c9be6 --- /dev/null +++ b/internal/quicx/quicx.go @@ -0,0 +1,40 @@ +// Package quicx contains lucas-clemente/quic-go extensions. +// +// This code introduces the UDPLikeConn, whose documentation explain +// why we need to introduce this new type. We could not put this +// code inside an existing package because it's used (as of 20 Aug 2021) +// by the netxlite package as well as by the netxmocks package. +package quicx + +import ( + "net" + "syscall" +) + +// UDPLikeConn is a net.PacketConn with some extra functions +// required to convince the QUIC library (lucas-clemente/quic-go) +// to inflate the receive buffer of the connection. +// +// The QUIC library will treat this connection as a "dumb" +// net.PacketConn, calling its ReadFrom and WriteTo methods +// as opposed to more advanced methods that are available +// under Linux and FreeBSD and improve the performance. +// +// It seems fine to avoid performance optimizations, because +// they would complicate the implementation on our side and +// our use cases (blocking and heavy throttling) do not seem +// to require such optimizations. +// +// See https://github.com/ooni/probe/issues/1754 for a more +// comprehensive discussion of UDPLikeConn. +type UDPLikeConn interface { + // An UDPLikeConn is a net.PacketConn conn. + net.PacketConn + + // SetReadBuffer allows setting the read buffer. + SetReadBuffer(bytes int) error + + // SyscallConn returns a conn suitable for calling syscalls, + // which is also instrumental to setting the read buffer. + SyscallConn() (syscall.RawConn, error) +}