client.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*
  2. GNU GENERAL PUBLIC LICENSE
  3. Version 3, 29 June 2007
  4. Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
  5. Everyone is permitted to copy and distribute verbatim copies
  6. of this license document, but changing it is not allowed.
  7. http-wokou, An HTTP Proxying framework for bypassing DNS Security
  8. Copyright (C) 2024 Russell Hrubesky, ChiralWorks Software LLC
  9. This program is free software: you can redistribute it and/or modify
  10. it under the terms of the GNU General Public License as published by
  11. the Free Software Foundation, either version 3 of the License, or
  12. (at your option) any later version.
  13. This program is distributed in the hope that it will be useful,
  14. but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. GNU General Public License for more details.
  17. You should have received a copy of the GNU General Public License
  18. along with this program. If not, see <https://www.gnu.org/licenses/>.
  19. */
  20. package httpserver
  21. import (
  22. "fmt"
  23. "io"
  24. "log"
  25. "net/http"
  26. "strings"
  27. "sync"
  28. )
  29. type ResponseCarrier struct {
  30. Data []byte
  31. Headers http.Header
  32. StatusCode int
  33. Error error
  34. }
  35. /*
  36. Generic site call to an upstream server
  37. */
  38. func (c *Controller) RequestGeneric(method string, host string, path string, hdrs *http.Header, body io.Reader) ResponseCarrier {
  39. reqUrl := fmt.Sprintf("http://%s%s", host, path)
  40. req, err := http.NewRequest(method, reqUrl, body)
  41. if err != nil {
  42. return ResponseCarrier{Data: nil, Headers: nil, StatusCode: 500, Error: err}
  43. }
  44. resp, err := c.Client.Do(req)
  45. if err != nil {
  46. return ResponseCarrier{Data: nil, Headers: nil, StatusCode: 500, Error: err}
  47. }
  48. defer resp.Body.Close()
  49. b, err := io.ReadAll(resp.Body)
  50. if err != nil {
  51. return ResponseCarrier{Data: nil, Headers: resp.Header, StatusCode: resp.StatusCode, Error: err}
  52. }
  53. if c.Config.Caching {
  54. if !strings.Contains(path, "?") {
  55. if resp.StatusCode == 200 {
  56. if method == "GET" {
  57. c.CacheResource(path, NewCachedResource(b, &resp.Header, resp.StatusCode))
  58. }
  59. }
  60. }
  61. }
  62. return ResponseCarrier{Data: b, Headers: resp.Header, StatusCode: resp.StatusCode, Error: nil}
  63. }
  64. func (c *Controller) TryHosts(method string, path string, hdrs *http.Header, body io.Reader, hosts []string) {
  65. var wg sync.WaitGroup
  66. for idx := range hosts {
  67. wg.Add(1)
  68. go func(method string, host string, path string, hdrs *http.Header, body io.Reader) {
  69. defer wg.Done()
  70. resp := c.RequestGeneric(method, host, path, hdrs, body)
  71. if resp.Error != nil {
  72. log.Fatal("Fatal Error creating request in a RequestGeneric method: ", resp.Error)
  73. }
  74. if resp.StatusCode == 200 {
  75. basePath := strings.Split(path, "?")[0]
  76. c.RouteMaps.MapUriToDomain(basePath, host)
  77. }
  78. }(method, hosts[idx], path, hdrs, body)
  79. }
  80. wg.Wait()
  81. }
  82. /*
  83. Sets the request headers to whatever is defined in this private method
  84. :param req: a pointer to an HTTP request
  85. */
  86. func (c *Controller) setHeaders(req *http.Request, hdrs *http.Header) {
  87. //req.AddCookie(c.Config.PhpSession)
  88. //req.Header.Set("User-Agent", c.Config.UserAgent)
  89. //req.Header.Set("Referer", c.Config.FullDomain)
  90. //req.Header.Set("Origin", c.Config.FullDomain)
  91. for k, v := range *hdrs {
  92. _, ok := NonmutableHeaders[k]
  93. if !ok {
  94. req.Header.Add(k, v[0])
  95. }
  96. }
  97. }