baderror.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package baderror
  2. import (
  3. "context"
  4. "io"
  5. "net"
  6. "strings"
  7. E "github.com/sagernet/sing/common/exceptions"
  8. )
  9. func Contains(err error, msgList ...string) bool {
  10. for _, msg := range msgList {
  11. if strings.Contains(err.Error(), msg) {
  12. return true
  13. }
  14. }
  15. return false
  16. }
  17. func WrapH2(err error) error {
  18. if err == nil {
  19. return nil
  20. }
  21. err = E.Unwrap(err)
  22. if err == io.ErrUnexpectedEOF {
  23. return io.EOF
  24. }
  25. if Contains(err, "client disconnected", "body closed by handler", "response body closed", "; CANCEL") {
  26. return net.ErrClosed
  27. }
  28. return err
  29. }
  30. func WrapGRPC(err error) error {
  31. // grpc uses stupid internal error types
  32. if err == nil {
  33. return nil
  34. }
  35. if Contains(err, "EOF") {
  36. return io.EOF
  37. }
  38. if Contains(err, "Canceled") {
  39. return context.Canceled
  40. }
  41. if Contains(err,
  42. "the client connection is closing",
  43. "server closed the stream without sending trailers") {
  44. return net.ErrClosed
  45. }
  46. return err
  47. }
  48. func WrapQUIC(err error) error {
  49. if err == nil {
  50. return nil
  51. }
  52. if Contains(err, "canceled with error code 0") {
  53. return net.ErrClosed
  54. }
  55. return err
  56. }