You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

129 lines
2.3 KiB

  1. // +build gofuzz
  2. package server
  3. import (
  4. "crypto/tls"
  5. "io/ioutil"
  6. "net"
  7. "strings"
  8. )
  9. // FuzzProfile tests the profile server.
  10. func FuzzProfile(fuzz []byte) int {
  11. if len(fuzz) == 0 {
  12. return -1
  13. }
  14. server, err := New(EnableProfiler())
  15. if err != nil {
  16. panic(err.Error())
  17. }
  18. server.Run()
  19. defer server.profileListener.Close()
  20. defer server.httpListener.Close()
  21. address := server.profileListener.Addr
  22. connection, err := net.Dial("tcp", address)
  23. if err != nil {
  24. panic(err.Error())
  25. }
  26. _, err = connection.Write(fuzz)
  27. if err != nil {
  28. return 0
  29. }
  30. response, err := ioutil.ReadAll(connection)
  31. if err != nil {
  32. return 0
  33. }
  34. err = connection.Close()
  35. if err != nil {
  36. return 0
  37. }
  38. fields := strings.Fields(string(response))
  39. if len(fields) < 2 {
  40. panic("invalid HTTP response")
  41. }
  42. code := fields[1]
  43. if code == "500" {
  44. panic("server panicked")
  45. }
  46. return 1
  47. }
  48. // FuzzHTTP tests the HTTP server.
  49. func FuzzHTTP(fuzz []byte) int {
  50. if len(fuzz) == 0 {
  51. return -1
  52. }
  53. server, err := New(Listener("localhost"))
  54. if err != nil {
  55. panic(err.Error())
  56. }
  57. server.Run()
  58. defer server.httpListener.Close()
  59. address := server.httpListener.Addr
  60. connection, err := net.Dial("tcp", address)
  61. if err != nil {
  62. panic(err.Error())
  63. }
  64. _, err = connection.Write(fuzz)
  65. if err != nil {
  66. return 0
  67. }
  68. response, err := ioutil.ReadAll(connection)
  69. if err != nil {
  70. return 0
  71. }
  72. err = connection.Close()
  73. if err != nil {
  74. return 0
  75. }
  76. fields := strings.Fields(string(response))
  77. if len(fields) < 2 {
  78. panic("invalid HTTP response")
  79. }
  80. code := fields[1]
  81. if code == "500" {
  82. panic("server panicked")
  83. }
  84. return 1
  85. }
  86. // FuzzHTTPS tests the HTTPS server.
  87. func FuzzHTTPS(fuzz []byte) int {
  88. if len(fuzz) == 0 {
  89. return -1
  90. }
  91. server, err := New(TLSListener("localhost", true))
  92. if err != nil {
  93. panic(err.Error())
  94. }
  95. server.Run()
  96. defer server.httpsListener.Close()
  97. address := server.httpsListener.Addr
  98. connection, err := tls.Dial("tcp", address, nil)
  99. if err != nil {
  100. panic(err.Error())
  101. }
  102. _, err = connection.Write(fuzz)
  103. if err != nil {
  104. return 0
  105. }
  106. response, err := ioutil.ReadAll(connection)
  107. if err != nil {
  108. return 0
  109. }
  110. err = connection.Close()
  111. if err != nil {
  112. return 0
  113. }
  114. fields := strings.Fields(string(response))
  115. if len(fields) < 2 {
  116. panic("invalid HTTP response")
  117. }
  118. code := fields[1]
  119. if code == "500" {
  120. panic("server panicked")
  121. }
  122. return 1
  123. }