mirror of
https://github.com/chainreactors/spray.git
synced 2025-05-06 18:51:22 +00:00
将net/http替换为fasthttp, 并初步实装compare
This commit is contained in:
parent
0712d2e746
commit
fd299db8c4
26
go.mod
26
go.mod
@ -5,30 +5,28 @@ go 1.17
|
||||
require (
|
||||
github.com/chainreactors/files v0.2.0 // indirect
|
||||
github.com/chainreactors/gogo/v2 v2.8.7
|
||||
github.com/chainreactors/ipcs v0.0.9 // indirect
|
||||
github.com/chainreactors/logs v0.5.0
|
||||
github.com/chainreactors/parsers v0.0.1 // indirect
|
||||
github.com/chainreactors/words v0.0.1 // indirect
|
||||
github.com/chainreactors/logs v0.6.1
|
||||
github.com/chainreactors/parsers v0.0.1
|
||||
github.com/chainreactors/words v0.0.1
|
||||
github.com/go-dedup/simhash v0.0.0-20170904020510-9ecaca7b509c
|
||||
github.com/panjf2000/ants/v2 v2.5.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/M09ic/go-ntlmssp v1.2.9 // indirect
|
||||
github.com/alouca/gologger v0.0.0-20120904114645-7d4b7291de9c // indirect
|
||||
github.com/alouca/gosnmp v0.0.0-20170620005048-04d83944c9ab // indirect
|
||||
github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 // indirect
|
||||
github.com/gosuri/uiprogress v0.0.1
|
||||
github.com/jessevdk/go-flags v1.5.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/andybalholm/brotli v1.0.4 // indirect
|
||||
github.com/go-dedup/megophone v0.0.0-20170830025436-f01be21026f5 // indirect
|
||||
github.com/go-dedup/text v0.0.0-20170907015346-8bb1b95e3cb7 // indirect
|
||||
github.com/gosuri/uilive v0.0.4 // indirect
|
||||
github.com/gosuri/uiprogress v0.0.1 // indirect
|
||||
github.com/jessevdk/go-flags v1.5.0 // indirect
|
||||
github.com/karrick/godirwalk v1.16.1 // indirect
|
||||
github.com/klauspost/compress v1.15.10 // indirect
|
||||
github.com/mattn/go-isatty v0.0.16 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/twmb/murmur3 v1.1.6 // indirect
|
||||
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 // indirect
|
||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65 // indirect
|
||||
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
||||
github.com/valyala/fasthttp v1.40.0 // indirect
|
||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
62
go.sum
62
go.sum
@ -1,30 +1,18 @@
|
||||
github.com/M09ic/go-ntlmssp v1.2.9 h1:VVpoldqbRlmyhxrVsJBy0qjAF1RSq89kSLEie/IWRew=
|
||||
github.com/M09ic/go-ntlmssp v1.2.9/go.mod h1:yMNEF6ulbFipt3CakMhcmcNVACshPRG4Ap4l00V+mMs=
|
||||
github.com/alouca/gologger v0.0.0-20120904114645-7d4b7291de9c h1:k/7/05/5kPRX7HaKyVYlsGVX6XkFTyYLqkqHzceUVlU=
|
||||
github.com/alouca/gologger v0.0.0-20120904114645-7d4b7291de9c/go.mod h1:SI1d/2/wpSTDjHgdS9ZLy6hqvsdhzVYAc8RLztweMpA=
|
||||
github.com/alouca/gosnmp v0.0.0-20170620005048-04d83944c9ab h1:pfx9N/EMDxIwVzGu9JLnmbOMNukW1mfPA9Ymo+S58Ng=
|
||||
github.com/alouca/gosnmp v0.0.0-20170620005048-04d83944c9ab/go.mod h1:kEcj+iUROrUCr7AIrul5NutI2kWv0ns9BL0ezVp1h/Y=
|
||||
github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
|
||||
github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
|
||||
github.com/chainreactors/files v0.2.0 h1:LeN97o4VxIvK9ZACjXfdRTR+N7puXuWyQO5GarCkMLM=
|
||||
github.com/chainreactors/files v0.2.0/go.mod h1:/Xa9YXhjBlaC33JTD6ZTJFig6pcplak2IDcovf42/6A=
|
||||
github.com/chainreactors/gogo/v2 v2.8.4 h1:jwV6tawOcUn/FM91WxxOp7ZQN/Msm0losAx5230QgL4=
|
||||
github.com/chainreactors/gogo/v2 v2.8.4/go.mod h1:hoNawrwZtkIciwApI6kzu88LLOGOJEqtegcHBuiPyPw=
|
||||
github.com/chainreactors/gogo/v2 v2.8.5 h1:7DfAQdyupToU4f+OYG+Hz4+0phyz3UGRrsAyTmX9Fm0=
|
||||
github.com/chainreactors/gogo/v2 v2.8.5/go.mod h1:SqlLDXXN/WgjVHpRIjB8OytRmHnj8l4Ic+h7pe/4wsY=
|
||||
github.com/chainreactors/gogo/v2 v2.8.6 h1:Xc9wi8K8/3u9s0V0vlch2rKHzQ+ATkLlHExGosUvVok=
|
||||
github.com/chainreactors/gogo/v2 v2.8.6/go.mod h1:SqlLDXXN/WgjVHpRIjB8OytRmHnj8l4Ic+h7pe/4wsY=
|
||||
github.com/chainreactors/gogo/v2 v2.8.7 h1:pN83yw7mtLFcNV12ZwxKdTR2sDZFSiqva/JRQMMRvao=
|
||||
github.com/chainreactors/gogo/v2 v2.8.7/go.mod h1:KFMyHLZSkpgDh/17N/k9gKYQ81MO+9MLdTMHQvoBSj0=
|
||||
github.com/chainreactors/ipcs v0.0.9 h1:4Onroq7gXLG5SLCCgNDx3JmtLxB4XgepGdHCtLp1Ows=
|
||||
github.com/chainreactors/ipcs v0.0.9/go.mod h1:E9M3Ohyq0TYQLlV4i2dbM9ThBZB1Nnd7Oexoie2xLII=
|
||||
github.com/chainreactors/logs v0.4.2/go.mod h1:Y0EtAnoF0kiASIJUnXN0pcOt420iRpHOAnOhEphzRHA=
|
||||
github.com/chainreactors/logs v0.5.0 h1:6CwTR1KaqZS0quIQRU3Ceq/gBoV0+seUF8gUJTrZvew=
|
||||
github.com/chainreactors/logs v0.5.0/go.mod h1:Y0EtAnoF0kiASIJUnXN0pcOt420iRpHOAnOhEphzRHA=
|
||||
github.com/chainreactors/logs v0.6.1 h1:+wLVqxErUyWYayAx6x+m5LA6jQBiHcLdTAJtiOUMoZU=
|
||||
github.com/chainreactors/logs v0.6.1/go.mod h1:Y0EtAnoF0kiASIJUnXN0pcOt420iRpHOAnOhEphzRHA=
|
||||
github.com/chainreactors/parsers v0.0.1 h1:GrfY4sfdv9TMuYNSKq3Jak2PO4AMJcDRAHocSb8DEx0=
|
||||
github.com/chainreactors/parsers v0.0.1/go.mod h1:pJ7As+BbXlC9SHBPCE4edc9xYPh5xik+YtKGHRclKx0=
|
||||
github.com/chainreactors/words v0.0.1 h1:d0rLwuKVzwLWD1CtYeTK7u2E5tv8dmebpq6EhUtNhhg=
|
||||
github.com/chainreactors/words v0.0.1/go.mod h1:QIWX1vMT5j/Mp9zx3/wgZh3FqskhjCbo/3Ffy/Hxj9w=
|
||||
github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 h1:ox2F0PSMlrAAiAdknSRMDrAr8mfxPCfSZolH+/qQnyQ=
|
||||
github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08/go.mod h1:pCxVEbcm3AMg7ejXyorUXi6HQCzOIBf7zEDVPtw0/U4=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
@ -43,8 +31,9 @@ github.com/gosuri/uiprogress v0.0.1/go.mod h1:C1RTYn4Sc7iEyf6j8ft5dyoZ4212h8G1ol
|
||||
github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc=
|
||||
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
|
||||
github.com/josharian/native v1.0.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
|
||||
github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw=
|
||||
github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk=
|
||||
github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||
github.com/klauspost/compress v1.15.10 h1:Ai8UzuomSCDw90e1qNMtb15msBXsNpH6gzkkENQNcJo=
|
||||
github.com/klauspost/compress v1.15.10/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
|
||||
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
|
||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||
github.com/mdlayher/arp v0.0.0-20220512170110-6706a2966875/go.mod h1:kfOoFJuHWp76v1RgZCb9/gVUc7XdY877S2uVYbNliGc=
|
||||
@ -53,47 +42,48 @@ github.com/mdlayher/packet v1.0.0/go.mod h1:eE7/ctqDhoiRhQ44ko5JZU2zxB88g+JH/6jm
|
||||
github.com/mdlayher/socket v0.2.1/go.mod h1:QLlNPkFR88mRUNQIzRBMfXxwKal8H7u1h3bL1CV+f0E=
|
||||
github.com/panjf2000/ants/v2 v2.5.0 h1:1rWGWSnxCsQBga+nQbA4/iY6VMeNoOIAM0ZWh9u3q2Q=
|
||||
github.com/panjf2000/ants/v2 v2.5.0/go.mod h1:cU93usDlihJZ5CfRGNDYsiBYvoilLvBF5Qp/BT2GNRE=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/projectdiscovery/fileutil v0.0.0-20210928100737-cab279c5d4b5 h1:2dbm7UhrAKnccZttr78CAmG768sSCd+MBn4ayLVDeqA=
|
||||
github.com/projectdiscovery/fileutil v0.0.0-20210928100737-cab279c5d4b5/go.mod h1:U+QCpQnX8o2N2w0VUGyAzjM3yBAe4BKedVElxiImsx0=
|
||||
github.com/projectdiscovery/goflags v0.0.9 h1:bPsYIPE1LvdgYaM3XNX0YmS68e6huv22W22rKh5IscI=
|
||||
github.com/projectdiscovery/goflags v0.0.9/go.mod h1:t/dEhv2VDOzayugXZCkbkX8n+pPeVmRD+WgQRSgReeI=
|
||||
github.com/projectdiscovery/stringsutil v0.0.0-20210804142656-fd3c28dbaafe h1:tQTgf5XLBgZbkJDPtnV3SfdP9tzz5ZWeDBwv8WhnH9Q=
|
||||
github.com/projectdiscovery/stringsutil v0.0.0-20210804142656-fd3c28dbaafe/go.mod h1:oTRc18WBv9t6BpaN9XBY+QmG28PUpsyDzRht56Qf49I=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/twmb/murmur3 v1.1.6 h1:mqrRot1BRxm+Yct+vavLMou2/iJt0tNVTTC0QoIjaZg=
|
||||
github.com/twmb/murmur3 v1.1.6/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ=
|
||||
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||
github.com/valyala/fasthttp v1.40.0 h1:CRq/00MfruPGFLTQKY8b+8SfdK60TxNztjRMnH0t1Yc=
|
||||
github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I=
|
||||
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM=
|
||||
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65 h1:+rhAzEzT3f4JtomfC371qB+0Ola2caSKcY69NUBZrRQ=
|
||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c=
|
||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU=
|
||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
|
||||
|
@ -3,120 +3,92 @@ package internal
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/chainreactors/logs"
|
||||
"github.com/chainreactors/parsers"
|
||||
"github.com/chainreactors/spray/pkg"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"github.com/valyala/fasthttp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func NewBaseline(u *url.URL, resp *http.Response) *baseline {
|
||||
func NewBaseline(u *fasthttp.URI, resp *fasthttp.Response) (*baseline, error) {
|
||||
bl := &baseline{
|
||||
Url: u,
|
||||
UrlString: u.String(),
|
||||
BodyLength: resp.ContentLength,
|
||||
Status: resp.StatusCode,
|
||||
IsValid: true,
|
||||
Url: u,
|
||||
UrlString: u.String(),
|
||||
Status: resp.StatusCode(),
|
||||
IsValid: true,
|
||||
Body: make([]byte, 20480),
|
||||
}
|
||||
|
||||
var header strings.Builder
|
||||
for k, v := range resp.Header {
|
||||
for _, i := range v {
|
||||
header.WriteString(k)
|
||||
header.WriteString(": ")
|
||||
header.WriteString(i)
|
||||
header.WriteString("\r\n")
|
||||
}
|
||||
}
|
||||
bl.Header = header.String()
|
||||
bl.HeaderLength = header.Len()
|
||||
|
||||
redirectURL, err := resp.Location()
|
||||
if err == nil {
|
||||
bl.RedirectURL = redirectURL.String()
|
||||
}
|
||||
|
||||
body := make([]byte, 20480)
|
||||
if bl.BodyLength > 0 {
|
||||
n, err := io.ReadFull(resp.Body, body)
|
||||
if err == nil {
|
||||
bl.Body = body
|
||||
} else if err == io.ErrUnexpectedEOF {
|
||||
bl.Body = body[:n]
|
||||
} else {
|
||||
logs.Log.Error("readfull failed" + err.Error())
|
||||
}
|
||||
}
|
||||
if len(bl.Body) > 0 {
|
||||
bl.Md5 = parsers.Md5Hash(bl.Body)
|
||||
bl.Mmh3 = parsers.Mmh3Hash32(bl.Body)
|
||||
bl.Simhash = pkg.Simhash(bl.Body)
|
||||
if strings.Contains(string(bl.Body), bl.UrlString[1:]) {
|
||||
bl.IsDynamicUrl = true
|
||||
}
|
||||
// todo callback
|
||||
}
|
||||
|
||||
// todo extract
|
||||
bl.Extracteds = pkg.Extractors.Extract(bl.Response)
|
||||
// todo 指纹识别
|
||||
bl.Frameworks = pkg.FingerDetect(bl.Response)
|
||||
return bl
|
||||
bl.Body = resp.Body()
|
||||
bl.BodyLength = resp.Header.ContentLength()
|
||||
bl.Header = resp.Header.Header()
|
||||
bl.HeaderLength = resp.Header.Len()
|
||||
bl.RedirectURL = string(resp.Header.Peek("Location"))
|
||||
bl.Raw = append(bl.Header, bl.Body...)
|
||||
return bl, nil
|
||||
}
|
||||
|
||||
func NewInvalidBaseline(u *url.URL, resp *http.Response) *baseline {
|
||||
func NewInvalidBaseline(u *fasthttp.URI, resp *fasthttp.Response) *baseline {
|
||||
bl := &baseline{
|
||||
Url: u,
|
||||
UrlString: u.String(),
|
||||
BodyLength: resp.ContentLength,
|
||||
Status: resp.StatusCode,
|
||||
IsValid: false,
|
||||
Url: u,
|
||||
UrlString: u.String(),
|
||||
//BodyLength: resp.ContentLength,
|
||||
Status: resp.StatusCode(),
|
||||
IsValid: false,
|
||||
}
|
||||
|
||||
redirectURL, err := resp.Location()
|
||||
if err == nil {
|
||||
bl.RedirectURL = redirectURL.String()
|
||||
}
|
||||
bl.RedirectURL = string(resp.Header.Peek("Location"))
|
||||
|
||||
return bl
|
||||
}
|
||||
|
||||
type baseline struct {
|
||||
Url *url.URL `json:"-"`
|
||||
Url *fasthttp.URI `json:"-"`
|
||||
UrlString string `json:"url_string"`
|
||||
Body []byte `json:"-"`
|
||||
BodyLength int64 `json:"body_length"`
|
||||
Header string `json:"-"`
|
||||
Response string `json:"-"`
|
||||
BodyLength int `json:"body_length"`
|
||||
Header []byte `json:"-"`
|
||||
Raw []byte `json:"-"`
|
||||
HeaderLength int `json:"header_length"`
|
||||
RedirectURL string `json:"redirect_url"`
|
||||
Status int `json:"status"`
|
||||
Md5 string `json:"md5"`
|
||||
Mmh3 string `json:"mmh3"`
|
||||
Simhash string `json:"simhash"`
|
||||
IsDynamicUrl bool `json:"is_dynamic_url"` // 判断是否存在动态的url
|
||||
Spended int `json:"spended"` // 耗时, 毫秒
|
||||
Frameworks pkg.Frameworks `json:"frameworks"`
|
||||
Extracteds pkg.Extracteds `json:"extracts"`
|
||||
Err error `json:"-"`
|
||||
IsValid bool `json:"-"`
|
||||
*parsers.Hashes
|
||||
}
|
||||
|
||||
func (bl *baseline) Compare(other *baseline) bool {
|
||||
if bl.Md5 == other.Md5 {
|
||||
// Collect 深度收集信息
|
||||
func (bl *baseline) Collect() {
|
||||
bl.Hashes = parsers.NewHashes(bl.Raw)
|
||||
// todo extract
|
||||
bl.Extracteds = pkg.Extractors.Extract(string(bl.Raw))
|
||||
// todo 指纹识别
|
||||
bl.Frameworks = pkg.FingerDetect(string(bl.Raw))
|
||||
}
|
||||
|
||||
// Equal if this equal other return true
|
||||
func (bl *baseline) Equal(other *baseline) bool {
|
||||
if other.RedirectURL != "" && bl.RedirectURL == other.RedirectURL {
|
||||
// 如果重定向url不为空, 且与bl不相同, 则说明不是同一个页面
|
||||
return true
|
||||
}
|
||||
|
||||
if bl.RedirectURL == other.RedirectURL {
|
||||
return true
|
||||
if bl.BodyLength == other.BodyLength {
|
||||
// 如果body length相等且md5相等, 则说明是同一个页面
|
||||
if bl.BodyMd5 == parsers.Md5Hash(other.Raw) {
|
||||
return true
|
||||
} else {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func (bl *baseline) FuzzyCompare() bool {
|
||||
func (bl *baseline) FuzzyEqual(other *baseline) bool {
|
||||
// todo 模糊匹配
|
||||
return false
|
||||
}
|
||||
@ -132,6 +104,7 @@ func (bl *baseline) String() string {
|
||||
}
|
||||
line.WriteString(bl.Frameworks.ToString())
|
||||
//line.WriteString(bl.Extracteds)
|
||||
line.WriteString("\n")
|
||||
return line.String()
|
||||
}
|
||||
|
||||
|
@ -6,6 +6,7 @@ import (
|
||||
"github.com/chainreactors/spray/pkg"
|
||||
"github.com/chainreactors/words"
|
||||
"github.com/panjf2000/ants/v2"
|
||||
"github.com/valyala/fasthttp"
|
||||
"net/http"
|
||||
"sync"
|
||||
"time"
|
||||
@ -13,55 +14,58 @@ import (
|
||||
|
||||
var (
|
||||
CheckStatusCode func(int) bool
|
||||
CheckRedirect func(*http.Response) bool
|
||||
CheckRedirect func(string) bool
|
||||
CheckWaf func(*http.Response) bool
|
||||
)
|
||||
|
||||
func NewPool(ctx context.Context, config *pkg.Config, outputCh chan *baseline) (*Pool, error) {
|
||||
pctx, cancel := context.WithCancel(ctx)
|
||||
pool := &Pool{
|
||||
Config: config,
|
||||
ctx: pctx,
|
||||
client: pkg.NewClient(config.Thread, 2),
|
||||
worder: words.NewWorder(config.Wordlist),
|
||||
//baseReq: req,
|
||||
Config: config,
|
||||
ctx: pctx,
|
||||
client: pkg.NewClient(config.Thread, 2),
|
||||
worder: words.NewWorder(config.Wordlist),
|
||||
outputCh: outputCh,
|
||||
tempCh: make(chan *baseline, config.Thread),
|
||||
wg: &sync.WaitGroup{},
|
||||
}
|
||||
|
||||
switch config.Mod {
|
||||
case pkg.PathSpray:
|
||||
pool.genReq = func(s string) (*http.Request, error) {
|
||||
pool.genReq = func(s string) (*fasthttp.Request, error) {
|
||||
return pool.BuildPathRequest(s)
|
||||
}
|
||||
case pkg.HostSpray:
|
||||
pool.genReq = func(s string) (*http.Request, error) {
|
||||
pool.genReq = func(s string) (*fasthttp.Request, error) {
|
||||
return pool.BuildHostRequest(s)
|
||||
}
|
||||
}
|
||||
|
||||
p, _ := ants.NewPoolWithFunc(config.Thread, func(i interface{}) {
|
||||
var bl *baseline
|
||||
unit := i.(*Unit)
|
||||
req, err := pool.genReq(unit.path)
|
||||
if err != nil {
|
||||
logs.Log.Error(err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
var bl *baseline
|
||||
resp, err := pool.client.Do(pctx, req)
|
||||
if err != nil {
|
||||
//logs.Log.Debugf("%s request error, %s", strurl, err.Error())
|
||||
pool.errorCount++
|
||||
bl = &baseline{Err: err}
|
||||
} else {
|
||||
defer resp.Body.Close() // 必须要关闭body ,否则keep-alive无法生效
|
||||
defer fasthttp.ReleaseResponse(resp)
|
||||
defer fasthttp.ReleaseRequest(req)
|
||||
//defer resp.Body.Close() // 必须要关闭body ,否则keep-alive无法生效
|
||||
if err = pool.PreCompare(resp); err == nil || unit.source == CheckSource {
|
||||
// 通过预对比跳过一些无用数据, 减少性能消耗
|
||||
bl = NewBaseline(req.URL, resp)
|
||||
bl, err = NewBaseline(req.URI(), resp)
|
||||
} else if err == ErrWaf {
|
||||
cancel()
|
||||
} else {
|
||||
bl = NewInvalidBaseline(req.URL, resp)
|
||||
bl = NewInvalidBaseline(req.URI(), resp)
|
||||
}
|
||||
}
|
||||
|
||||
@ -69,8 +73,8 @@ func NewPool(ctx context.Context, config *pkg.Config, outputCh chan *baseline) (
|
||||
case CheckSource:
|
||||
pool.baseline = bl
|
||||
case WordSource:
|
||||
// todo compare
|
||||
pool.outputCh <- bl
|
||||
// 异步进行性能消耗较大的深度对比
|
||||
pool.tempCh <- bl
|
||||
}
|
||||
//todo connectivity check
|
||||
pool.bar.Done()
|
||||
@ -78,7 +82,7 @@ func NewPool(ctx context.Context, config *pkg.Config, outputCh chan *baseline) (
|
||||
})
|
||||
|
||||
pool.pool = p
|
||||
|
||||
go pool.Comparing()
|
||||
return pool, nil
|
||||
}
|
||||
|
||||
@ -93,9 +97,10 @@ type Pool struct {
|
||||
//baseReq *http.Request
|
||||
baseline *baseline
|
||||
outputCh chan *baseline
|
||||
tempCh chan *baseline
|
||||
totalCount int
|
||||
errorCount int
|
||||
genReq func(s string) (*http.Request, error)
|
||||
genReq func(s string) (*fasthttp.Request, error)
|
||||
//wordlist []string
|
||||
worder *words.Worder
|
||||
wg *sync.WaitGroup
|
||||
@ -115,17 +120,13 @@ func (p *Pool) Init() error {
|
||||
}
|
||||
|
||||
if p.baseline.RedirectURL != "" {
|
||||
CheckRedirect = func(resp *http.Response) bool {
|
||||
redirectURL, err := resp.Location()
|
||||
if err != nil {
|
||||
// baseline 为3xx, 但path不为3xx时, 为有效数据
|
||||
return true
|
||||
} else if redirectURL.String() != p.baseline.RedirectURL {
|
||||
// path为3xx, 且与baseline中的RedirectURL不同时, 为有效数据
|
||||
return true
|
||||
} else {
|
||||
CheckRedirect = func(redirectURL string) bool {
|
||||
if redirectURL == p.baseline.RedirectURL {
|
||||
// 相同的RedirectURL将被认为是无效数据
|
||||
return false
|
||||
} else {
|
||||
// path为3xx, 且与baseline中的RedirectURL不同时, 为有效数据
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -157,18 +158,18 @@ Loop:
|
||||
p.wg.Wait()
|
||||
}
|
||||
|
||||
func (p *Pool) PreCompare(resp *http.Response) error {
|
||||
if !CheckStatusCode(resp.StatusCode) {
|
||||
func (p *Pool) PreCompare(resp *fasthttp.Response) error {
|
||||
if !CheckStatusCode(resp.StatusCode()) {
|
||||
return ErrBadStatus
|
||||
}
|
||||
|
||||
if CheckRedirect != nil && !CheckRedirect(resp) {
|
||||
if CheckRedirect != nil && !CheckRedirect(string(resp.Header.Peek("Location"))) {
|
||||
return ErrRedirect
|
||||
}
|
||||
|
||||
if CheckWaf != nil && !CheckWaf(resp) {
|
||||
return ErrWaf
|
||||
}
|
||||
//if CheckWaf != nil && !CheckWaf(resp) {
|
||||
// return ErrWaf
|
||||
//}
|
||||
|
||||
return nil
|
||||
}
|
||||
@ -177,20 +178,36 @@ func (p *Pool) RunWithWord(words []string) {
|
||||
|
||||
}
|
||||
|
||||
func (p *Pool) BuildPathRequest(path string) (*http.Request, error) {
|
||||
req, err := http.NewRequest("GET", p.BaseURL+path, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
func (p *Pool) Comparing() {
|
||||
for bl := range p.tempCh {
|
||||
if p.baseline.Equal(bl) {
|
||||
// 如果是同一个包则设置为无效包
|
||||
bl.IsValid = false
|
||||
p.outputCh <- bl
|
||||
continue
|
||||
}
|
||||
|
||||
bl.Collect()
|
||||
if p.EnableFuzzy && p.baseline.FuzzyEqual(bl) {
|
||||
bl.IsValid = false
|
||||
p.outputCh <- bl
|
||||
continue
|
||||
}
|
||||
|
||||
p.outputCh <- bl
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Pool) BuildPathRequest(path string) (*fasthttp.Request, error) {
|
||||
req := fasthttp.AcquireRequest()
|
||||
req.SetRequestURI(p.BaseURL + path)
|
||||
return req, nil
|
||||
}
|
||||
|
||||
func (p *Pool) BuildHostRequest(host string) (*http.Request, error) {
|
||||
req, err := http.NewRequest("GET", p.BaseURL, nil)
|
||||
req.Host = host
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
func (p *Pool) BuildHostRequest(host string) (*fasthttp.Request, error) {
|
||||
req := fasthttp.AcquireRequest()
|
||||
req.SetRequestURI(p.BaseURL)
|
||||
req.SetHost(host)
|
||||
return req, nil
|
||||
}
|
||||
|
||||
|
@ -3,36 +3,45 @@ package pkg
|
||||
import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"github.com/valyala/fasthttp"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
func NewClient(thread int, timeout int) *Client {
|
||||
tr := &http.Transport{
|
||||
//Proxy: Proxy,
|
||||
//TLSHandshakeTimeout : delay * time.Second,
|
||||
TLSClientConfig: &tls.Config{
|
||||
Renegotiation: tls.RenegotiateOnceAsClient,
|
||||
InsecureSkipVerify: true,
|
||||
},
|
||||
MaxConnsPerHost: thread,
|
||||
IdleConnTimeout: time.Duration(timeout) * time.Second,
|
||||
}
|
||||
//c := &fasthttp.Client{
|
||||
// TLSConfig: &tls.Config{
|
||||
//tr := &http.Transport{
|
||||
// //Proxy: Proxy,
|
||||
// //TLSHandshakeTimeout : delay * time.Second,
|
||||
// TLSClientConfig: &tls.Config{
|
||||
// Renegotiation: tls.RenegotiateOnceAsClient,
|
||||
// InsecureSkipVerify: true,
|
||||
// },
|
||||
// MaxConnsPerHost: thread,
|
||||
// MaxIdleConnDuration: time.Duration(timeout) * time.Second,
|
||||
// MaxConnsPerHost: thread,
|
||||
// IdleConnTimeout: time.Duration(timeout) * time.Second,
|
||||
//}
|
||||
c := &Client{
|
||||
client: &http.Client{
|
||||
Transport: tr,
|
||||
Timeout: time.Second * time.Duration(timeout),
|
||||
CheckRedirect: checkRedirect,
|
||||
client: &fasthttp.Client{
|
||||
TLSConfig: &tls.Config{
|
||||
Renegotiation: tls.RenegotiateOnceAsClient,
|
||||
InsecureSkipVerify: true,
|
||||
},
|
||||
//ReadBufferSize: 20480,
|
||||
MaxConnsPerHost: thread,
|
||||
MaxIdleConnDuration: time.Duration(timeout) * time.Second,
|
||||
MaxConnWaitTimeout: time.Duration(timeout) * time.Second,
|
||||
ReadTimeout: time.Duration(timeout) * time.Second,
|
||||
WriteTimeout: time.Duration(timeout) * time.Second,
|
||||
MaxResponseBodySize: 20480,
|
||||
},
|
||||
timeout: time.Duration(timeout) * time.Second,
|
||||
}
|
||||
//c := &Client{
|
||||
// client: &http.Client{
|
||||
// Transport: tr,
|
||||
// Timeout: time.Second * time.Duration(timeout),
|
||||
// CheckRedirect: checkRedirect,
|
||||
// },
|
||||
//}
|
||||
|
||||
//c.Method = method
|
||||
//c.Headers = Opt.Headers
|
||||
@ -42,15 +51,16 @@ func NewClient(thread int, timeout int) *Client {
|
||||
}
|
||||
|
||||
type Client struct {
|
||||
client *http.Client
|
||||
client *fasthttp.Client
|
||||
timeout time.Duration
|
||||
}
|
||||
|
||||
func (c Client) Do(ctx context.Context, req *http.Request) (*http.Response, error) {
|
||||
func (c *Client) Do(ctx context.Context, req *fasthttp.Request) (*fasthttp.Response, error) {
|
||||
//if req.Header == nil {
|
||||
// req.Header = c.Headers
|
||||
//}
|
||||
|
||||
return c.client.Do(req)
|
||||
resp := fasthttp.AcquireResponse()
|
||||
return resp, c.client.Do(req, resp)
|
||||
}
|
||||
|
||||
var MaxRedirects = 0
|
||||
|
@ -28,4 +28,5 @@ type Config struct {
|
||||
Mod SprayMod
|
||||
Headers http.Header
|
||||
DeadlineTime int
|
||||
EnableFuzzy bool
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user