summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorValery Piashchynski <[email protected]>2020-11-15 13:41:19 +0300
committerValery Piashchynski <[email protected]>2020-11-15 13:41:19 +0300
commitd890eee1742dc3a0a1c787f7e65d40b1e81a94db (patch)
treeb84dcf3c594d2f80ce6f71fae4300e5bfa63e1a1 /plugins
parent5260639a7e95d4d4a36b46fd4b19f665a0a60ef9 (diff)
Remove old rr imports
Diffstat (limited to 'plugins')
-rw-r--r--plugins/http/config.go2
-rw-r--r--plugins/http/config_test.go7
-rw-r--r--plugins/http/fcgi_test.go205
-rw-r--r--plugins/http/h2c_test.go160
-rw-r--r--plugins/http/handler.go2
-rw-r--r--plugins/http/handler_test.go3919
-rw-r--r--plugins/http/plugin.go (renamed from plugins/http/service.go)30
-rw-r--r--plugins/http/plugin_test.go (renamed from plugins/http/service_test.go)0
-rw-r--r--plugins/http/request.go6
-rw-r--r--plugins/http/uploads.go6
-rw-r--r--plugins/http/uploads_test.go6
11 files changed, 2166 insertions, 2177 deletions
diff --git a/plugins/http/config.go b/plugins/http/config.go
index 00f61652..e91133ef 100644
--- a/plugins/http/config.go
+++ b/plugins/http/config.go
@@ -3,8 +3,6 @@ package http
import (
"errors"
"fmt"
- "github.com/spiral/roadrunner"
- "github.com/spiral/roadrunner/service"
"net"
"os"
"strings"
diff --git a/plugins/http/config_test.go b/plugins/http/config_test.go
index d95e0995..96fbb954 100644
--- a/plugins/http/config_test.go
+++ b/plugins/http/config_test.go
@@ -1,13 +1,12 @@
package http
import (
- json "github.com/json-iterator/go"
- "github.com/spiral/roadrunner"
- "github.com/spiral/roadrunner/service"
- "github.com/stretchr/testify/assert"
"os"
"testing"
"time"
+
+ json "github.com/json-iterator/go"
+ "github.com/stretchr/testify/assert"
)
type mockCfg struct{ cfg string }
diff --git a/plugins/http/fcgi_test.go b/plugins/http/fcgi_test.go
index e68b2e7f..82b7d1c4 100644
--- a/plugins/http/fcgi_test.go
+++ b/plugins/http/fcgi_test.go
@@ -1,105 +1,104 @@
package http
-import (
- "github.com/sirupsen/logrus"
- "github.com/sirupsen/logrus/hooks/test"
- "github.com/spiral/roadrunner/service"
- "github.com/stretchr/testify/assert"
- "github.com/yookoala/gofast"
- "io/ioutil"
- "net/http/httptest"
- "testing"
- "time"
-)
-
-func Test_FCGI_Service_Echo(t *testing.T) {
- logger, _ := test.NewNullLogger()
- logger.SetLevel(logrus.DebugLevel)
-
- c := service.NewContainer(logger)
- c.Register(ID, &Service{})
-
- assert.NoError(t, c.Init(&testCfg{httpCfg: `{
- "fcgi": {
- "address": "tcp://0.0.0.0:6082"
- },
- "workers":{
- "command": "php ../../tests/http/client.php echo pipes",
- "pool": {"numWorkers": 1}
- }
- }`}))
-
- s, st := c.Get(ID)
- assert.NotNil(t, s)
- assert.Equal(t, service.StatusOK, st)
-
- // should do nothing
- s.(*Service).Stop()
-
- go func() { assert.NoError(t, c.Serve()) }()
- time.Sleep(time.Second * 1)
-
- fcgiConnFactory := gofast.SimpleConnFactory("tcp", "0.0.0.0:6082")
-
- fcgiHandler := gofast.NewHandler(
- gofast.BasicParamsMap(gofast.BasicSession),
- gofast.SimpleClientFactory(fcgiConnFactory, 0),
- )
-
- w := httptest.NewRecorder()
- req := httptest.NewRequest("GET", "http://site.local/?hello=world", nil)
- fcgiHandler.ServeHTTP(w, req)
-
- body, err := ioutil.ReadAll(w.Result().Body)
-
- assert.NoError(t, err)
- assert.Equal(t, 201, w.Result().StatusCode)
- assert.Equal(t, "WORLD", string(body))
- c.Stop()
-}
-
-func Test_FCGI_Service_Request_Uri(t *testing.T) {
- logger, _ := test.NewNullLogger()
- logger.SetLevel(logrus.DebugLevel)
-
- c := service.NewContainer(logger)
- c.Register(ID, &Service{})
-
- assert.NoError(t, c.Init(&testCfg{httpCfg: `{
- "fcgi": {
- "address": "tcp://0.0.0.0:6083"
- },
- "workers":{
- "command": "php ../../tests/http/client.php request-uri pipes",
- "pool": {"numWorkers": 1}
- }
- }`}))
-
- s, st := c.Get(ID)
- assert.NotNil(t, s)
- assert.Equal(t, service.StatusOK, st)
-
- // should do nothing
- s.(*Service).Stop()
-
- go func() { assert.NoError(t, c.Serve()) }()
- time.Sleep(time.Second * 1)
-
- fcgiConnFactory := gofast.SimpleConnFactory("tcp", "0.0.0.0:6083")
-
- fcgiHandler := gofast.NewHandler(
- gofast.BasicParamsMap(gofast.BasicSession),
- gofast.SimpleClientFactory(fcgiConnFactory, 0),
- )
-
- w := httptest.NewRecorder()
- req := httptest.NewRequest("GET", "http://site.local/hello-world", nil)
- fcgiHandler.ServeHTTP(w, req)
-
- body, err := ioutil.ReadAll(w.Result().Body)
-
- assert.NoError(t, err)
- assert.Equal(t, 200, w.Result().StatusCode)
- assert.Equal(t, "http://site.local/hello-world", string(body))
- c.Stop()
-}
+//
+//import (
+// "io/ioutil"
+// "net/http/fcgi"
+// "net/http/httptest"
+// "testing"
+// "time"
+//
+// "github.com/stretchr/testify/assert"
+//)
+//
+//func Test_FCGI_Service_Echo(t *testing.T) {
+// logger, _ := test.NewNullLogger()
+// logger.SetLevel(logrus.DebugLevel)
+//
+// c := service.NewContainer(logger)
+// c.Register(ID, &Service{})
+//
+// assert.NoError(t, c.Init(&testCfg{httpCfg: `{
+// "fcgi": {
+// "address": "tcp://0.0.0.0:6082"
+// },
+// "workers":{
+// "command": "php ../../tests/http/client.php echo pipes",
+// "pool": {"numWorkers": 1}
+// }
+// }`}))
+//
+// s, st := c.Get(ID)
+// assert.NotNil(t, s)
+// assert.Equal(t, service.StatusOK, st)
+//
+// // should do nothing
+// s.(*Service).Stop()
+//
+// go func() { assert.NoError(t, c.Serve()) }()
+// time.Sleep(time.Second * 1)
+//
+// fcgiConnFactory := gofast.SimpleConnFactory("tcp", "0.0.0.0:6082")
+//
+// fcgiHandler := gofast.NewHandler(
+// gofast.BasicParamsMap(gofast.BasicSession),
+// gofast.SimpleClientFactory(fcgiConnFactory, 0),
+// )
+//
+// w := httptest.NewRecorder()
+// req := httptest.NewRequest("GET", "http://site.local/?hello=world", nil)
+// fcgiHandler.ServeHTTP(w, req)
+//
+// body, err := ioutil.ReadAll(w.Result().Body)
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 201, w.Result().StatusCode)
+// assert.Equal(t, "WORLD", string(body))
+// c.Stop()
+//}
+//
+//func Test_FCGI_Service_Request_Uri(t *testing.T) {
+// logger, _ := test.NewNullLogger()
+// logger.SetLevel(logrus.DebugLevel)
+//
+// c := service.NewContainer(logger)
+// c.Register(ID, &Service{})
+//
+// assert.NoError(t, c.Init(&testCfg{httpCfg: `{
+// "fcgi": {
+// "address": "tcp://0.0.0.0:6083"
+// },
+// "workers":{
+// "command": "php ../../tests/http/client.php request-uri pipes",
+// "pool": {"numWorkers": 1}
+// }
+// }`}))
+//
+// s, st := c.Get(ID)
+// assert.NotNil(t, s)
+// assert.Equal(t, service.StatusOK, st)
+//
+// // should do nothing
+// s.(*Service).Stop()
+//
+// go func() { assert.NoError(t, c.Serve()) }()
+// time.Sleep(time.Second * 1)
+//
+// fcgiConnFactory := gofast.SimpleConnFactory("tcp", "0.0.0.0:6083")
+//
+// fcgiHandler := gofast.NewHandler(
+// gofast.BasicParamsMap(gofast.BasicSession),
+// gofast.SimpleClientFactory(fcgiConnFactory, 0),
+// )
+//
+// w := httptest.NewRecorder()
+// req := httptest.NewRequest("GET", "http://site.local/hello-world", nil)
+// fcgiHandler.ServeHTTP(w, req)
+//
+// body, err := ioutil.ReadAll(w.Result().Body)
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, w.Result().StatusCode)
+// assert.Equal(t, "http://site.local/hello-world", string(body))
+// c.Stop()
+//}
diff --git a/plugins/http/h2c_test.go b/plugins/http/h2c_test.go
index f17538bc..936ca8eb 100644
--- a/plugins/http/h2c_test.go
+++ b/plugins/http/h2c_test.go
@@ -1,83 +1,81 @@
package http
-import (
- "net/http"
- "testing"
- "time"
-
- "github.com/cenkalti/backoff/v4"
- "github.com/sirupsen/logrus"
- "github.com/sirupsen/logrus/hooks/test"
- "github.com/spiral/roadrunner/service"
- "github.com/stretchr/testify/assert"
-)
-
-func Test_Service_H2C(t *testing.T) {
- bkoff := backoff.NewExponentialBackOff()
- bkoff.MaxElapsedTime = time.Second * 15
-
- err := backoff.Retry(func() error {
- logger, _ := test.NewNullLogger()
- logger.SetLevel(logrus.DebugLevel)
-
- c := service.NewContainer(logger)
- c.Register(ID, &Service{})
-
- err := c.Init(&testCfg{httpCfg: `{
- "address": ":6029",
- "http2": {"h2c":true},
- "workers":{
- "command": "php ../../tests/http/client.php echo pipes",
- "relay": "pipes",
- "pool": {
- "numWorkers": 1
- }
- }
- }`})
- if err != nil {
- return err
- }
-
- s, st := c.Get(ID)
- assert.NotNil(t, s)
- assert.Equal(t, service.StatusOK, st)
-
- // should do nothing
- s.(*Service).Stop()
-
- go func() {
- err := c.Serve()
- if err != nil {
- t.Errorf("error serving: %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 100)
- defer c.Stop()
-
- req, err := http.NewRequest("PRI", "http://localhost:6029?hello=world", nil)
- if err != nil {
- return err
- }
-
- req.Header.Add("Upgrade", "h2c")
- req.Header.Add("Connection", "HTTP2-Settings")
- req.Header.Add("HTTP2-Settings", "")
-
- r, err2 := http.DefaultClient.Do(req)
- if err2 != nil {
- return err2
- }
-
- assert.Equal(t, "101 Switching Protocols", r.Status)
-
- err3 := r.Body.Close()
- if err3 != nil {
- return err3
- }
- return nil
- }, bkoff)
-
- if err != nil {
- t.Fatal(err)
- }
-}
+//
+//import (
+// "net/http"
+// "testing"
+// "time"
+//
+// "github.com/cenkalti/backoff/v4"
+// "github.com/stretchr/testify/assert"
+//)
+//
+//func Test_Service_H2C(t *testing.T) {
+// bkoff := backoff.NewExponentialBackOff()
+// bkoff.MaxElapsedTime = time.Second * 15
+//
+// err := backoff.Retry(func() error {
+// logger, _ := test.NewNullLogger()
+// logger.SetLevel(logrus.DebugLevel)
+//
+// c := service.NewContainer(logger)
+// c.Register(ID, &Service{})
+//
+// err := c.Init(&testCfg{httpCfg: `{
+// "address": ":6029",
+// "http2": {"h2c":true},
+// "workers":{
+// "command": "php ../../tests/http/client.php echo pipes",
+// "relay": "pipes",
+// "pool": {
+// "numWorkers": 1
+// }
+// }
+// }`})
+// if err != nil {
+// return err
+// }
+//
+// s, st := c.Get(ID)
+// assert.NotNil(t, s)
+// assert.Equal(t, service.StatusOK, st)
+//
+// // should do nothing
+// s.(*Service).Stop()
+//
+// go func() {
+// err := c.Serve()
+// if err != nil {
+// t.Errorf("error serving: %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 100)
+// defer c.Stop()
+//
+// req, err := http.NewRequest("PRI", "http://localhost:6029?hello=world", nil)
+// if err != nil {
+// return err
+// }
+//
+// req.Header.Add("Upgrade", "h2c")
+// req.Header.Add("Connection", "HTTP2-Settings")
+// req.Header.Add("HTTP2-Settings", "")
+//
+// r, err2 := http.DefaultClient.Do(req)
+// if err2 != nil {
+// return err2
+// }
+//
+// assert.Equal(t, "101 Switching Protocols", r.Status)
+//
+// err3 := r.Body.Close()
+// if err3 != nil {
+// return err3
+// }
+// return nil
+// }, bkoff)
+//
+// if err != nil {
+// t.Fatal(err)
+// }
+//}
diff --git a/plugins/http/handler.go b/plugins/http/handler.go
index eca05483..2bda4f1d 100644
--- a/plugins/http/handler.go
+++ b/plugins/http/handler.go
@@ -10,8 +10,6 @@ import (
"time"
"github.com/pkg/errors"
- "github.com/sirupsen/logrus"
- "github.com/spiral/roadrunner"
)
const (
diff --git a/plugins/http/handler_test.go b/plugins/http/handler_test.go
index cb1cd728..d9726e81 100644
--- a/plugins/http/handler_test.go
+++ b/plugins/http/handler_test.go
@@ -1,1961 +1,1962 @@
package http
-import (
- "bytes"
- "context"
- "github.com/spiral/roadrunner"
- "github.com/stretchr/testify/assert"
- "io/ioutil"
- "mime/multipart"
- "net/http"
- "net/http/httptest"
- "net/url"
- "os"
- "runtime"
- "strings"
- "testing"
- "time"
-)
-
-// get request and return body
-func get(url string) (string, *http.Response, error) {
- r, err := http.Get(url)
- if err != nil {
- return "", nil, err
- }
- b, err := ioutil.ReadAll(r.Body)
- if err != nil {
- return "", nil, err
- }
-
- err = r.Body.Close()
- if err != nil {
- return "", nil, err
- }
- return string(b), r, err
-}
-
-// get request and return body
-func getHeader(url string, h map[string]string) (string, *http.Response, error) {
- req, err := http.NewRequest("GET", url, bytes.NewBuffer(nil))
- if err != nil {
- return "", nil, err
- }
-
- for k, v := range h {
- req.Header.Set(k, v)
- }
-
- r, err := http.DefaultClient.Do(req)
- if err != nil {
- return "", nil, err
- }
-
- b, err := ioutil.ReadAll(r.Body)
- if err != nil {
- return "", nil, err
- }
-
- err = r.Body.Close()
- if err != nil {
- return "", nil, err
- }
- return string(b), r, err
-}
-
-func TestHandler_Echo(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php echo pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8177", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- body, r, err := get("http://localhost:8177/?hello=world")
- assert.NoError(t, err)
- assert.Equal(t, 201, r.StatusCode)
- assert.Equal(t, "WORLD", body)
-}
-
-func Test_HandlerErrors(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php echo pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- wr := httptest.NewRecorder()
- rq := httptest.NewRequest("POST", "/", bytes.NewBuffer([]byte("data")))
-
- h.ServeHTTP(wr, rq)
- assert.Equal(t, 500, wr.Code)
-}
-
-func Test_Handler_JSON_error(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php echo pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- wr := httptest.NewRecorder()
- rq := httptest.NewRequest("POST", "/", bytes.NewBuffer([]byte("{sd")))
- rq.Header.Add("Content-Type", "application/json")
- rq.Header.Add("Content-Size", "3")
-
- h.ServeHTTP(wr, rq)
- assert.Equal(t, 500, wr.Code)
-}
-
-func TestHandler_Headers(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php header pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8078", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 100)
-
- req, err := http.NewRequest("GET", "http://localhost:8078?hello=world", nil)
- assert.NoError(t, err)
-
- req.Header.Add("input", "sample")
-
- r, err := http.DefaultClient.Do(req)
- assert.NoError(t, err)
- defer func() {
- err := r.Body.Close()
- if err != nil {
- t.Errorf("error during the closing Body: error %v", err)
-
- }
- }()
-
- b, err := ioutil.ReadAll(r.Body)
- assert.NoError(t, err)
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
- assert.Equal(t, "world", r.Header.Get("Header"))
- assert.Equal(t, "SAMPLE", string(b))
-}
-
-func TestHandler_Empty_User_Agent(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php user-agent pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8088", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- req, err := http.NewRequest("GET", "http://localhost:8088?hello=world", nil)
- assert.NoError(t, err)
-
- req.Header.Add("user-agent", "")
-
- r, err := http.DefaultClient.Do(req)
- assert.NoError(t, err)
- defer func() {
- err := r.Body.Close()
- if err != nil {
- t.Errorf("error during the closing Body: error %v", err)
-
- }
- }()
-
- b, err := ioutil.ReadAll(r.Body)
- assert.NoError(t, err)
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
- assert.Equal(t, "", string(b))
-}
-
-func TestHandler_User_Agent(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php user-agent pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8088", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- req, err := http.NewRequest("GET", "http://localhost:8088?hello=world", nil)
- assert.NoError(t, err)
-
- req.Header.Add("User-Agent", "go-agent")
-
- r, err := http.DefaultClient.Do(req)
- assert.NoError(t, err)
- defer func() {
- err := r.Body.Close()
- if err != nil {
- t.Errorf("error during the closing Body: error %v", err)
-
- }
- }()
-
- b, err := ioutil.ReadAll(r.Body)
- assert.NoError(t, err)
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
- assert.Equal(t, "go-agent", string(b))
-}
-
-func TestHandler_Cookies(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php cookie pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8079", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- req, err := http.NewRequest("GET", "http://localhost:8079", nil)
- assert.NoError(t, err)
-
- req.AddCookie(&http.Cookie{Name: "input", Value: "input-value"})
-
- r, err := http.DefaultClient.Do(req)
- assert.NoError(t, err)
- defer func() {
- err := r.Body.Close()
- if err != nil {
- t.Errorf("error during the closing Body: error %v", err)
-
- }
- }()
-
- b, err := ioutil.ReadAll(r.Body)
- assert.NoError(t, err)
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
- assert.Equal(t, "INPUT-VALUE", string(b))
-
- for _, c := range r.Cookies() {
- assert.Equal(t, "output", c.Name)
- assert.Equal(t, "cookie-output", c.Value)
- }
-}
-
-func TestHandler_JsonPayload_POST(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php payload pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8090", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- req, err := http.NewRequest(
- "POST",
- "http://localhost"+hs.Addr,
- bytes.NewBufferString(`{"key":"value"}`),
- )
- assert.NoError(t, err)
-
- req.Header.Add("Content-Type", "application/json")
-
- r, err := http.DefaultClient.Do(req)
- assert.NoError(t, err)
- defer func() {
- err := r.Body.Close()
- if err != nil {
- t.Errorf("error during the closing Body: error %v", err)
-
- }
- }()
-
- b, err := ioutil.ReadAll(r.Body)
- assert.NoError(t, err)
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
- assert.Equal(t, `{"value":"key"}`, string(b))
-}
-
-func TestHandler_JsonPayload_PUT(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php payload pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8081", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- req, err := http.NewRequest("PUT", "http://localhost"+hs.Addr, bytes.NewBufferString(`{"key":"value"}`))
- assert.NoError(t, err)
-
- req.Header.Add("Content-Type", "application/json")
-
- r, err := http.DefaultClient.Do(req)
- assert.NoError(t, err)
- defer func() {
- err := r.Body.Close()
- if err != nil {
- t.Errorf("error during the closing Body: error %v", err)
- }
- }()
-
- b, err := ioutil.ReadAll(r.Body)
- assert.NoError(t, err)
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
- assert.Equal(t, `{"value":"key"}`, string(b))
-}
-
-func TestHandler_JsonPayload_PATCH(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php payload pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8082", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- req, err := http.NewRequest("PATCH", "http://localhost"+hs.Addr, bytes.NewBufferString(`{"key":"value"}`))
- assert.NoError(t, err)
-
- req.Header.Add("Content-Type", "application/json")
-
- r, err := http.DefaultClient.Do(req)
- assert.NoError(t, err)
- defer func() {
- err := r.Body.Close()
- if err != nil {
- t.Errorf("error during the closing Body: error %v", err)
-
- }
- }()
-
- b, err := ioutil.ReadAll(r.Body)
- assert.NoError(t, err)
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
- assert.Equal(t, `{"value":"key"}`, string(b))
-}
-
-func TestHandler_FormData_POST(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php data pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8083", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 500)
-
- form := url.Values{}
-
- form.Add("key", "value")
- form.Add("name[]", "name1")
- form.Add("name[]", "name2")
- form.Add("name[]", "name3")
- form.Add("arr[x][y][z]", "y")
- form.Add("arr[x][y][e]", "f")
- form.Add("arr[c]p", "l")
- form.Add("arr[c]z", "")
-
- req, err := http.NewRequest("POST", "http://localhost"+hs.Addr, strings.NewReader(form.Encode()))
- assert.NoError(t, err)
-
- req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
-
- r, err := http.DefaultClient.Do(req)
- assert.NoError(t, err)
- defer func() {
- err := r.Body.Close()
- if err != nil {
- t.Errorf("error during the closing Body: error %v", err)
-
- }
- }()
-
- b, err := ioutil.ReadAll(r.Body)
- assert.NoError(t, err)
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
-
- assert.Equal(t, `{"arr":{"c":{"p":"l","z":""},"x":{"y":{"e":"f","z":"y"}}},"key":"value","name":["name1","name2","name3"]}`, string(b))
-}
-
-func TestHandler_FormData_POST_Overwrite(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php data pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8083", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- form := url.Values{}
-
- form.Add("key", "value1")
- form.Add("key", "value2")
-
- req, err := http.NewRequest("POST", "http://localhost"+hs.Addr, strings.NewReader(form.Encode()))
- assert.NoError(t, err)
-
- req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
-
- r, err := http.DefaultClient.Do(req)
- assert.NoError(t, err)
- defer func() {
- err := r.Body.Close()
- if err != nil {
- t.Errorf("error during the closing Body: error %v", err)
-
- }
- }()
-
- b, err := ioutil.ReadAll(r.Body)
- assert.NoError(t, err)
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
-
- assert.Equal(t, `{"key":"value2","arr":{"x":{"y":null}}}`, string(b))
-}
-
-func TestHandler_FormData_POST_Form_UrlEncoded_Charset(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php data pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8083", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- form := url.Values{}
-
- form.Add("key", "value")
- form.Add("name[]", "name1")
- form.Add("name[]", "name2")
- form.Add("name[]", "name3")
- form.Add("arr[x][y][z]", "y")
- form.Add("arr[x][y][e]", "f")
- form.Add("arr[c]p", "l")
- form.Add("arr[c]z", "")
-
- req, err := http.NewRequest("POST", "http://localhost"+hs.Addr, strings.NewReader(form.Encode()))
- assert.NoError(t, err)
-
- req.Header.Add("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
-
- r, err := http.DefaultClient.Do(req)
- assert.NoError(t, err)
- defer func() {
- err := r.Body.Close()
- if err != nil {
- t.Errorf("error during the closing Body: error %v", err)
-
- }
- }()
-
- b, err := ioutil.ReadAll(r.Body)
- assert.NoError(t, err)
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
-
- assert.Equal(t, `{"arr":{"c":{"p":"l","z":""},"x":{"y":{"e":"f","z":"y"}}},"key":"value","name":["name1","name2","name3"]}`, string(b))
-}
-
-func TestHandler_FormData_PUT(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php data pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8084", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 500)
-
- form := url.Values{}
-
- form.Add("key", "value")
- form.Add("name[]", "name1")
- form.Add("name[]", "name2")
- form.Add("name[]", "name3")
- form.Add("arr[x][y][z]", "y")
- form.Add("arr[x][y][e]", "f")
- form.Add("arr[c]p", "l")
- form.Add("arr[c]z", "")
-
- req, err := http.NewRequest("PUT", "http://localhost"+hs.Addr, strings.NewReader(form.Encode()))
- assert.NoError(t, err)
-
- req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
-
- r, err := http.DefaultClient.Do(req)
- assert.NoError(t, err)
- defer func() {
- err := r.Body.Close()
- if err != nil {
- t.Errorf("error during the closing Body: error %v", err)
-
- }
- }()
-
- b, err := ioutil.ReadAll(r.Body)
- assert.NoError(t, err)
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
-
- assert.Equal(t, `{"arr":{"c":{"p":"l","z":""},"x":{"y":{"e":"f","z":"y"}}},"key":"value","name":["name1","name2","name3"]}`, string(b))
-}
-
-func TestHandler_FormData_PATCH(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php data pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8085", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- form := url.Values{}
-
- form.Add("key", "value")
- form.Add("name[]", "name1")
- form.Add("name[]", "name2")
- form.Add("name[]", "name3")
- form.Add("arr[x][y][z]", "y")
- form.Add("arr[x][y][e]", "f")
- form.Add("arr[c]p", "l")
- form.Add("arr[c]z", "")
-
- req, err := http.NewRequest("PATCH", "http://localhost"+hs.Addr, strings.NewReader(form.Encode()))
- assert.NoError(t, err)
-
- req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
-
- r, err := http.DefaultClient.Do(req)
- assert.NoError(t, err)
- defer func() {
- err := r.Body.Close()
- if err != nil {
- t.Errorf("error during the closing Body: error %v", err)
-
- }
- }()
-
- b, err := ioutil.ReadAll(r.Body)
- assert.NoError(t, err)
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
-
- assert.Equal(t, `{"arr":{"c":{"p":"l","z":""},"x":{"y":{"e":"f","z":"y"}}},"key":"value","name":["name1","name2","name3"]}`, string(b))
-}
-
-func TestHandler_Multipart_POST(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php data pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8019", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- var mb bytes.Buffer
- w := multipart.NewWriter(&mb)
- err := w.WriteField("key", "value")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("key", "value")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("name[]", "name1")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("name[]", "name2")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("name[]", "name3")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("arr[x][y][z]", "y")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("arr[x][y][e]", "f")
-
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("arr[c]p", "l")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("arr[c]z", "")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.Close()
- if err != nil {
- t.Errorf("error closing the writer: error %v", err)
- }
-
- req, err := http.NewRequest("POST", "http://localhost"+hs.Addr, &mb)
- assert.NoError(t, err)
-
- req.Header.Set("Content-Type", w.FormDataContentType())
-
- r, err := http.DefaultClient.Do(req)
- assert.NoError(t, err)
- defer func() {
- err := r.Body.Close()
- if err != nil {
- t.Errorf("error during the closing Body: error %v", err)
-
- }
- }()
-
- b, err := ioutil.ReadAll(r.Body)
- assert.NoError(t, err)
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
-
- assert.Equal(t, `{"arr":{"c":{"p":"l","z":""},"x":{"y":{"e":"f","z":"y"}}},"key":"value","name":["name1","name2","name3"]}`, string(b))
-}
-
-func TestHandler_Multipart_PUT(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php data pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8020", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 500)
-
- var mb bytes.Buffer
- w := multipart.NewWriter(&mb)
- err := w.WriteField("key", "value")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("key", "value")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("name[]", "name1")
-
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("name[]", "name2")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("name[]", "name3")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("arr[x][y][z]", "y")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("arr[x][y][e]", "f")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("arr[c]p", "l")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("arr[c]z", "")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.Close()
- if err != nil {
- t.Errorf("error closing the writer: error %v", err)
- }
-
- req, err := http.NewRequest("PUT", "http://localhost"+hs.Addr, &mb)
- assert.NoError(t, err)
-
- req.Header.Set("Content-Type", w.FormDataContentType())
-
- r, err := http.DefaultClient.Do(req)
- assert.NoError(t, err)
- defer func() {
- err := r.Body.Close()
- if err != nil {
- t.Errorf("error during the closing Body: error %v", err)
-
- }
- }()
-
- b, err := ioutil.ReadAll(r.Body)
- assert.NoError(t, err)
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
-
- assert.Equal(t, `{"arr":{"c":{"p":"l","z":""},"x":{"y":{"e":"f","z":"y"}}},"key":"value","name":["name1","name2","name3"]}`, string(b))
-}
-
-func TestHandler_Multipart_PATCH(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php data pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8021", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
-
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 500)
-
- var mb bytes.Buffer
- w := multipart.NewWriter(&mb)
- err := w.WriteField("key", "value")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("key", "value")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("name[]", "name1")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("name[]", "name2")
-
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("name[]", "name3")
-
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("arr[x][y][z]", "y")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("arr[x][y][e]", "f")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("arr[c]p", "l")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.WriteField("arr[c]z", "")
- if err != nil {
- t.Errorf("error writing the field: error %v", err)
- }
-
- err = w.Close()
- if err != nil {
- t.Errorf("error closing the writer: error %v", err)
- }
-
- req, err := http.NewRequest("PATCH", "http://localhost"+hs.Addr, &mb)
- assert.NoError(t, err)
-
- req.Header.Set("Content-Type", w.FormDataContentType())
-
- r, err := http.DefaultClient.Do(req)
- assert.NoError(t, err)
- defer func() {
- err := r.Body.Close()
- if err != nil {
- t.Errorf("error during the closing Body: error %v", err)
-
- }
- }()
-
- b, err := ioutil.ReadAll(r.Body)
- assert.NoError(t, err)
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
-
- assert.Equal(t, `{"arr":{"c":{"p":"l","z":""},"x":{"y":{"e":"f","z":"y"}}},"key":"value","name":["name1","name2","name3"]}`, string(b))
-}
-
-func TestHandler_Error(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php error pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8177", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- _, r, err := get("http://localhost:8177/?hello=world")
- assert.NoError(t, err)
- assert.Equal(t, 500, r.StatusCode)
-}
-
-func TestHandler_Error2(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php error2 pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8177", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- _, r, err := get("http://localhost:8177/?hello=world")
- assert.NoError(t, err)
- assert.Equal(t, 500, r.StatusCode)
-}
-
-func TestHandler_Error3(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php pid pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8177", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- b2 := &bytes.Buffer{}
- for i := 0; i < 1024*1024; i++ {
- b2.Write([]byte(" "))
- }
-
- req, err := http.NewRequest("POST", "http://localhost"+hs.Addr, b2)
- assert.NoError(t, err)
-
- r, err := http.DefaultClient.Do(req)
- assert.NoError(t, err)
- defer func() {
- err := r.Body.Close()
- if err != nil {
- t.Errorf("error during the closing Body: error %v", err)
-
- }
- }()
-
- assert.NoError(t, err)
- assert.Equal(t, 500, r.StatusCode)
-}
-
-func TestHandler_ResponseDuration(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php echo pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8177", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- gotresp := make(chan interface{})
- h.Listen(func(event int, ctx interface{}) {
- if event == EventResponse {
- c := ctx.(*ResponseEvent)
-
- if c.Elapsed() > 0 {
- close(gotresp)
- }
- }
- })
-
- body, r, err := get("http://localhost:8177/?hello=world")
- assert.NoError(t, err)
-
- <-gotresp
-
- assert.Equal(t, 201, r.StatusCode)
- assert.Equal(t, "WORLD", body)
-}
-
-func TestHandler_ResponseDurationDelayed(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php echoDelay pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8177", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- gotresp := make(chan interface{})
- h.Listen(func(event int, ctx interface{}) {
- if event == EventResponse {
- c := ctx.(*ResponseEvent)
-
- if c.Elapsed() > time.Second {
- close(gotresp)
- }
- }
- })
-
- body, r, err := get("http://localhost:8177/?hello=world")
- assert.NoError(t, err)
-
- <-gotresp
-
- assert.Equal(t, 201, r.StatusCode)
- assert.Equal(t, "WORLD", body)
-}
-
-func TestHandler_ErrorDuration(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php error pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8177", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- goterr := make(chan interface{})
- h.Listen(func(event int, ctx interface{}) {
- if event == EventError {
- c := ctx.(*ErrorEvent)
-
- if c.Elapsed() > 0 {
- close(goterr)
- }
- }
- })
-
- _, r, err := get("http://localhost:8177/?hello=world")
- assert.NoError(t, err)
-
- <-goterr
-
- assert.Equal(t, 500, r.StatusCode)
-}
-
-func TestHandler_IP(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- TrustedSubnets: []string{
- "10.0.0.0/8",
- "127.0.0.0/8",
- "172.16.0.0/12",
- "192.168.0.0/16",
- "::1/128",
- "fc00::/7",
- "fe80::/10",
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php ip pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- err := h.cfg.parseCIDRs()
- if err != nil {
- t.Errorf("error parsing CIDRs: error %v", err)
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: "127.0.0.1:8177", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- body, r, err := get("http://127.0.0.1:8177/")
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
- assert.Equal(t, "127.0.0.1", body)
-}
-
-func TestHandler_XRealIP(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- TrustedSubnets: []string{
- "10.0.0.0/8",
- "127.0.0.0/8",
- "172.16.0.0/12",
- "192.168.0.0/16",
- "::1/128",
- "fc00::/7",
- "fe80::/10",
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php ip pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- err := h.cfg.parseCIDRs()
- if err != nil {
- t.Errorf("error parsing CIDRs: error %v", err)
- }
-
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: "127.0.0.1:8177", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- body, r, err := getHeader("http://127.0.0.1:8177/", map[string]string{
- "X-Real-Ip": "200.0.0.1",
- })
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
- assert.Equal(t, "200.0.0.1", body)
-}
-
-func TestHandler_XForwardedFor(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- TrustedSubnets: []string{
- "10.0.0.0/8",
- "127.0.0.0/8",
- "172.16.0.0/12",
- "192.168.0.0/16",
- "100.0.0.0/16",
- "200.0.0.0/16",
- "::1/128",
- "fc00::/7",
- "fe80::/10",
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php ip pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- err := h.cfg.parseCIDRs()
- if err != nil {
- t.Errorf("error parsing CIDRs: error %v", err)
- }
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: "127.0.0.1:8177", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- body, r, err := getHeader("http://127.0.0.1:8177/", map[string]string{
- "X-Forwarded-For": "100.0.0.1, 200.0.0.1, invalid, 101.0.0.1",
- })
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
- assert.Equal(t, "101.0.0.1", body)
-
- body, r, err = getHeader("http://127.0.0.1:8177/", map[string]string{
- "X-Forwarded-For": "100.0.0.1, 200.0.0.1, 101.0.0.1, invalid",
- })
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
- assert.Equal(t, "101.0.0.1", body)
-}
-
-func TestHandler_XForwardedFor_NotTrustedRemoteIp(t *testing.T) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- TrustedSubnets: []string{
- "10.0.0.0/8",
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php ip pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: 1,
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- err := h.cfg.parseCIDRs()
- if err != nil {
- t.Errorf("error parsing CIDRs: error %v", err)
- }
- assert.NoError(t, h.rr.Start())
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: "127.0.0.1:8177", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- t.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- t.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- body, r, err := getHeader("http://127.0.0.1:8177/", map[string]string{
- "X-Forwarded-For": "100.0.0.1, 200.0.0.1, invalid, 101.0.0.1",
- })
-
- assert.NoError(t, err)
- assert.Equal(t, 200, r.StatusCode)
- assert.Equal(t, "127.0.0.1", body)
-}
-
-func BenchmarkHandler_Listen_Echo(b *testing.B) {
- h := &Handler{
- cfg: &Config{
- MaxRequestSize: 1024,
- Uploads: &UploadsConfig{
- Dir: os.TempDir(),
- Forbid: []string{},
- },
- },
- rr: roadrunner.NewServer(&roadrunner.ServerConfig{
- Command: "php ../../tests/http/client.php echo pipes",
- Relay: "pipes",
- Pool: &roadrunner.Config{
- NumWorkers: int64(runtime.NumCPU()),
- AllocateTimeout: 10000000,
- DestroyTimeout: 10000000,
- },
- }),
- }
-
- err := h.rr.Start()
- if err != nil {
- b.Errorf("error starting the worker pool: error %v", err)
- }
- defer h.rr.Stop()
-
- hs := &http.Server{Addr: ":8177", Handler: h}
- defer func() {
- err := hs.Shutdown(context.Background())
- if err != nil {
- b.Errorf("error during the shutdown: error %v", err)
- }
- }()
-
- go func() {
- err := hs.ListenAndServe()
- if err != nil && err != http.ErrServerClosed {
- b.Errorf("error listening the interface: error %v", err)
- }
- }()
- time.Sleep(time.Millisecond * 10)
-
- bb := "WORLD"
- for n := 0; n < b.N; n++ {
- r, err := http.Get("http://localhost:8177/?hello=world")
- if err != nil {
- b.Fail()
- }
- // Response might be nil here
- if r != nil {
- br, err := ioutil.ReadAll(r.Body)
- if err != nil {
- b.Errorf("error reading Body: error %v", err)
- }
- if string(br) != bb {
- b.Fail()
- }
- err = r.Body.Close()
- if err != nil {
- b.Errorf("error closing the Body: error %v", err)
- }
- } else {
- b.Errorf("got nil response")
- }
- }
-}
+//
+//import (
+// "bytes"
+// "context"
+// "github.com/spiral/roadrunner"
+// "github.com/stretchr/testify/assert"
+// "io/ioutil"
+// "mime/multipart"
+// "net/http"
+// "net/http/httptest"
+// "net/url"
+// "os"
+// "runtime"
+// "strings"
+// "testing"
+// "time"
+//)
+//
+//// get request and return body
+//func get(url string) (string, *http.Response, error) {
+// r, err := http.Get(url)
+// if err != nil {
+// return "", nil, err
+// }
+// b, err := ioutil.ReadAll(r.Body)
+// if err != nil {
+// return "", nil, err
+// }
+//
+// err = r.Body.Close()
+// if err != nil {
+// return "", nil, err
+// }
+// return string(b), r, err
+//}
+//
+//// get request and return body
+//func getHeader(url string, h map[string]string) (string, *http.Response, error) {
+// req, err := http.NewRequest("GET", url, bytes.NewBuffer(nil))
+// if err != nil {
+// return "", nil, err
+// }
+//
+// for k, v := range h {
+// req.Header.Set(k, v)
+// }
+//
+// r, err := http.DefaultClient.Do(req)
+// if err != nil {
+// return "", nil, err
+// }
+//
+// b, err := ioutil.ReadAll(r.Body)
+// if err != nil {
+// return "", nil, err
+// }
+//
+// err = r.Body.Close()
+// if err != nil {
+// return "", nil, err
+// }
+// return string(b), r, err
+//}
+//
+//func TestHandler_Echo(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php echo pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8177", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// body, r, err := get("http://localhost:8177/?hello=world")
+// assert.NoError(t, err)
+// assert.Equal(t, 201, r.StatusCode)
+// assert.Equal(t, "WORLD", body)
+//}
+//
+//func Test_HandlerErrors(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php echo pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// wr := httptest.NewRecorder()
+// rq := httptest.NewRequest("POST", "/", bytes.NewBuffer([]byte("data")))
+//
+// h.ServeHTTP(wr, rq)
+// assert.Equal(t, 500, wr.Code)
+//}
+//
+//func Test_Handler_JSON_error(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php echo pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// wr := httptest.NewRecorder()
+// rq := httptest.NewRequest("POST", "/", bytes.NewBuffer([]byte("{sd")))
+// rq.Header.Add("Content-Type", "application/json")
+// rq.Header.Add("Content-Size", "3")
+//
+// h.ServeHTTP(wr, rq)
+// assert.Equal(t, 500, wr.Code)
+//}
+//
+//func TestHandler_Headers(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php header pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8078", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 100)
+//
+// req, err := http.NewRequest("GET", "http://localhost:8078?hello=world", nil)
+// assert.NoError(t, err)
+//
+// req.Header.Add("input", "sample")
+//
+// r, err := http.DefaultClient.Do(req)
+// assert.NoError(t, err)
+// defer func() {
+// err := r.Body.Close()
+// if err != nil {
+// t.Errorf("error during the closing Body: error %v", err)
+//
+// }
+// }()
+//
+// b, err := ioutil.ReadAll(r.Body)
+// assert.NoError(t, err)
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+// assert.Equal(t, "world", r.Header.Get("Header"))
+// assert.Equal(t, "SAMPLE", string(b))
+//}
+//
+//func TestHandler_Empty_User_Agent(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php user-agent pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8088", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// req, err := http.NewRequest("GET", "http://localhost:8088?hello=world", nil)
+// assert.NoError(t, err)
+//
+// req.Header.Add("user-agent", "")
+//
+// r, err := http.DefaultClient.Do(req)
+// assert.NoError(t, err)
+// defer func() {
+// err := r.Body.Close()
+// if err != nil {
+// t.Errorf("error during the closing Body: error %v", err)
+//
+// }
+// }()
+//
+// b, err := ioutil.ReadAll(r.Body)
+// assert.NoError(t, err)
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+// assert.Equal(t, "", string(b))
+//}
+//
+//func TestHandler_User_Agent(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php user-agent pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8088", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// req, err := http.NewRequest("GET", "http://localhost:8088?hello=world", nil)
+// assert.NoError(t, err)
+//
+// req.Header.Add("User-Agent", "go-agent")
+//
+// r, err := http.DefaultClient.Do(req)
+// assert.NoError(t, err)
+// defer func() {
+// err := r.Body.Close()
+// if err != nil {
+// t.Errorf("error during the closing Body: error %v", err)
+//
+// }
+// }()
+//
+// b, err := ioutil.ReadAll(r.Body)
+// assert.NoError(t, err)
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+// assert.Equal(t, "go-agent", string(b))
+//}
+//
+//func TestHandler_Cookies(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php cookie pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8079", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// req, err := http.NewRequest("GET", "http://localhost:8079", nil)
+// assert.NoError(t, err)
+//
+// req.AddCookie(&http.Cookie{Name: "input", Value: "input-value"})
+//
+// r, err := http.DefaultClient.Do(req)
+// assert.NoError(t, err)
+// defer func() {
+// err := r.Body.Close()
+// if err != nil {
+// t.Errorf("error during the closing Body: error %v", err)
+//
+// }
+// }()
+//
+// b, err := ioutil.ReadAll(r.Body)
+// assert.NoError(t, err)
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+// assert.Equal(t, "INPUT-VALUE", string(b))
+//
+// for _, c := range r.Cookies() {
+// assert.Equal(t, "output", c.Name)
+// assert.Equal(t, "cookie-output", c.Value)
+// }
+//}
+//
+//func TestHandler_JsonPayload_POST(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php payload pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8090", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// req, err := http.NewRequest(
+// "POST",
+// "http://localhost"+hs.Addr,
+// bytes.NewBufferString(`{"key":"value"}`),
+// )
+// assert.NoError(t, err)
+//
+// req.Header.Add("Content-Type", "application/json")
+//
+// r, err := http.DefaultClient.Do(req)
+// assert.NoError(t, err)
+// defer func() {
+// err := r.Body.Close()
+// if err != nil {
+// t.Errorf("error during the closing Body: error %v", err)
+//
+// }
+// }()
+//
+// b, err := ioutil.ReadAll(r.Body)
+// assert.NoError(t, err)
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+// assert.Equal(t, `{"value":"key"}`, string(b))
+//}
+//
+//func TestHandler_JsonPayload_PUT(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php payload pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8081", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// req, err := http.NewRequest("PUT", "http://localhost"+hs.Addr, bytes.NewBufferString(`{"key":"value"}`))
+// assert.NoError(t, err)
+//
+// req.Header.Add("Content-Type", "application/json")
+//
+// r, err := http.DefaultClient.Do(req)
+// assert.NoError(t, err)
+// defer func() {
+// err := r.Body.Close()
+// if err != nil {
+// t.Errorf("error during the closing Body: error %v", err)
+// }
+// }()
+//
+// b, err := ioutil.ReadAll(r.Body)
+// assert.NoError(t, err)
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+// assert.Equal(t, `{"value":"key"}`, string(b))
+//}
+//
+//func TestHandler_JsonPayload_PATCH(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php payload pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8082", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// req, err := http.NewRequest("PATCH", "http://localhost"+hs.Addr, bytes.NewBufferString(`{"key":"value"}`))
+// assert.NoError(t, err)
+//
+// req.Header.Add("Content-Type", "application/json")
+//
+// r, err := http.DefaultClient.Do(req)
+// assert.NoError(t, err)
+// defer func() {
+// err := r.Body.Close()
+// if err != nil {
+// t.Errorf("error during the closing Body: error %v", err)
+//
+// }
+// }()
+//
+// b, err := ioutil.ReadAll(r.Body)
+// assert.NoError(t, err)
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+// assert.Equal(t, `{"value":"key"}`, string(b))
+//}
+//
+//func TestHandler_FormData_POST(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php data pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8083", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 500)
+//
+// form := url.Values{}
+//
+// form.Add("key", "value")
+// form.Add("name[]", "name1")
+// form.Add("name[]", "name2")
+// form.Add("name[]", "name3")
+// form.Add("arr[x][y][z]", "y")
+// form.Add("arr[x][y][e]", "f")
+// form.Add("arr[c]p", "l")
+// form.Add("arr[c]z", "")
+//
+// req, err := http.NewRequest("POST", "http://localhost"+hs.Addr, strings.NewReader(form.Encode()))
+// assert.NoError(t, err)
+//
+// req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
+//
+// r, err := http.DefaultClient.Do(req)
+// assert.NoError(t, err)
+// defer func() {
+// err := r.Body.Close()
+// if err != nil {
+// t.Errorf("error during the closing Body: error %v", err)
+//
+// }
+// }()
+//
+// b, err := ioutil.ReadAll(r.Body)
+// assert.NoError(t, err)
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+//
+// assert.Equal(t, `{"arr":{"c":{"p":"l","z":""},"x":{"y":{"e":"f","z":"y"}}},"key":"value","name":["name1","name2","name3"]}`, string(b))
+//}
+//
+//func TestHandler_FormData_POST_Overwrite(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php data pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8083", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// form := url.Values{}
+//
+// form.Add("key", "value1")
+// form.Add("key", "value2")
+//
+// req, err := http.NewRequest("POST", "http://localhost"+hs.Addr, strings.NewReader(form.Encode()))
+// assert.NoError(t, err)
+//
+// req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
+//
+// r, err := http.DefaultClient.Do(req)
+// assert.NoError(t, err)
+// defer func() {
+// err := r.Body.Close()
+// if err != nil {
+// t.Errorf("error during the closing Body: error %v", err)
+//
+// }
+// }()
+//
+// b, err := ioutil.ReadAll(r.Body)
+// assert.NoError(t, err)
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+//
+// assert.Equal(t, `{"key":"value2","arr":{"x":{"y":null}}}`, string(b))
+//}
+//
+//func TestHandler_FormData_POST_Form_UrlEncoded_Charset(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php data pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8083", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// form := url.Values{}
+//
+// form.Add("key", "value")
+// form.Add("name[]", "name1")
+// form.Add("name[]", "name2")
+// form.Add("name[]", "name3")
+// form.Add("arr[x][y][z]", "y")
+// form.Add("arr[x][y][e]", "f")
+// form.Add("arr[c]p", "l")
+// form.Add("arr[c]z", "")
+//
+// req, err := http.NewRequest("POST", "http://localhost"+hs.Addr, strings.NewReader(form.Encode()))
+// assert.NoError(t, err)
+//
+// req.Header.Add("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
+//
+// r, err := http.DefaultClient.Do(req)
+// assert.NoError(t, err)
+// defer func() {
+// err := r.Body.Close()
+// if err != nil {
+// t.Errorf("error during the closing Body: error %v", err)
+//
+// }
+// }()
+//
+// b, err := ioutil.ReadAll(r.Body)
+// assert.NoError(t, err)
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+//
+// assert.Equal(t, `{"arr":{"c":{"p":"l","z":""},"x":{"y":{"e":"f","z":"y"}}},"key":"value","name":["name1","name2","name3"]}`, string(b))
+//}
+//
+//func TestHandler_FormData_PUT(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php data pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8084", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 500)
+//
+// form := url.Values{}
+//
+// form.Add("key", "value")
+// form.Add("name[]", "name1")
+// form.Add("name[]", "name2")
+// form.Add("name[]", "name3")
+// form.Add("arr[x][y][z]", "y")
+// form.Add("arr[x][y][e]", "f")
+// form.Add("arr[c]p", "l")
+// form.Add("arr[c]z", "")
+//
+// req, err := http.NewRequest("PUT", "http://localhost"+hs.Addr, strings.NewReader(form.Encode()))
+// assert.NoError(t, err)
+//
+// req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
+//
+// r, err := http.DefaultClient.Do(req)
+// assert.NoError(t, err)
+// defer func() {
+// err := r.Body.Close()
+// if err != nil {
+// t.Errorf("error during the closing Body: error %v", err)
+//
+// }
+// }()
+//
+// b, err := ioutil.ReadAll(r.Body)
+// assert.NoError(t, err)
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+//
+// assert.Equal(t, `{"arr":{"c":{"p":"l","z":""},"x":{"y":{"e":"f","z":"y"}}},"key":"value","name":["name1","name2","name3"]}`, string(b))
+//}
+//
+//func TestHandler_FormData_PATCH(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php data pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8085", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// form := url.Values{}
+//
+// form.Add("key", "value")
+// form.Add("name[]", "name1")
+// form.Add("name[]", "name2")
+// form.Add("name[]", "name3")
+// form.Add("arr[x][y][z]", "y")
+// form.Add("arr[x][y][e]", "f")
+// form.Add("arr[c]p", "l")
+// form.Add("arr[c]z", "")
+//
+// req, err := http.NewRequest("PATCH", "http://localhost"+hs.Addr, strings.NewReader(form.Encode()))
+// assert.NoError(t, err)
+//
+// req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
+//
+// r, err := http.DefaultClient.Do(req)
+// assert.NoError(t, err)
+// defer func() {
+// err := r.Body.Close()
+// if err != nil {
+// t.Errorf("error during the closing Body: error %v", err)
+//
+// }
+// }()
+//
+// b, err := ioutil.ReadAll(r.Body)
+// assert.NoError(t, err)
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+//
+// assert.Equal(t, `{"arr":{"c":{"p":"l","z":""},"x":{"y":{"e":"f","z":"y"}}},"key":"value","name":["name1","name2","name3"]}`, string(b))
+//}
+//
+//func TestHandler_Multipart_POST(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php data pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8019", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// var mb bytes.Buffer
+// w := multipart.NewWriter(&mb)
+// err := w.WriteField("key", "value")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("key", "value")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("name[]", "name1")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("name[]", "name2")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("name[]", "name3")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("arr[x][y][z]", "y")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("arr[x][y][e]", "f")
+//
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("arr[c]p", "l")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("arr[c]z", "")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.Close()
+// if err != nil {
+// t.Errorf("error closing the writer: error %v", err)
+// }
+//
+// req, err := http.NewRequest("POST", "http://localhost"+hs.Addr, &mb)
+// assert.NoError(t, err)
+//
+// req.Header.Set("Content-Type", w.FormDataContentType())
+//
+// r, err := http.DefaultClient.Do(req)
+// assert.NoError(t, err)
+// defer func() {
+// err := r.Body.Close()
+// if err != nil {
+// t.Errorf("error during the closing Body: error %v", err)
+//
+// }
+// }()
+//
+// b, err := ioutil.ReadAll(r.Body)
+// assert.NoError(t, err)
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+//
+// assert.Equal(t, `{"arr":{"c":{"p":"l","z":""},"x":{"y":{"e":"f","z":"y"}}},"key":"value","name":["name1","name2","name3"]}`, string(b))
+//}
+//
+//func TestHandler_Multipart_PUT(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php data pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8020", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 500)
+//
+// var mb bytes.Buffer
+// w := multipart.NewWriter(&mb)
+// err := w.WriteField("key", "value")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("key", "value")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("name[]", "name1")
+//
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("name[]", "name2")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("name[]", "name3")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("arr[x][y][z]", "y")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("arr[x][y][e]", "f")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("arr[c]p", "l")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("arr[c]z", "")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.Close()
+// if err != nil {
+// t.Errorf("error closing the writer: error %v", err)
+// }
+//
+// req, err := http.NewRequest("PUT", "http://localhost"+hs.Addr, &mb)
+// assert.NoError(t, err)
+//
+// req.Header.Set("Content-Type", w.FormDataContentType())
+//
+// r, err := http.DefaultClient.Do(req)
+// assert.NoError(t, err)
+// defer func() {
+// err := r.Body.Close()
+// if err != nil {
+// t.Errorf("error during the closing Body: error %v", err)
+//
+// }
+// }()
+//
+// b, err := ioutil.ReadAll(r.Body)
+// assert.NoError(t, err)
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+//
+// assert.Equal(t, `{"arr":{"c":{"p":"l","z":""},"x":{"y":{"e":"f","z":"y"}}},"key":"value","name":["name1","name2","name3"]}`, string(b))
+//}
+//
+//func TestHandler_Multipart_PATCH(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php data pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8021", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+//
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 500)
+//
+// var mb bytes.Buffer
+// w := multipart.NewWriter(&mb)
+// err := w.WriteField("key", "value")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("key", "value")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("name[]", "name1")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("name[]", "name2")
+//
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("name[]", "name3")
+//
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("arr[x][y][z]", "y")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("arr[x][y][e]", "f")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("arr[c]p", "l")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.WriteField("arr[c]z", "")
+// if err != nil {
+// t.Errorf("error writing the field: error %v", err)
+// }
+//
+// err = w.Close()
+// if err != nil {
+// t.Errorf("error closing the writer: error %v", err)
+// }
+//
+// req, err := http.NewRequest("PATCH", "http://localhost"+hs.Addr, &mb)
+// assert.NoError(t, err)
+//
+// req.Header.Set("Content-Type", w.FormDataContentType())
+//
+// r, err := http.DefaultClient.Do(req)
+// assert.NoError(t, err)
+// defer func() {
+// err := r.Body.Close()
+// if err != nil {
+// t.Errorf("error during the closing Body: error %v", err)
+//
+// }
+// }()
+//
+// b, err := ioutil.ReadAll(r.Body)
+// assert.NoError(t, err)
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+//
+// assert.Equal(t, `{"arr":{"c":{"p":"l","z":""},"x":{"y":{"e":"f","z":"y"}}},"key":"value","name":["name1","name2","name3"]}`, string(b))
+//}
+//
+//func TestHandler_Error(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php error pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8177", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// _, r, err := get("http://localhost:8177/?hello=world")
+// assert.NoError(t, err)
+// assert.Equal(t, 500, r.StatusCode)
+//}
+//
+//func TestHandler_Error2(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php error2 pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8177", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// _, r, err := get("http://localhost:8177/?hello=world")
+// assert.NoError(t, err)
+// assert.Equal(t, 500, r.StatusCode)
+//}
+//
+//func TestHandler_Error3(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php pid pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8177", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// b2 := &bytes.Buffer{}
+// for i := 0; i < 1024*1024; i++ {
+// b2.Write([]byte(" "))
+// }
+//
+// req, err := http.NewRequest("POST", "http://localhost"+hs.Addr, b2)
+// assert.NoError(t, err)
+//
+// r, err := http.DefaultClient.Do(req)
+// assert.NoError(t, err)
+// defer func() {
+// err := r.Body.Close()
+// if err != nil {
+// t.Errorf("error during the closing Body: error %v", err)
+//
+// }
+// }()
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 500, r.StatusCode)
+//}
+//
+//func TestHandler_ResponseDuration(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php echo pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8177", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// gotresp := make(chan interface{})
+// h.Listen(func(event int, ctx interface{}) {
+// if event == EventResponse {
+// c := ctx.(*ResponseEvent)
+//
+// if c.Elapsed() > 0 {
+// close(gotresp)
+// }
+// }
+// })
+//
+// body, r, err := get("http://localhost:8177/?hello=world")
+// assert.NoError(t, err)
+//
+// <-gotresp
+//
+// assert.Equal(t, 201, r.StatusCode)
+// assert.Equal(t, "WORLD", body)
+//}
+//
+//func TestHandler_ResponseDurationDelayed(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php echoDelay pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8177", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// gotresp := make(chan interface{})
+// h.Listen(func(event int, ctx interface{}) {
+// if event == EventResponse {
+// c := ctx.(*ResponseEvent)
+//
+// if c.Elapsed() > time.Second {
+// close(gotresp)
+// }
+// }
+// })
+//
+// body, r, err := get("http://localhost:8177/?hello=world")
+// assert.NoError(t, err)
+//
+// <-gotresp
+//
+// assert.Equal(t, 201, r.StatusCode)
+// assert.Equal(t, "WORLD", body)
+//}
+//
+//func TestHandler_ErrorDuration(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php error pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8177", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// goterr := make(chan interface{})
+// h.Listen(func(event int, ctx interface{}) {
+// if event == EventError {
+// c := ctx.(*ErrorEvent)
+//
+// if c.Elapsed() > 0 {
+// close(goterr)
+// }
+// }
+// })
+//
+// _, r, err := get("http://localhost:8177/?hello=world")
+// assert.NoError(t, err)
+//
+// <-goterr
+//
+// assert.Equal(t, 500, r.StatusCode)
+//}
+//
+//func TestHandler_IP(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// TrustedSubnets: []string{
+// "10.0.0.0/8",
+// "127.0.0.0/8",
+// "172.16.0.0/12",
+// "192.168.0.0/16",
+// "::1/128",
+// "fc00::/7",
+// "fe80::/10",
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php ip pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// err := h.cfg.parseCIDRs()
+// if err != nil {
+// t.Errorf("error parsing CIDRs: error %v", err)
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: "127.0.0.1:8177", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// body, r, err := get("http://127.0.0.1:8177/")
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+// assert.Equal(t, "127.0.0.1", body)
+//}
+//
+//func TestHandler_XRealIP(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// TrustedSubnets: []string{
+// "10.0.0.0/8",
+// "127.0.0.0/8",
+// "172.16.0.0/12",
+// "192.168.0.0/16",
+// "::1/128",
+// "fc00::/7",
+// "fe80::/10",
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php ip pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// err := h.cfg.parseCIDRs()
+// if err != nil {
+// t.Errorf("error parsing CIDRs: error %v", err)
+// }
+//
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: "127.0.0.1:8177", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// body, r, err := getHeader("http://127.0.0.1:8177/", map[string]string{
+// "X-Real-Ip": "200.0.0.1",
+// })
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+// assert.Equal(t, "200.0.0.1", body)
+//}
+//
+//func TestHandler_XForwardedFor(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// TrustedSubnets: []string{
+// "10.0.0.0/8",
+// "127.0.0.0/8",
+// "172.16.0.0/12",
+// "192.168.0.0/16",
+// "100.0.0.0/16",
+// "200.0.0.0/16",
+// "::1/128",
+// "fc00::/7",
+// "fe80::/10",
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php ip pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// err := h.cfg.parseCIDRs()
+// if err != nil {
+// t.Errorf("error parsing CIDRs: error %v", err)
+// }
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: "127.0.0.1:8177", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// body, r, err := getHeader("http://127.0.0.1:8177/", map[string]string{
+// "X-Forwarded-For": "100.0.0.1, 200.0.0.1, invalid, 101.0.0.1",
+// })
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+// assert.Equal(t, "101.0.0.1", body)
+//
+// body, r, err = getHeader("http://127.0.0.1:8177/", map[string]string{
+// "X-Forwarded-For": "100.0.0.1, 200.0.0.1, 101.0.0.1, invalid",
+// })
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+// assert.Equal(t, "101.0.0.1", body)
+//}
+//
+//func TestHandler_XForwardedFor_NotTrustedRemoteIp(t *testing.T) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// TrustedSubnets: []string{
+// "10.0.0.0/8",
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php ip pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: 1,
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// err := h.cfg.parseCIDRs()
+// if err != nil {
+// t.Errorf("error parsing CIDRs: error %v", err)
+// }
+// assert.NoError(t, h.rr.Start())
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: "127.0.0.1:8177", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// t.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// t.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// body, r, err := getHeader("http://127.0.0.1:8177/", map[string]string{
+// "X-Forwarded-For": "100.0.0.1, 200.0.0.1, invalid, 101.0.0.1",
+// })
+//
+// assert.NoError(t, err)
+// assert.Equal(t, 200, r.StatusCode)
+// assert.Equal(t, "127.0.0.1", body)
+//}
+//
+//func BenchmarkHandler_Listen_Echo(b *testing.B) {
+// h := &Handler{
+// cfg: &Config{
+// MaxRequestSize: 1024,
+// Uploads: &UploadsConfig{
+// Dir: os.TempDir(),
+// Forbid: []string{},
+// },
+// },
+// rr: roadrunner.NewServer(&roadrunner.ServerConfig{
+// Command: "php ../../tests/http/client.php echo pipes",
+// Relay: "pipes",
+// Pool: &roadrunner.Config{
+// NumWorkers: int64(runtime.NumCPU()),
+// AllocateTimeout: 10000000,
+// DestroyTimeout: 10000000,
+// },
+// }),
+// }
+//
+// err := h.rr.Start()
+// if err != nil {
+// b.Errorf("error starting the worker pool: error %v", err)
+// }
+// defer h.rr.Stop()
+//
+// hs := &http.Server{Addr: ":8177", Handler: h}
+// defer func() {
+// err := hs.Shutdown(context.Background())
+// if err != nil {
+// b.Errorf("error during the shutdown: error %v", err)
+// }
+// }()
+//
+// go func() {
+// err := hs.ListenAndServe()
+// if err != nil && err != http.ErrServerClosed {
+// b.Errorf("error listening the interface: error %v", err)
+// }
+// }()
+// time.Sleep(time.Millisecond * 10)
+//
+// bb := "WORLD"
+// for n := 0; n < b.N; n++ {
+// r, err := http.Get("http://localhost:8177/?hello=world")
+// if err != nil {
+// b.Fail()
+// }
+// // Response might be nil here
+// if r != nil {
+// br, err := ioutil.ReadAll(r.Body)
+// if err != nil {
+// b.Errorf("error reading Body: error %v", err)
+// }
+// if string(br) != bb {
+// b.Fail()
+// }
+// err = r.Body.Close()
+// if err != nil {
+// b.Errorf("error closing the Body: error %v", err)
+// }
+// } else {
+// b.Errorf("got nil response")
+// }
+// }
+//}
diff --git a/plugins/http/service.go b/plugins/http/plugin.go
index 25a10064..7c46c814 100644
--- a/plugins/http/service.go
+++ b/plugins/http/plugin.go
@@ -13,12 +13,9 @@ import (
"strings"
"sync"
- "github.com/sirupsen/logrus"
- "github.com/spiral/roadrunner"
- "github.com/spiral/roadrunner/service/env"
- "github.com/spiral/roadrunner/service/http/attributes"
- "github.com/spiral/roadrunner/service/rpc"
- "github.com/spiral/roadrunner/util"
+ "github.com/spiral/roadrunner/v2/interfaces/log"
+ "github.com/spiral/roadrunner/v2/plugins/config"
+ "github.com/spiral/roadrunner/v2/plugins/rpc"
"golang.org/x/net/http2"
"golang.org/x/net/http2/h2c"
"golang.org/x/sys/cpu"
@@ -80,20 +77,19 @@ func (s *Service) AddListener(l func(event int, ctx interface{})) {
// Init must return configure svc and return true if svc hasStatus enabled. Must return error in case of
// misconfiguration. Services must not be used without proper configuration pushed first.
-func (s *Service) Init(cfg *Config, r *rpc.Service, e env.Environment, log *logrus.Logger) (bool, error) {
+func (s *Service) Init(cfg config.Configurer, r rpc.Plugin, log log.Logger) (bool, error) {
s.cfg = cfg
s.log = log
- s.env = e
- if r != nil {
- if err := r.Register(ID, &rpcServer{s}); err != nil {
- return false, err
- }
- }
-
- if !cfg.EnableHTTP() && !cfg.EnableTLS() && !cfg.EnableFCGI() {
- return false, nil
- }
+ //if r != nil {
+ // if err := r.Register(ID, &rpcServer{s}); err != nil {
+ // return false, err
+ // }
+ //}
+ //
+ //if !cfg.EnableHTTP() && !cfg.EnableTLS() && !cfg.EnableFCGI() {
+ // return false, nil
+ //}
return true, nil
}
diff --git a/plugins/http/service_test.go b/plugins/http/plugin_test.go
index f7ee33cc..f7ee33cc 100644
--- a/plugins/http/service_test.go
+++ b/plugins/http/plugin_test.go
diff --git a/plugins/http/request.go b/plugins/http/request.go
index 8da5440f..b3123eb2 100644
--- a/plugins/http/request.go
+++ b/plugins/http/request.go
@@ -9,9 +9,7 @@ import (
"strings"
json "github.com/json-iterator/go"
- "github.com/sirupsen/logrus"
- "github.com/spiral/roadrunner"
- "github.com/spiral/roadrunner/service/http/attributes"
+ "github.com/spiral/roadrunner/v2/interfaces/log"
)
const (
@@ -114,7 +112,7 @@ func NewRequest(r *http.Request, cfg *UploadsConfig) (req *Request, err error) {
}
// Open moves all uploaded files to temporary directory so it can be given to php later.
-func (r *Request) Open(log *logrus.Logger) {
+func (r *Request) Open(log log.Logger) {
if r.Uploads == nil {
return
}
diff --git a/plugins/http/uploads.go b/plugins/http/uploads.go
index 39a9eaf2..99427b69 100644
--- a/plugins/http/uploads.go
+++ b/plugins/http/uploads.go
@@ -2,8 +2,10 @@ package http
import (
"fmt"
+
json "github.com/json-iterator/go"
- "github.com/sirupsen/logrus"
+ "github.com/spiral/roadrunner/v2/interfaces/log"
+
"io"
"io/ioutil"
"mime/multipart"
@@ -48,7 +50,7 @@ func (u *Uploads) MarshalJSON() ([]byte, error) {
// Open moves all uploaded files to temp directory, return error in case of issue with temp directory. File errors
// will be handled individually.
-func (u *Uploads) Open(log *logrus.Logger) {
+func (u *Uploads) Open(log log.Logger) {
var wg sync.WaitGroup
for _, f := range u.list {
wg.Add(1)
diff --git a/plugins/http/uploads_test.go b/plugins/http/uploads_test.go
index 08177c72..16365f39 100644
--- a/plugins/http/uploads_test.go
+++ b/plugins/http/uploads_test.go
@@ -6,9 +6,6 @@ import (
"crypto/md5"
"encoding/hex"
"fmt"
- json "github.com/json-iterator/go"
- "github.com/spiral/roadrunner"
- "github.com/stretchr/testify/assert"
"io"
"io/ioutil"
"mime/multipart"
@@ -16,6 +13,9 @@ import (
"os"
"testing"
"time"
+
+ json "github.com/json-iterator/go"
+ "github.com/stretchr/testify/assert"
)
func TestHandler_Upload_File(t *testing.T) {