diff --git a/captcha/captcha.go b/captcha/captcha.go deleted file mode 100644 index 12e741d..0000000 --- a/captcha/captcha.go +++ /dev/null @@ -1,32 +0,0 @@ -package captcha - -import ( - "github.com/mojocn/base64Captcha" -) - -func GetCaptcha() (string, string) { - //config struct for Character - //字符,公式,验证码配置 - var configC = base64Captcha.ConfigCharacter{ - Height: 30, - Width: 80, - //const CaptchaModeNumber:数字,CaptchaModeAlphabet:字母,CaptchaModeArithmetic:算术,CaptchaModeNumberAlphabet:数字字母混合. - Mode: base64Captcha.CaptchaModeNumber, - ComplexOfNoiseText: base64Captcha.CaptchaComplexLower, - ComplexOfNoiseDot: base64Captcha.CaptchaComplexLower, - IsUseSimpleFont: true, - IsShowHollowLine: false, - IsShowNoiseDot: false, - IsShowNoiseText: false, - IsShowSlimeLine: false, - IsShowSineLine: false, - CaptchaLen: 4, - } - idKeyC, capC := base64Captcha.GenerateCaptcha("", configC) - base64stringC := base64Captcha.CaptchaWriteToBase64Encoding(capC) - return idKeyC, base64stringC -} - -func Verify(idKey, verifyValue string) bool { - return base64Captcha.VerifyCaptcha(idKey, verifyValue) -} diff --git a/consumer/consumer.go b/consumer/consumer.go deleted file mode 100644 index 53c5251..0000000 --- a/consumer/consumer.go +++ /dev/null @@ -1,72 +0,0 @@ -package consumer - -import ( - "github.com/nsqio/go-nsq" - "sync" -) - -type baseConsumerService struct { - consumers []*BaseConsumer -} - -func New() *baseConsumerService { - return &baseConsumerService{ - consumers: []*BaseConsumer{}, - } -} -func (s *baseConsumerService) Register(b *BaseConsumer) { - s.consumers = append(s.consumers, b) -} -func (s *baseConsumerService) Run() error { - for _, v := range s.consumers { - if err := v.Run(); err != nil { - return err - } - } - return nil -} - -func (s *baseConsumerService) Stop() error { - for _, v := range s.consumers { - if err := v.Stop(); err != nil { - return err - } - } - return nil -} - -type BaseConsumer struct { - host, topic, consumerChan string - wg *sync.WaitGroup - consumer *nsq.Consumer -} - -func (s *BaseConsumer) Stop() error { - s.consumer.Stop() - s.wg.Wait() - return nil -} -func (s *BaseConsumer) Run() error { - return s.consumer.ConnectToNSQD(s.host) -} - -func NewBaseConsumer(host, topic, consumerChan string, fun func(msg *nsq.Message) error) *BaseConsumer { - resp := &BaseConsumer{ - wg: &sync.WaitGroup{}, - consumer: nil, - host: host, - topic: topic, - consumerChan: consumerChan, - } - consumer, err := nsq.NewConsumer(topic, consumerChan, nsq.NewConfig()) - if err != nil { - panic(err) - } - consumer.AddHandler(nsq.HandlerFunc(func(msg *nsq.Message) error { - resp.wg.Add(1) - defer resp.wg.Done() - return fun(msg) - })) - resp.consumer = consumer - return resp -} diff --git a/go.mod b/go.mod index 581f6ff..5c4c15c 100644 --- a/go.mod +++ b/go.mod @@ -1,41 +1,3 @@ module git.diulo.com/mogfee/go-common go 1.20 - -require ( - github.com/PuerkitoBio/goquery v1.8.1 - github.com/gin-gonic/gin v1.9.0 - github.com/mojocn/base64Captcha v1.2.2 - github.com/nsqio/go-nsq v1.1.0 - github.com/pkg/errors v0.9.1 -) - -require ( - github.com/andybalholm/cascadia v1.3.1 // indirect - github.com/bytedance/sonic v1.8.0 // indirect - github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect - github.com/gin-contrib/sse v0.1.0 // indirect - github.com/go-playground/locales v0.14.1 // indirect - github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.11.2 // indirect - github.com/goccy/go-json v0.10.0 // indirect - github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/golang/snappy v0.0.1 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/cpuid/v2 v2.0.9 // indirect - github.com/leodido/go-urn v1.2.1 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect - github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect - github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - github.com/ugorji/go/codec v1.2.9 // indirect - golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect - golang.org/x/crypto v0.5.0 // indirect - golang.org/x/image v0.0.0-20190501045829-6d32002ffd75 // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -) diff --git a/go.sum b/go.sum index be33b4d..e69de29 100644 --- a/go.sum +++ b/go.sum @@ -1,124 +0,0 @@ -github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= -github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= -github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= -github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.8.0 h1:ea0Xadu+sHlu7x5O3gKhRpQ1IKiMrSiHttPF0ybECuA= -github.com/bytedance/sonic v1.8.0/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= -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= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.9.0 h1:OjyFBKICoexlu99ctXNR2gg+c5pKrKMuyjgARg9qeY8= -github.com/gin-gonic/gin v1.9.0/go.mod h1:W1Me9+hsUSyj3CePGrd1/QrKJMSJ1Tu/0hFEH89961k= -github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU= -github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s= -github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA= -github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mojocn/base64Captcha v1.2.2 h1:NTFnThPVrb3tR66JO/N8/ZHsyFrNc7ho+xRpxBUEIlo= -github.com/mojocn/base64Captcha v1.2.2/go.mod h1:wAQCKEc5bDujxKRmbT6/vTnTt5CjStQ8bRfPWUuz/iY= -github.com/nsqio/go-nsq v1.1.0 h1:PQg+xxiUjA7V+TLdXw7nVrJ5Jbl3sN86EhGCQj4+FYE= -github.com/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= -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/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= -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/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= -github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/ugorji/go/codec v1.2.9 h1:rmenucSohSTiyL09Y+l2OCk+FrMxGMzho2+tjr5ticU= -github.com/ugorji/go/codec v1.2.9/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= -golang.org/x/image v0.0.0-20190501045829-6d32002ffd75 h1:TbGuee8sSq15Iguxu4deQ7+Bqq/d2rsQejGcEtADAMQ= -golang.org/x/image v0.0.0-20190501045829-6d32002ffd75/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/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-20201119102817-f84b799fce68/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-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/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/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -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/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/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= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/php_session_decoder/common.go b/php_session_decoder/common.go deleted file mode 100644 index 061e750..0000000 --- a/php_session_decoder/common.go +++ /dev/null @@ -1,7 +0,0 @@ -package php_session_decoder - -import "git.diulo.com/mogfee/go-common/php_session_decoder/php_serialize" - -const SEPARATOR_VALUE_NAME rune = '|' - -type PhpSession map[string]php_serialize.PhpValue diff --git a/php_session_decoder/decoder.go b/php_session_decoder/decoder.go deleted file mode 100644 index 1b72bae..0000000 --- a/php_session_decoder/decoder.go +++ /dev/null @@ -1,66 +0,0 @@ -package php_session_decoder - -import ( - "bytes" - "git.diulo.com/mogfee/go-common/php_session_decoder/php_serialize" - "io" - "strings" -) - -type PhpDecoder struct { - source *strings.Reader - decoder *php_serialize.UnSerializer -} - -func NewPhpDecoder(phpSession string) *PhpDecoder { - decoder := &PhpDecoder{ - source: strings.NewReader(phpSession), - decoder: php_serialize.NewUnSerializer(""), - } - decoder.decoder.SetReader(decoder.source) - return decoder -} - -func (self *PhpDecoder) SetSerializedDecodeFunc(f php_serialize.SerializedDecodeFunc) { - self.decoder.SetSerializedDecodeFunc(f) -} - -func (self *PhpDecoder) Decode() (PhpSession, error) { - var ( - name string - err error - value php_serialize.PhpValue - ) - res := make(PhpSession) - - for { - if name, err = self.readName(); err != nil { - break - } - if value, err = self.decoder.Decode(); err != nil { - break - } - res[name] = value - } - - if err == io.EOF { - err = nil - } - return res, err -} - -func (self *PhpDecoder) readName() (string, error) { - var ( - token rune - err error - ) - buf := bytes.NewBuffer([]byte{}) - for { - if token, _, err = self.source.ReadRune(); err != nil || token == SEPARATOR_VALUE_NAME { - break - } else { - buf.WriteRune(token) - } - } - return buf.String(), err -} diff --git a/php_session_decoder/encoder.go b/php_session_decoder/encoder.go deleted file mode 100644 index fe2d3dc..0000000 --- a/php_session_decoder/encoder.go +++ /dev/null @@ -1,46 +0,0 @@ -package php_session_decoder - -import ( - "bytes" - "fmt" - "git.diulo.com/mogfee/go-common/php_session_decoder/php_serialize" -) - -type PhpEncoder struct { - data PhpSession - encoder *php_serialize.Serializer -} - -func NewPhpEncoder(data PhpSession) *PhpEncoder { - return &PhpEncoder{ - data: data, - encoder: php_serialize.NewSerializer(), - } -} - -func (self *PhpEncoder) SetSerializedEncodeFunc(f php_serialize.SerializedEncodeFunc) { - self.encoder.SetSerializedEncodeFunc(f) -} - -func (self *PhpEncoder) Encode() (string, error) { - if self.data == nil { - return "", nil - } - var ( - err error - val string - ) - buf := bytes.NewBuffer([]byte{}) - - for k, v := range self.data { - buf.WriteString(k) - buf.WriteRune(SEPARATOR_VALUE_NAME) - if val, err = self.encoder.Encode(v); err != nil { - err = fmt.Errorf("php_session: error during encode value for %q: %v", k, err) - break - } - buf.WriteString(val) - } - - return buf.String(), err -} diff --git a/php_session_decoder/php_serialize/common.go b/php_session_decoder/php_serialize/common.go deleted file mode 100644 index e5dd462..0000000 --- a/php_session_decoder/php_serialize/common.go +++ /dev/null @@ -1,189 +0,0 @@ -package php_serialize - -const ( - TOKEN_NULL rune = 'N' - TOKEN_BOOL rune = 'b' - TOKEN_INT rune = 'i' - TOKEN_FLOAT rune = 'd' - TOKEN_STRING rune = 's' - TOKEN_ARRAY rune = 'a' - TOKEN_OBJECT rune = 'O' - TOKEN_OBJECT_SERIALIZED rune = 'C' - TOKEN_REFERENCE rune = 'R' - TOKEN_REFERENCE_OBJECT rune = 'r' - TOKEN_SPL_ARRAY rune = 'x' - TOKEN_SPL_ARRAY_MEMBERS rune = 'm' - - SEPARATOR_VALUE_TYPE rune = ':' - SEPARATOR_VALUES rune = ';' - - DELIMITER_STRING_LEFT rune = '"' - DELIMITER_STRING_RIGHT rune = '"' - DELIMITER_OBJECT_LEFT rune = '{' - DELIMITER_OBJECT_RIGHT rune = '}' - - FORMATTER_FLOAT byte = 'g' - FORMATTER_PRECISION int = 17 -) - -var ( - debugMode = false -) - -func Debug(value bool) { - debugMode = value -} - -func NewPhpObject(className string) *PhpObject { - return &PhpObject{ - className: className, - members: PhpArray{}, - } -} - -type SerializedDecodeFunc func(string) (PhpValue, error) - -type SerializedEncodeFunc func(PhpValue) (string, error) - -type PhpValue interface{} - -type PhpArray map[PhpValue]PhpValue - -type PhpSlice []PhpValue - -type PhpObject struct { - className string - members PhpArray -} - -func (self *PhpObject) GetClassName() string { - return self.className -} - -func (self *PhpObject) SetClassName(name string) *PhpObject { - self.className = name - return self -} - -func (self *PhpObject) GetMembers() PhpArray { - return self.members -} - -func (self *PhpObject) SetMembers(members PhpArray) *PhpObject { - self.members = members - return self -} - -func (self *PhpObject) GetPrivate(name string) (v PhpValue, ok bool) { - v, ok = self.members["\x00"+self.className+"\x00"+name] - return -} - -func (self *PhpObject) SetPrivate(name string, value PhpValue) *PhpObject { - self.members["\x00"+self.className+"\x00"+name] = value - return self -} - -func (self *PhpObject) GetProtected(name string) (v PhpValue, ok bool) { - v, ok = self.members["\x00*\x00"+name] - return -} - -func (self *PhpObject) SetProtected(name string, value PhpValue) *PhpObject { - self.members["\x00*\x00"+name] = value - return self -} - -func (self *PhpObject) GetPublic(name string) (v PhpValue, ok bool) { - v, ok = self.members[name] - return -} - -func (self *PhpObject) SetPublic(name string, value PhpValue) *PhpObject { - self.members[name] = value - return self -} - -func NewPhpObjectSerialized(className string) *PhpObjectSerialized { - return &PhpObjectSerialized{ - className: className, - } -} - -type PhpObjectSerialized struct { - className string - data string - value PhpValue -} - -func (self *PhpObjectSerialized) GetClassName() string { - return self.className -} - -func (self *PhpObjectSerialized) SetClassName(name string) *PhpObjectSerialized { - self.className = name - return self -} - -func (self *PhpObjectSerialized) GetData() string { - return self.data -} - -func (self *PhpObjectSerialized) SetData(data string) *PhpObjectSerialized { - self.data = data - return self -} - -func (self *PhpObjectSerialized) GetValue() PhpValue { - return self.value -} - -func (self *PhpObjectSerialized) SetValue(value PhpValue) *PhpObjectSerialized { - self.value = value - return self -} - -func NewPhpSplArray(array, properties PhpValue) *PhpSplArray { - if array == nil { - array = make(PhpArray) - } - - if properties == nil { - properties = make(PhpArray) - } - - return &PhpSplArray{ - array: array, - properties: properties, - } -} - -type PhpSplArray struct { - flags int - array PhpValue - properties PhpValue -} - -func (self *PhpSplArray) GetFlags() int { - return self.flags -} - -func (self *PhpSplArray) SetFlags(value int) { - self.flags = value -} - -func (self *PhpSplArray) GetArray() PhpValue { - return self.array -} - -func (self *PhpSplArray) SetArray(value PhpValue) { - self.array = value -} - -func (self *PhpSplArray) GetProperties() PhpValue { - return self.properties -} - -func (self *PhpSplArray) SetProperties(value PhpValue) { - self.properties = value -} diff --git a/php_session_decoder/php_serialize/common_helper.go b/php_session_decoder/php_serialize/common_helper.go deleted file mode 100644 index 9e95356..0000000 --- a/php_session_decoder/php_serialize/common_helper.go +++ /dev/null @@ -1,91 +0,0 @@ -package php_serialize - -import ( - "strconv" -) - -func PhpValueString(p PhpValue) (res string) { - res, _ = p.(string) - return -} - -func PhpValueBool(p PhpValue) (res bool) { - switch v := p.(type) { - case bool: - res = v - case string: - res, _ = strconv.ParseBool(v) - } - return -} - -func PhpValueInt(p PhpValue) (res int) { - switch intVal := p.(type) { - case int: - res = intVal - case int8: - res = int(intVal) - case int16: - res = int(intVal) - case int32: - res = int(intVal) - case int64: - res = int(intVal) - case uint: - res = int(intVal) - case uint8: - res = int(intVal) - case uint16: - res = int(intVal) - case uint32: - res = int(intVal) - case uint64: - res = int(intVal) - case string: - str, _ := p.(string) - res, _ = strconv.Atoi(str) - } - return -} - -func PhpValueInt64(p PhpValue) (res int64) { - switch v := p.(type) { - case int64: - res = v - default: - res = int64(PhpValueInt(v)) - } - return -} - -func PhpValueUInt(p PhpValue) (res uint) { - switch v := p.(type) { - case uint: - res = v - default: - res = uint(PhpValueInt(v)) - } - return -} - -func PhpValueUInt64(p PhpValue) (res uint64) { - switch v := p.(type) { - case uint64: - res = v - default: - res = uint64(PhpValueInt(v)) - } - return -} - -func PhpValueFloat64(p PhpValue) (res float64) { - switch v := p.(type) { - case float64: - res = v - case string: - res, _ = strconv.ParseFloat(v, 64) - default: - return float64(PhpValueInt(p)) - } - return -} diff --git a/php_session_decoder/php_serialize/serialize.go b/php_session_decoder/php_serialize/serialize.go deleted file mode 100644 index bb1c673..0000000 --- a/php_session_decoder/php_serialize/serialize.go +++ /dev/null @@ -1,264 +0,0 @@ -package php_serialize - -import ( - "bytes" - "fmt" - "strconv" -) - -func Serialize(v PhpValue) (string, error) { - encoder := NewSerializer() - encoder.SetSerializedEncodeFunc(SerializedEncodeFunc(Serialize)) - return encoder.Encode(v) -} - -type Serializer struct { - lastErr error - encodeFunc SerializedEncodeFunc -} - -func NewSerializer() *Serializer { - return &Serializer{} -} - -func (self *Serializer) SetSerializedEncodeFunc(f SerializedEncodeFunc) { - self.encodeFunc = f -} - -func (self *Serializer) Encode(v PhpValue) (string, error) { - var value bytes.Buffer - - switch t := v.(type) { - default: - self.saveError(fmt.Errorf("php_serialize: Unknown type %T with value %#v", t, v)) - case nil: - value = self.encodeNull() - case bool: - value = self.encodeBool(v) - case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64: - value = self.encodeNumber(v) - case string: - value = self.encodeString(v, DELIMITER_STRING_LEFT, DELIMITER_STRING_RIGHT, true) - case PhpArray, map[PhpValue]PhpValue, PhpSlice: - value = self.encodeArray(v, true) - case *PhpObject: - value = self.encodeObject(v) - case *PhpObjectSerialized: - value = self.encodeSerialized(v) - case *PhpSplArray: - value = self.encodeSplArray(v) - } - - return value.String(), self.lastErr -} - -func (self *Serializer) encodeNull() (buffer bytes.Buffer) { - buffer.WriteRune(TOKEN_NULL) - buffer.WriteRune(SEPARATOR_VALUES) - return -} - -func (self *Serializer) encodeBool(v PhpValue) (buffer bytes.Buffer) { - buffer.WriteRune(TOKEN_BOOL) - buffer.WriteRune(SEPARATOR_VALUE_TYPE) - - if bVal, ok := v.(bool); ok && bVal { - buffer.WriteString("1") - } else { - buffer.WriteString("0") - } - - buffer.WriteRune(SEPARATOR_VALUES) - return -} - -func (self *Serializer) encodeNumber(v PhpValue) (buffer bytes.Buffer) { - var val string - - isFloat := false - - switch intVal := v.(type) { - default: - val = "0" - case int: - val = strconv.FormatInt(int64(intVal), 10) - case int8: - val = strconv.FormatInt(int64(intVal), 10) - case int16: - val = strconv.FormatInt(int64(intVal), 10) - case int32: - val = strconv.FormatInt(int64(intVal), 10) - case int64: - val = strconv.FormatInt(int64(intVal), 10) - case uint: - val = strconv.FormatUint(uint64(intVal), 10) - case uint8: - val = strconv.FormatUint(uint64(intVal), 10) - case uint16: - val = strconv.FormatUint(uint64(intVal), 10) - case uint32: - val = strconv.FormatUint(uint64(intVal), 10) - case uint64: - val = strconv.FormatUint(uint64(intVal), 10) - // PHP has precision = 17 by default - case float32: - val = strconv.FormatFloat(float64(intVal), FORMATTER_FLOAT, FORMATTER_PRECISION, 32) - isFloat = true - case float64: - val = strconv.FormatFloat(float64(intVal), FORMATTER_FLOAT, FORMATTER_PRECISION, 64) - isFloat = true - } - - if isFloat { - buffer.WriteRune(TOKEN_FLOAT) - } else { - buffer.WriteRune(TOKEN_INT) - } - - buffer.WriteRune(SEPARATOR_VALUE_TYPE) - buffer.WriteString(val) - buffer.WriteRune(SEPARATOR_VALUES) - - return -} - -func (self *Serializer) encodeString(v PhpValue, left, right rune, isFinal bool) (buffer bytes.Buffer) { - val, _ := v.(string) - - if isFinal { - buffer.WriteRune(TOKEN_STRING) - } - - buffer.WriteString(self.prepareLen(len(val))) - buffer.WriteRune(left) - buffer.WriteString(val) - buffer.WriteRune(right) - - if isFinal { - buffer.WriteRune(SEPARATOR_VALUES) - } - - return -} - -func (self *Serializer) encodeArray(v PhpValue, isFinal bool) (buffer bytes.Buffer) { - var ( - arrLen int - s string - ) - - if isFinal { - buffer.WriteRune(TOKEN_ARRAY) - } - - switch arrVal := v.(type) { - case PhpArray: - arrLen = len(arrVal) - buffer.WriteString(self.prepareLen(arrLen)) - buffer.WriteRune(DELIMITER_OBJECT_LEFT) - - for k, v := range arrVal { - s, _ = self.Encode(k) - buffer.WriteString(s) - s, _ = self.Encode(v) - buffer.WriteString(s) - } - - case map[PhpValue]PhpValue: - arrLen = len(arrVal) - - buffer.WriteString(self.prepareLen(arrLen)) - buffer.WriteRune(DELIMITER_OBJECT_LEFT) - - for k, v := range arrVal { - s, _ = self.Encode(k) - buffer.WriteString(s) - s, _ = self.Encode(v) - buffer.WriteString(s) - } - case PhpSlice: - arrLen = len(arrVal) - - buffer.WriteString(self.prepareLen(arrLen)) - buffer.WriteRune(DELIMITER_OBJECT_LEFT) - - for k, v := range arrVal { - s, _ = self.Encode(k) - buffer.WriteString(s) - s, _ = self.Encode(v) - buffer.WriteString(s) - } - } - - buffer.WriteRune(DELIMITER_OBJECT_RIGHT) - - return -} - -func (self *Serializer) encodeObject(v PhpValue) (buffer bytes.Buffer) { - obj, _ := v.(*PhpObject) - buffer.WriteRune(TOKEN_OBJECT) - buffer.WriteString(self.prepareClassName(obj.className)) - encoded := self.encodeArray(obj.members, false) - buffer.WriteString(encoded.String()) - return -} - -func (self *Serializer) encodeSerialized(v PhpValue) (buffer bytes.Buffer) { - var serialized string - - obj, _ := v.(*PhpObjectSerialized) - buffer.WriteRune(TOKEN_OBJECT_SERIALIZED) - buffer.WriteString(self.prepareClassName(obj.className)) - - if self.encodeFunc == nil { - serialized = obj.GetData() - } else { - var err error - if serialized, err = self.encodeFunc(obj.GetValue()); err != nil { - self.saveError(err) - } - } - - encoded := self.encodeString(serialized, DELIMITER_OBJECT_LEFT, DELIMITER_OBJECT_RIGHT, false) - buffer.WriteString(encoded.String()) - return -} - -func (self *Serializer) encodeSplArray(v PhpValue) bytes.Buffer { - var buffer bytes.Buffer - obj, _ := v.(*PhpSplArray) - - buffer.WriteRune(TOKEN_SPL_ARRAY) - buffer.WriteRune(SEPARATOR_VALUE_TYPE) - - encoded := self.encodeNumber(obj.flags) - buffer.WriteString(encoded.String()) - - data, _ := self.Encode(obj.array) - buffer.WriteString(data) - - buffer.WriteRune(SEPARATOR_VALUES) - buffer.WriteRune(TOKEN_SPL_ARRAY_MEMBERS) - buffer.WriteRune(SEPARATOR_VALUE_TYPE) - - data, _ = self.Encode(obj.properties) - buffer.WriteString(data) - - return buffer -} - -func (self *Serializer) prepareLen(l int) string { - return string(SEPARATOR_VALUE_TYPE) + strconv.Itoa(l) + string(SEPARATOR_VALUE_TYPE) -} - -func (self *Serializer) prepareClassName(name string) string { - encoded := self.encodeString(name, DELIMITER_STRING_LEFT, DELIMITER_STRING_RIGHT, false) - return encoded.String() -} - -func (self *Serializer) saveError(err error) { - if self.lastErr == nil { - self.lastErr = err - } -} diff --git a/php_session_decoder/php_serialize/unserialize.go b/php_session_decoder/php_serialize/unserialize.go deleted file mode 100644 index 9ef3340..0000000 --- a/php_session_decoder/php_serialize/unserialize.go +++ /dev/null @@ -1,315 +0,0 @@ -package php_serialize - -import ( - "bytes" - "fmt" - "log" - "strconv" - "strings" -) - -const UNSERIALIZABLE_OBJECT_MAX_LEN = 10 * 1024 * 1024 * 1024 - -func UnSerialize(s string) (PhpValue, error) { - decoder := NewUnSerializer(s) - decoder.SetSerializedDecodeFunc(SerializedDecodeFunc(UnSerialize)) - return decoder.Decode() -} - -type UnSerializer struct { - source string - r *strings.Reader - lastErr error - decodeFunc SerializedDecodeFunc -} - -func NewUnSerializer(data string) *UnSerializer { - return &UnSerializer{ - source: data, - } -} - -func (self *UnSerializer) SetReader(r *strings.Reader) { - self.r = r -} - -func (self *UnSerializer) SetSerializedDecodeFunc(f SerializedDecodeFunc) { - self.decodeFunc = f -} - -func (self *UnSerializer) Decode() (PhpValue, error) { - if self.r == nil { - self.r = strings.NewReader(self.source) - } - - var value PhpValue - - if token, _, err := self.r.ReadRune(); err == nil { - switch token { - default: - self.saveError(fmt.Errorf("php_serialize: Unknown token %#U", token)) - case TOKEN_NULL: - value = self.decodeNull() - case TOKEN_BOOL: - value = self.decodeBool() - case TOKEN_INT: - value = self.decodeNumber(false) - case TOKEN_FLOAT: - value = self.decodeNumber(true) - case TOKEN_STRING: - value = self.decodeString(DELIMITER_STRING_LEFT, DELIMITER_STRING_RIGHT, true) - case TOKEN_ARRAY: - value = self.decodeArray() - case TOKEN_OBJECT: - value = self.decodeObject() - case TOKEN_OBJECT_SERIALIZED: - value = self.decodeSerialized() - case TOKEN_REFERENCE, TOKEN_REFERENCE_OBJECT: - value = self.decodeReference() - case TOKEN_SPL_ARRAY: - value = self.decodeSplArray() - - } - } - - return value, self.lastErr -} - -func (self *UnSerializer) decodeNull() PhpValue { - self.expect(SEPARATOR_VALUES) - return nil -} - -func (self *UnSerializer) decodeBool() PhpValue { - var ( - raw rune - err error - ) - self.expect(SEPARATOR_VALUE_TYPE) - - if raw, _, err = self.r.ReadRune(); err != nil { - self.saveError(fmt.Errorf("php_serialize: Error while reading bool value: %v", err)) - } - - self.expect(SEPARATOR_VALUES) - return raw == '1' -} - -func (self *UnSerializer) decodeNumber(isFloat bool) PhpValue { - var ( - raw string - err error - val PhpValue - ) - self.expect(SEPARATOR_VALUE_TYPE) - - if raw, err = self.readUntil(SEPARATOR_VALUES); err != nil { - self.saveError(fmt.Errorf("php_serialize: Error while reading number value: %v", err)) - } else { - if isFloat { - if val, err = strconv.ParseFloat(raw, 64); err != nil { - self.saveError(fmt.Errorf("php_serialize: Unable to convert %s to float: %v", raw, err)) - } - } else { - if val, err = strconv.Atoi(raw); err != nil { - self.saveError(fmt.Errorf("php_serialize: Unable to convert %s to int: %v", raw, err)) - } - } - } - - return val -} - -func (self *UnSerializer) decodeString(left, right rune, isFinal bool) PhpValue { - var ( - err error - val PhpValue - strLen int - readLen int - ) - - strLen = self.readLen() - self.expect(left) - - if strLen > 0 { - buf := make([]byte, strLen) - if readLen, err = self.r.Read(buf); err != nil { - self.saveError(fmt.Errorf("php_serialize: Error while reading string value: %v", err)) - } else { - if readLen != strLen { - self.saveError(fmt.Errorf("php_serialize: Unable to read string. Expected %d but have got %d bytes", strLen, readLen)) - } else { - val = string(buf) - } - } - } - - self.expect(right) - if isFinal { - self.expect(SEPARATOR_VALUES) - } - return val -} - -func (self *UnSerializer) decodeArray() PhpValue { - var arrLen int - val := make(PhpArray) - - arrLen = self.readLen() - self.expect(DELIMITER_OBJECT_LEFT) - - for i := 0; i < arrLen; i++ { - k, errKey := self.Decode() - v, errVal := self.Decode() - - if errKey == nil && errVal == nil { - val[k] = v - /*switch t := k.(type) { - default: - self.saveError(fmt.Errorf("php_serialize: Unexpected key type %T", t)) - case string: - stringKey, _ := k.(string) - val[stringKey] = v - case int: - intKey, _ := k.(int) - val[strconv.Itoa(intKey)] = v - }*/ - } else { - self.saveError(fmt.Errorf("php_serialize: Error while reading key or(and) value of array")) - } - } - - self.expect(DELIMITER_OBJECT_RIGHT) - return val -} - -func (self *UnSerializer) decodeObject() PhpValue { - val := &PhpObject{ - className: self.readClassName(), - } - - rawMembers := self.decodeArray() - val.members, _ = rawMembers.(PhpArray) - - return val -} - -func (self *UnSerializer) decodeSerialized() PhpValue { - val := &PhpObjectSerialized{ - className: self.readClassName(), - } - - rawData := self.decodeString(DELIMITER_OBJECT_LEFT, DELIMITER_OBJECT_RIGHT, false) - val.data, _ = rawData.(string) - - if self.decodeFunc != nil && val.data != "" { - var err error - if val.value, err = self.decodeFunc(val.data); err != nil { - self.saveError(err) - } - } - - return val -} - -func (self *UnSerializer) decodeReference() PhpValue { - self.expect(SEPARATOR_VALUE_TYPE) - if _, err := self.readUntil(SEPARATOR_VALUES); err != nil { - self.saveError(fmt.Errorf("php_serialize: Error while reading reference value: %v", err)) - } - return nil -} - -func (self *UnSerializer) expect(expected rune) { - if token, _, err := self.r.ReadRune(); err != nil { - self.saveError(fmt.Errorf("php_serialize: Error while reading expected rune %#U: %v", expected, err)) - } else if token != expected { - if debugMode { - log.Printf("php_serialize: source\n%s\n", self.source) - log.Printf("php_serialize: reader info\n%#v\n", self.r) - } - self.saveError(fmt.Errorf("php_serialize: Expected %#U but have got %#U", expected, token)) - } -} - -func (self *UnSerializer) readUntil(stop rune) (string, error) { - var ( - token rune - err error - ) - buf := bytes.NewBuffer([]byte{}) - - for { - if token, _, err = self.r.ReadRune(); err != nil || token == stop { - break - } else { - buf.WriteRune(token) - } - } - - return buf.String(), err -} - -func (self *UnSerializer) readLen() int { - var ( - raw string - err error - val int - ) - self.expect(SEPARATOR_VALUE_TYPE) - - if raw, err = self.readUntil(SEPARATOR_VALUE_TYPE); err != nil { - self.saveError(fmt.Errorf("php_serialize: Error while reading lenght of value: %v", err)) - } else { - if val, err = strconv.Atoi(raw); err != nil { - self.saveError(fmt.Errorf("php_serialize: Unable to convert %s to int: %v", raw, err)) - } else if val > UNSERIALIZABLE_OBJECT_MAX_LEN { - self.saveError(fmt.Errorf("php_serialize: Unserializable object length looks too big(%d). If you are sure you wanna unserialise it, please increase UNSERIALIZABLE_OBJECT_MAX_LEN const", val)) - val = 0 - } - } - return val -} - -func (self *UnSerializer) readClassName() (res string) { - rawClass := self.decodeString(DELIMITER_STRING_LEFT, DELIMITER_STRING_RIGHT, false) - res, _ = rawClass.(string) - return -} - -func (self *UnSerializer) saveError(err error) { - if self.lastErr == nil { - self.lastErr = err - } -} - -func (self *UnSerializer) decodeSplArray() PhpValue { - var err error - val := &PhpSplArray{} - - self.expect(SEPARATOR_VALUE_TYPE) - self.expect(TOKEN_INT) - - flags := self.decodeNumber(false) - if flags == nil { - self.saveError(fmt.Errorf("php_serialize: Unable to read flags of SplArray")) - return nil - } - val.flags = PhpValueInt(flags) - - if val.array, err = self.Decode(); err != nil { - self.saveError(fmt.Errorf("php_serialize: Can't parse SplArray: %v", err)) - return nil - } - - self.expect(SEPARATOR_VALUES) - self.expect(TOKEN_SPL_ARRAY_MEMBERS) - self.expect(SEPARATOR_VALUE_TYPE) - - if val.properties, err = self.Decode(); err != nil { - self.saveError(fmt.Errorf("php_serialize: Can't parse properties of SplArray: %v", err)) - return nil - } - - return val -} diff --git a/point/point.go b/point/point.go deleted file mode 100644 index f62c176..0000000 --- a/point/point.go +++ /dev/null @@ -1,26 +0,0 @@ -package point - -func PointLevel(point int64) int32 { - if point <= 50 { - return 1 - } - if point > 50 && point <= 200 { - return 2 - } - if point > 200 && point <= 500 { - return 3 - } - if point > 500 && point <= 1000 { - return 4 - } - if point > 1000 && point <= 2500 { - return 5 - } - if point > 2500 && point <= 5000 { - return 6 - } - if point > 5000 && point <= 8000 { - return 7 - } - return 8 -} diff --git a/transurl/transurl.go b/transurl/transurl.go deleted file mode 100644 index 85f00a0..0000000 --- a/transurl/transurl.go +++ /dev/null @@ -1,48 +0,0 @@ -package transurl - -var urlMap = map[string]string{ - "/beijing": "/question-list/alatest/1", - "/shanghai": "/question-list/alatest/2", - "/guangzhou": "/question-list/alatest/54", - "/shenzhen": "/question-list/alatest/55", - "/chengdu": "/question-list/alatest/63", - "/xi'an": "/question-list/alatest/64", - "/hangzhou": "/question-list/alatest/59", - "/qingdao": "/question-list/alatest/65", - "/dalian": "/question-list/alatest/69", - "/suzhou": "/question-list/alatest/67", - "/nanjing": "/question-list/alatest/68", - "/arts-entertainment": "/question-list/alatest/34", - "/business-jobs": "/question-list/alatest/3", - "/culture": "/question-list/alatest/4", - "/falimy-kids": "/question-list/alatest/45", - "/food": "/question-list/alatest/35", - "/general": "/question-list/alatest/36", - "/health-safety": "/question-list/alatest/39", - "/housing": "/question-list/alatest/49", - "/lifestyle": "/question-list/alatest/1058", - "/money-banking": "/question-list/alatest/1059", - "/relationships": "/question-list/alatest/53", - "/shopping": "/question-list/alatest/41", - "/sports": "/question-list/alatest/95", - "/teaching-learning": "/question-list/alatest/43", - "/transport-travel": "/question-list/alatest/47", - "/visa-legalities": "/question-list/alatest/48", - "/web-technology": "/question-list/alatest/44", -} - -func GetLonUrl(src string) string { - if v, ok := urlMap[src]; ok { - return v - } - return src -} - -func GetShortUrl(dst string) string { - for src, dt := range urlMap { - if dt == dst { - return src - } - } - return dst -} diff --git a/xarray/xarray.go b/xarray/xarray.go deleted file mode 100644 index 5e3a58b..0000000 --- a/xarray/xarray.go +++ /dev/null @@ -1,53 +0,0 @@ -package xarray - -import ( - "reflect" - "strings" -) - -func ToSlice(slice interface{}) []interface{} { - s := reflect.ValueOf(slice) - if s.Kind() != reflect.Slice { - panic("InterfaceSlice() given a non-slice type") - } - - ret := make([]interface{}, s.Len()) - - for i := 0; i < s.Len(); i++ { - ret[i] = s.Index(i).Interface() - } - - return ret -} - -func ToCountMap(strArr []string) map[string]int64 { - mps := make(map[string]int64) - for _, v := range strArr { - mps[strings.ToLower(v)]++ - } - return mps -} - -func InArray(need interface{}, list []interface{}) bool { - for _, v := range list { - if need == v { - return true - } - } - return false -} -func UniqArray(list []int64) []int64 { - result := make([]int64, 0) - if len(list) == 0 { - return result - } - mp := make(map[int64]bool) - for _, v := range list { - if mp[v] { - continue - } - result = append(result, v) - mp[v] = true - } - return result -} diff --git a/xhttp/xhttp.go b/xhttp/xhttp.go deleted file mode 100644 index 15d27d0..0000000 --- a/xhttp/xhttp.go +++ /dev/null @@ -1,189 +0,0 @@ -package xhttp - -import ( - "crypto/tls" - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "strings" - "time" -) - -const timeout = time.Second * 120 - -func Request(method string, reqUrl string, postData string, header http.Header) (string, error) { - var res string - transport := &http.Transport{ - TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, - } - client := &http.Client{ - Transport: transport, - Timeout: timeout, - } - var ioreader io.Reader - if postData != "" { - ioreader = strings.NewReader(postData) - } - req, err := http.NewRequest(method, reqUrl, ioreader) - if err != nil { - return res, err - } - if header != nil { - req.Header = header - } - - resp, err := client.Do(req) - if err != nil { - return res, err - } - defer resp.Body.Close() - - if resp.StatusCode == 200 { - byt, err := ioutil.ReadAll(resp.Body) - if err != nil { - return res, err - } - return string(byt), nil - } else { - return res, fmt.Errorf("code:%d message:%s", resp.StatusCode, resp.Status) - } -} -func Get(reqUrl string, timeout time.Duration) (string, error) { - var res string - transport := &http.Transport{ - TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, - } - client := &http.Client{ - Transport: transport, - Timeout: timeout, - } - req, err := http.NewRequest("GET", reqUrl, nil) - if err != nil { - return res, err - } - resp, err := client.Do(req) - if err != nil { - return res, err - } - defer resp.Body.Close() - - if resp.StatusCode == 200 { - byt, err := ioutil.ReadAll(resp.Body) - if err != nil { - return res, err - } - return string(byt), nil - } else { - return res, fmt.Errorf("code:%d message:%s", resp.StatusCode, resp.Status) - } -} -func fetcher(method, u, post string, headers map[string]string, timeout int64) (*[]byte, error) { - transport := &http.Transport{ - TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, - } - client := &http.Client{ - Transport: transport, - Timeout: time.Second * time.Duration(timeout), - } - req, err := http.NewRequest(method, u, strings.NewReader(post)) - if err != nil { - return nil, err - } - for k, v := range headers { - req.Header.Add(k, v) - } - resp, err := client.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, err - } - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("FetchUrl status:%s", resp.Status) - } - return &body, err -} - -func PostForm(u, post string, headers map[string]string) (*[]byte, error) { - if headers == nil { - headers = make(map[string]string) - } - headers["Content-Type"] = "application/x-www-form-urlencoded" - return fetcher("POST", u, post, headers, 60) -} - -func PostJson(u, post string, headers map[string]string) (*[]byte, error) { - if headers == nil { - headers = make(map[string]string) - } - - headers["Content-Type"] = "application/json;charset=UTF-8" - fmt.Printf("%+v\n", post) - fmt.Printf("%+v\n", headers) - return fetcher("POST", u, post, headers, 60) -} - -func GetWithHeader(u string, headers map[string]string) (*[]byte, error) { - if headers == nil { - headers = make(map[string]string) - } - return fetcher("GET", u, "", headers, 60) -} - -type apiRes struct { - Status int64 `json:"status"` -} - -func SenEmail(u string, data map[string]string) error { - fmt.Println(u) - postByte, _ := json.Marshal(data) - fmt.Printf("%s\n", postByte) - values := url.Values{} - for k, v := range data { - values.Add(k, v) - } - fmt.Println(data) - res, err := PostForm(u, values.Encode(), nil) - if err != nil { - return err - } - fmt.Printf("%s\n", *res) - result := apiRes{} - if err := json.Unmarshal(*res, &result); err != nil { - return err - } - if result.Status != 200 { - return errors.New(string(*res)) - } - return nil -} - -type shotResp struct { - Code int64 `json:"code"` - Info string `json:"info"` - Message string `json:"message"` -} - -func ShotUrl(u string) (string, error) { - values := url.Values{} - values.Add("long_url", u) - res, err := PostForm(`https://echinajobs.cn/add`, values.Encode(), nil) - if err != nil { - return "", err - } - result := shotResp{} - if err := json.Unmarshal(*res, &result); err != nil { - return "", err - } - if result.Code != 200 { - return "", errors.New(string(*res)) - } - return result.Info, nil -} diff --git a/xip/xip.go b/xip/xip.go deleted file mode 100644 index c538628..0000000 --- a/xip/xip.go +++ /dev/null @@ -1,13 +0,0 @@ -package xip - -import ( - "context" - "github.com/gin-gonic/gin" -) - -func GetIpFromContext(ctx context.Context) string { - if v, ok := ctx.(*gin.Context); ok { - return v.ClientIP() - } - return "" -} diff --git a/xjson/xjson.go b/xjson/xjson.go deleted file mode 100644 index 962a2c9..0000000 --- a/xjson/xjson.go +++ /dev/null @@ -1,11 +0,0 @@ -package xjson - -import "encoding/json" - -func MustMarshal(data any) string { - b, err := json.Marshal(data) - if err != nil { - return "" - } - return string(b) -} diff --git a/xmath/math.go b/xmath/math.go deleted file mode 100644 index 20eb547..0000000 --- a/xmath/math.go +++ /dev/null @@ -1,77 +0,0 @@ -package xmath - -import ( - "fmt" - //"github.com/shopspring/decimal" - "math" - "math/rand" - "strconv" - "strings" -) - -// 小数点后 n 位 - 四舍五入 -func RoundedFixed(val float64, n int) float64 { - shift := math.Pow(10, float64(n)) - fv := 0.0000000001 + val //对浮点数产生.xxx999999999 计算不准进行处理 - return math.Floor(fv*shift+.5) / shift -} - -// 小数点后 n 位 - 舍去 -func TruncRound(val float64, n int) float64 { - floatStr := fmt.Sprintf("%."+strconv.Itoa(n+1)+"f", val) - temp := strings.Split(floatStr, ".") - var newFloat string - if len(temp) < 2 || n >= len(temp[1]) { - newFloat = floatStr - } else { - newFloat = temp[0] + "." + temp[1][:n] - } - inst, _ := strconv.ParseFloat(newFloat, 64) - return inst -} - -// RandInt64 随机范围取值 -func RandInt64(min, max int64) int64 { - if min >= max || min == 0 || max == 0 { - return max - } - return rand.Int63n(max-min) + min -} -func FloatWithoutRightDot(n float64) string { - s := fmt.Sprintf("%.2f", n) - ss := strings.Split(s, ".") - ss1 := strings.TrimRight(ss[1], "0") - if ss1 == "" { - return ss[0] - } else { - return fmt.Sprintf("%s.%s", ss[0], ss1) - } -} - -func NumberFormat(str string) string { - length := len(str) - if length < 4 { - return str - } - arr := strings.Split(str, ".") //用小数点符号分割字符串,为数组接收 - length1 := len(arr[0]) - if length1 < 4 { - return str - } - count := (length1 - 1) / 3 - for i := 0; i < count; i++ { - arr[0] = arr[0][:length1-(i+1)*3] + "," + arr[0][length1-(i+1)*3:] - } - return strings.Join(arr, ".") //将一系列字符串连接为一个字符串,之间用sep来分隔。 -} - -func ConvertInt64(s string) int64 { - v, _ := strconv.ParseInt(s, 10, 64) - return v -} - -// -//func Round(f float64, n int32) float64 { -// v, _ := decimal.NewFromFloat(f).Round(n).Float64() -// return v -//} diff --git a/xmd5/md5.go b/xmd5/md5.go deleted file mode 100644 index 22026fb..0000000 --- a/xmd5/md5.go +++ /dev/null @@ -1,12 +0,0 @@ -package xmd5 - -import ( - "crypto/md5" - "encoding/hex" -) - -func MD5(str string) string { - s := md5.New() - s.Write([]byte(str)) - return hex.EncodeToString(s.Sum(nil)) -} diff --git a/xpage/xpage.go b/xpage/xpage.go deleted file mode 100644 index 0c3cab2..0000000 --- a/xpage/xpage.go +++ /dev/null @@ -1,8 +0,0 @@ -package xpage - -func GetPageOffset(page int32, size int32) int { - if page < 1 { - page = 1 - } - return int((page - 1) * size) -} diff --git a/xredis/xredis.go b/xredis/xredis.go deleted file mode 100644 index dceb8ca..0000000 --- a/xredis/xredis.go +++ /dev/null @@ -1,59 +0,0 @@ -package xredis - -// -//import ( -// "context" -// "encoding/json" -// "fmt" -// "github.com/go-redis/redis/v8" -// "github.com/pkg/errors" -// "time" -//) -// -//var redisClient *redis.Client -// -//func Init(host, password string, db int) error { -// redisClient = redis.NewClient(&redis.Options{ -// Network: "tcp", -// Addr: host, -// Password: password, -// DB: db, -// }) -// return redisClient.Ping(context.Background()).Err() -//} -// -//func Client() *redis.Client { -// return redisClient -//} -// -//func GetData[T any](ctx context.Context, key string, fn func() (T, error), dur time.Duration) (T, error) { -// var result T -// res := redisClient.Get(ctx, key).Val() -// if res != "" { -// err := json.Unmarshal([]byte(res), &result) -// if err == nil { -// return result, nil -// } -// } -// r, err := fn() -// if err != nil { -// return result, err -// } -// if b, err := json.Marshal(r); err == nil { -// redisClient.Set(ctx, key, string(b), dur) -// } -// return r, nil -//} -//func Lock[T any](ctx context.Context, key string, fn func() (T, error)) (T, error) { -// var res T -// lockKey := fmt.Sprintf("lock:%s", key) -// ok, err := redisClient.SetNX(ctx, lockKey, 1, time.Second*20).Result() -// if err != nil { -// return res, errors.Wrap(err, "") -// } -// if !ok { -// return res, errors.Wrap(errors.New(fmt.Sprintf("lock %s exists", lockKey)), "") -// } -// defer redisClient.Del(ctx, lockKey) -// return fn() -//} diff --git a/xredis/xredis_test.go b/xredis/xredis_test.go deleted file mode 100644 index d93be3c..0000000 --- a/xredis/xredis_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package xredis - -import ( - "context" - "fmt" - "testing" - "time" -) - -type Res struct { - Name string -} - -func TestGetData(t *testing.T) { - _ = Init("localhost:6379", "", 1) - res, err := GetData(context.Background(), "userId1212", func() (*Res, error) { - fmt.Println("from db") - in := &Res{ - Name: "ttt", - } - return in, nil - }, time.Second*50) - - if err != nil { - t.Error(err) - } - fmt.Printf("%+v\n", res) -} diff --git a/xstring/stringx.go b/xstring/stringx.go deleted file mode 100644 index 172bc28..0000000 --- a/xstring/stringx.go +++ /dev/null @@ -1,641 +0,0 @@ -package xstring - -import ( - "bytes" - "encoding/base64" - "encoding/json" - "fmt" - "github.com/PuerkitoBio/goquery" - "github.com/pkg/errors" - "reflect" - "regexp" - "sort" - "strconv" - "strings" -) - -func TableFieldNames(obj any) ([]string, string) { - v := reflect.TypeOf(obj) - cols := []string{} - primary := "" - for i := 0; i < v.NumField(); i++ { - cols = append(cols, v.Field(i).Tag.Get("db")) - if primary == "" { - primary = v.Field(i).Tag.Get("primaryKey") - } - } - return cols, primary -} - -func Remove[T string](cols []T, key T) []T { - arr := make([]T, 0) - for _, v := range cols { - if key != v { - arr = append(arr, v) - } - } - return arr -} - -func NamedSql(cls []string) string { - str := []string{} - for _, v := range cls { - str = append(str, fmt.Sprintf("%s=:%s", v, v)) - } - return strings.Join(str, ",") -} - -func StripTags(content string) string { - re := regexp.MustCompile(`<(.|\n)*?>`) - return re.ReplaceAllString(content, "") -} -func SubString(str string, begin, length int) string { - rs := []rune(str) - lth := len(rs) - if begin < 0 { - begin = 0 - } - if begin >= lth { - begin = lth - } - end := begin + length - - if end > lth { - end = lth - } - return string(rs[begin:end]) -} -func Nl2br(str string) string { - return strings.Join(strings.Split(strings.Join(strings.Split(str, "\r"), "
"), "\n"), "
") -} - -func Serialize(value interface{}) ([]byte, error) { - - if value == nil { - return MarshalNil(), nil - } - - t := reflect.TypeOf(value) - switch t.Kind() { - case reflect.Bool: - return MarshalBool(value.(bool)), nil - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64, - reflect.Float32, reflect.Float64: - return MarshalNumber(value), nil - case reflect.String: - return MarshalString(value.(string)), nil - case reflect.Map: - return MarshalMap(value) - case reflect.Slice: - return MarshalSlice(value) - default: - return nil, fmt.Errorf("Marshal: Unknown type %T with value %#v", t, value) - } -} - -func MarshalNil() []byte { - return []byte("N;") -} - -func MarshalBool(value bool) []byte { - if value { - return []byte("b:1;") - } - - return []byte("b:0;") -} - -func MarshalNumber(value interface{}) []byte { - var val string - - isFloat := false - - switch value.(type) { - default: - val = "0" - case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: - val, _ = NumericalToString(value) - case float32, float64: - val, _ = NumericalToString(value) - isFloat = true - } - - if isFloat { - return []byte("d:" + val + ";") - - } else { - return []byte("i:" + val + ";") - } -} -func NumericalValue(value reflect.Value) (float64, bool) { - switch value.Type().Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return float64(value.Int()), true - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return float64(value.Uint()), true - - case reflect.Float32, reflect.Float64: - return value.Float(), true - - default: - return 0, false - } -} -func MarshalString(value string) []byte { - return []byte(fmt.Sprintf("s:%d:\"%s\";", len(value), value)) -} -func LessValue(a, b reflect.Value) bool { - aValue, aNumerical := NumericalValue(a) - bValue, bNumerical := NumericalValue(b) - - if aNumerical && bNumerical { - return aValue < bValue - } - - if !aNumerical && !bNumerical { - // In theory this should mean they are both strings. In reality - // they could be any other type and the String() representation - // will be something like "" if it is not a string. Since - // distinct values of non-strings still return the same value - // here that's what makes the ordering undefined. - return strings.Compare(a.String(), b.String()) < 0 - } - - // Numerical values are always treated as less than other types - // (including strings that might represent numbers themselves). The - // inverse is also true. - return aNumerical && !bNumerical -} - -func MarshalMap(value interface{}) ([]byte, error) { - - s := reflect.ValueOf(value) - - mapKeys := s.MapKeys() - sort.Slice(mapKeys, func(i, j int) bool { - return LessValue(mapKeys[i], mapKeys[j]) - }) - - var buffer bytes.Buffer - for _, mapKey := range mapKeys { - m, err := Serialize(mapKey.Interface()) - if err != nil { - return nil, err - } - - buffer.Write(m) - - m, err = Serialize(s.MapIndex(mapKey).Interface()) - if err != nil { - return nil, err - } - - buffer.Write(m) - } - - return []byte(fmt.Sprintf("a:%d:{%s}", s.Len(), buffer.String())), nil -} - -func MarshalSlice(value interface{}) ([]byte, error) { - s := reflect.ValueOf(value) - - var buffer bytes.Buffer - for i := 0; i < s.Len(); i++ { - m, err := Serialize(i) - if err != nil { - return nil, err - } - - buffer.Write(m) - - m, err = Serialize(s.Index(i).Interface()) - if err != nil { - return nil, err - } - - buffer.Write(m) - } - - return []byte(fmt.Sprintf("a:%d:{%s}", s.Len(), buffer.String())), nil -} - -const UNSERIALIZABLE_OBJECT_MAX_LEN = int64(10 * 1024 * 1024 * 1024) - -func UnSerialize(data []byte) (interface{}, error) { - reader := bytes.NewReader(data) - return unMarshalByReader(reader) -} - -func UnSerializeBind(data []byte, post any) error { - reader := bytes.NewReader(data) - b, err := unMarshalByReader(reader) - if err != nil { - return errors.Wrap(err, "") - } - bb, err := json.Marshal(b) - if err != nil { - return errors.Wrap(err, "") - } - err = json.Unmarshal(bb, post) - return errors.Wrap(err, "") -} - -func unMarshalByReader(reader *bytes.Reader) (interface{}, error) { - - for { - - if token, _, err := reader.ReadRune(); err == nil { - switch token { - default: - return nil, fmt.Errorf("UnMarshal: Unknown token %#U", token) - case 'N': - return unMarshalNil(reader) - case 'b': - return unMarshalBool(reader) - case 'i': - return unMarshalNumber(reader, false) - case 'd': - return unMarshalNumber(reader, true) - case 's': - return unMarshalString(reader, true) - case 'a': - return unMarshalArray(reader) - // case 'O': - - // case 'C': - - // case 'R', 'r': - - // case 'x': - - } - } - } - -} - -func unMarshalNil(reader *bytes.Reader) (interface{}, error) { - _ = expect(reader, ';') - - return nil, nil -} - -func unMarshalBool(reader *bytes.Reader) (interface{}, error) { - var ( - raw rune - err error - ) - err = expect(reader, ':') - if err != nil { - return nil, err - } - - if raw, _, err = reader.ReadRune(); err != nil { - return nil, fmt.Errorf("UnMarshal: Error while reading bool value: %v", err) - } - - err = expect(reader, ';') - if err != nil { - return nil, err - } - return raw == '1', nil -} - -func unMarshalNumber(reader *bytes.Reader, isFloat bool) (interface{}, error) { - var ( - raw string - err error - val interface{} - ) - err = expect(reader, ':') - if err != nil { - return nil, err - } - - if raw, err = readUntil(reader, ';'); err != nil { - return nil, fmt.Errorf("UnMarshal: Error while reading number value: %v", err) - } else { - if isFloat { - if val, err = strconv.ParseFloat(raw, 64); err != nil { - return nil, fmt.Errorf("UnMarshal: Unable to convert %s to float: %v", raw, err) - } - } else { - if val, err = strconv.Atoi(raw); err != nil { - return nil, fmt.Errorf("UnMarshal: Unable to convert %s to int: %v", raw, err) - } - } - } - - return val, nil -} - -func unMarshalString(reader *bytes.Reader, isFinal bool) (interface{}, error) { - var ( - err error - val interface{} - strLen int - readLen int - ) - - strLen, err = readLength(reader) - if err != nil { - return nil, err - } - err = expect(reader, '"') - if err != nil { - return nil, err - } - - if strLen > 0 { - buf := make([]byte, strLen) - if readLen, err = reader.Read(buf); err != nil { - return nil, fmt.Errorf("UnMarshal: Error while reading string value: %v", err) - } else { - if readLen != strLen { - return nil, fmt.Errorf("UnMarshal: Unable to read string. Expected %d but have got %d bytes", strLen, readLen) - } else { - val = string(buf) - } - } - } - - err = expect(reader, '"') - if err != nil { - return nil, err - } - if isFinal { - err = expect(reader, ';') - if err != nil { - return nil, err - } - } - return val, nil -} - -func unMarshalArray(reader *bytes.Reader) (interface{}, error) { - var arrLen int - var err error - val := make(map[string]interface{}) - - arrLen, err = readLength(reader) - - if err != nil { - return nil, err - } - err = expect(reader, '{') - if err != nil { - return nil, err - } - indexLen := 0 - for i := 0; i < arrLen; i++ { - k, err := unMarshalByReader(reader) - if err != nil { - return nil, err - } - v, err := unMarshalByReader(reader) - if err != nil { - return nil, err - } - - // if errKey == nil && errVal == nil { - // val[k] = v - switch t := k.(type) { - default: - return nil, fmt.Errorf("UnMarshal: Unexpected key type %T", t) - case string: - stringKey, _ := k.(string) - val[stringKey] = v - case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64: - // intKey, _ := k.(int) - // val[strconv.Itoa(intKey)] = v - stringKey, _ := NumericalToString(k) - val[stringKey] = v - - // stringI, _ := utils.NumericalToString(i) - if i == k { - indexLen++ - } - - } - // } else { - // return nil, fmt.Errorf("UnMarshal: Error while reading key or(and) value of array") - // } - } - - err = expect(reader, '}') - if err != nil { - return nil, err - } - - if indexLen == arrLen { - var slice []interface{} - for _, row := range val { - slice = append(slice, row) - } - return slice, nil - } - - return val, nil -} - -func expect(reader *bytes.Reader, expected rune) error { - if token, _, err := reader.ReadRune(); err != nil { - return fmt.Errorf("UnMarshal: Error while reading expected rune %#U: %v", expected, err) - } else if token != expected { - return fmt.Errorf("UnMarshal: Expected %#U but have got %#U", expected, token) - } - return nil -} - -func readUntil(reader *bytes.Reader, stop rune) (string, error) { - var ( - token rune - err error - ) - buf := bytes.NewBuffer([]byte{}) - - for { - if token, _, err = reader.ReadRune(); err != nil || token == stop { - break - } else { - buf.WriteRune(token) - } - } - - return buf.String(), err -} - -func readLength(reader *bytes.Reader) (int, error) { - var ( - raw string - err error - val int - ) - err = expect(reader, ':') - if err != nil { - return 0, err - } - - if raw, err = readUntil(reader, ':'); err != nil { - return 0, fmt.Errorf("UnMarshal: Error while reading lenght of value: %v", err) - } else { - if val, err = strconv.Atoi(raw); err != nil { - return 0, fmt.Errorf("UnMarshal: Unable to convert %s to int: %v", raw, err) - } else if int64(val) > UNSERIALIZABLE_OBJECT_MAX_LEN { - return 0, fmt.Errorf("UnMarshal: Unserializable object length looks too big(%d). If you are sure you wanna unserialise it, please increase UNSERIALIZABLE_OBJECT_MAX_LEN const", val) - } - } - return val, nil -} - -func NumericalToString(value interface{}) (string, bool) { - var val string - - switch intVal := value.(type) { - default: - return "0", false - case int: - val = strconv.FormatInt(int64(intVal), 10) - case int8: - val = strconv.FormatInt(int64(intVal), 10) - case int16: - val = strconv.FormatInt(int64(intVal), 10) - case int32: - val = strconv.FormatInt(int64(intVal), 10) - case int64: - val = strconv.FormatInt(int64(intVal), 10) - case uint: - val = strconv.FormatUint(uint64(intVal), 10) - case uint8: - val = strconv.FormatUint(uint64(intVal), 10) - case uint16: - val = strconv.FormatUint(uint64(intVal), 10) - case uint32: - val = strconv.FormatUint(uint64(intVal), 10) - case uint64: - val = strconv.FormatUint(intVal, 10) - case float32: - val = strconv.FormatFloat(float64(intVal), 'f', -1, 32) - case float64: - val = strconv.FormatFloat(intVal, 'f', -1, 64) - } - return val, true -} - -//func StrToArr(str string) []string { -// re := regexp.MustCompile(`<(.|\n)*?>`) -// str = re.ReplaceAllString(str, " ") -// str = strings.ReplaceAll(str, `"`, "") -// str = strings.ReplaceAll(str, `'`, "") -// str = strings.ReplaceAll(str, "`", "") -// str = strings.ReplaceAll(str, ",", "") -// str = strings.ReplaceAll(str, " ", "") -// newStr := []string{} -// tmp := "" -// for i := 0; i < len(str); { -// r, n := utf8.DecodeRuneInString(str[i:]) -// if n == 3 { -// tmp = "" -// newStr = append(newStr, string(r)) -// } else { -// -// if string(r) == " " { -// newStr = append(newStr, tmp) -// tmp = "" -// } else if string(r) != "\n" { -// tmp = fmt.Sprintf("%s%c", tmp, r) -// } -// } -// i += n -// } -// if tmp != "" { -// newStr = append(newStr, tmp) -// tmp = "" -// } -// newStr1 := make([]string, 0) -// for _, v := range newStr { -// if strings.TrimSpace(v) == "" { -// continue -// } -// newStr1 = append(newStr1, strings.TrimSpace(v)) -// } -// return newStr1 -//} - -//func StrToUrl(str string) string { -// strs := []string{} -// for _, v := range StrToArr(str) { -// fmt.Println(v) -// } -// -// return strings.Join(strs, "-") -//} - -func Base64Encode(s string) string { - return base64.StdEncoding.EncodeToString([]byte(s)) -} - -func Base64Decode(s string) (string, error) { - b, err := base64.StdEncoding.DecodeString(s) - if err != nil { - return "", errors.Wrap(err, "") - } - return string(b), nil -} - -func HtmlToText(body string) ([]string, error) { - body = strings.ReplaceAll(body, " ", " ") - ss := "<(.|\\n)*?>" - body = regexp.MustCompile(ss).ReplaceAllString(body, " ") - doc, err := goquery.NewDocumentFromReader(strings.NewReader(body)) - if err != nil { - return nil, errors.Wrap(err, "") - } - defer doc.Clone() - v := doc.Text() - var hzRegexp = regexp.MustCompile("^[a-zA-Z0-9\u4e00-\u9fa5]$") - var zwReg = regexp.MustCompile("^[\u4e00-\u9fa5]$") - strn := "" - ars := []string{} - for _, c := range v { - filter := false - if hzRegexp.MatchString(string(c)) { - if zwReg.MatchString(string(c)) { - strn += string(c) - filter = true - } else { - strn += string(c) - } - } else { - filter = true - } - fmt.Println(strn) - if filter && strn != "" { - ars = append(ars, strn) - strn = "" - } - } - if strn != "" { - ars = append(ars, strn) - } - return ars, nil -} -func ContentText(body string) string { - doc, err := goquery.NewDocumentFromReader(strings.NewReader(body)) - if err != nil { - return err.Error() - } - defer doc.Clone() - return doc.Text() -} -func GetPicture(pic string) string { - if pic == "" { - return "/sites/default/files/imagecache/ic50x50/avatar_selection/o2QQW.jpg.png" - } - if !strings.HasPrefix(pic, "/") { - return "/" + pic - } - return pic -} diff --git a/xtime/xtime.go b/xtime/xtime.go deleted file mode 100644 index 071aec0..0000000 --- a/xtime/xtime.go +++ /dev/null @@ -1,69 +0,0 @@ -package xtime - -import ( - "fmt" - "strings" - "time" -) - -const DefaultTimeLayout = "2006-01-02 15:04:05" - -func LeaTime(t int64) string { - leaSeconds := time.Now().Unix() - t - mps := []struct { - Seconds int64 - Title string - }{ - {31536000, "years"}, - {604800, "weeks"}, - {86400, "days"}, - {3600, "hours"}, - {60, "min"}, - {1, "sec"}, - } - res := []string{} - for _, v := range mps { - if leaSeconds > v.Seconds { - if len(res) == 2 { - break - } - n := leaSeconds / v.Seconds - tt := v.Title - if n == 1 { - tt = strings.TrimRight(v.Title, "s") - } - res = append(res, fmt.Sprintf("%d %s", n, tt)) - leaSeconds -= v.Seconds * n - } - } - return strings.Join(res, " ") -} - -func UnixToTime(unix int64) time.Time { - return time.Unix(unix, 0) -} -func ParseTime(day string, layout string) int64 { - if day == "" { - return 0 - } - t, err := time.ParseInLocation(layout, day, time.Local) - if err != nil { - fmt.Println(err) - return 0 - } - return t.Unix() -} - -const DefaultLayout = "2006-01-02 15:04:05" - -func TimeTodayMinAndMax(ctime time.Time) (min, max time.Time) { - start, _ := time.ParseInLocation(DefaultLayout, ctime.Format("2006-01-02")+" 00:00:00", time.Local) - end, _ := time.ParseInLocation(DefaultLayout, ctime.Format("2006-01-02")+" 23:59:59", time.Local) - return start, end -} -func UnixToStr(t int64) string { - if t == 0 { - return "" - } - return UnixToTime(t).Format(DefaultTimeLayout) -} diff --git a/xtime/xtime_test.go b/xtime/xtime_test.go deleted file mode 100644 index 9f4049a..0000000 --- a/xtime/xtime_test.go +++ /dev/null @@ -1,10 +0,0 @@ -package xtime - -import ( - "fmt" - "testing" -) - -func TestLeaTime(t *testing.T) { - fmt.Println(LeaTime(1651812894)) -} diff --git a/xuser/xuser.go b/xuser/xuser.go deleted file mode 100644 index adbcf0d..0000000 --- a/xuser/xuser.go +++ /dev/null @@ -1,18 +0,0 @@ -package xuser - -import ( - "context" - "github.com/gin-gonic/gin" -) - -func GetUserFromContext(ctx context.Context) string { - v := ctx.Value("username") - if v == nil { - return "" - } - return v.(string) -} -func SetContextUser(ctx *gin.Context, username string) { - ctx.Set("username", username) - //return context.WithValue(ctx, requestUserIdKey{}, username) -}