-
-
Notifications
You must be signed in to change notification settings - Fork 413
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #421 from spiral/plugin/headers
[RR2] Headers plugin
- Loading branch information
Showing
21 changed files
with
711 additions
and
61 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
coverage: | ||
status: | ||
project: off | ||
patch: off | ||
project: true | ||
patch: false |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
package headers | ||
|
||
// Config declares headers service configuration. | ||
type Config struct { | ||
Headers struct { | ||
// CORS settings. | ||
CORS *CORSConfig | ||
|
||
// Request headers to add to every payload send to PHP. | ||
Request map[string]string | ||
|
||
// Response headers to add to every payload generated by PHP. | ||
Response map[string]string | ||
} | ||
} | ||
|
||
// CORSConfig headers configuration. | ||
type CORSConfig struct { | ||
// AllowedOrigin: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin | ||
AllowedOrigin string | ||
|
||
// AllowedHeaders: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers | ||
AllowedHeaders string | ||
|
||
// AllowedMethods: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods | ||
AllowedMethods string | ||
|
||
// AllowCredentials https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials | ||
AllowCredentials *bool | ||
|
||
// ExposeHeaders: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers | ||
ExposedHeaders string | ||
|
||
// MaxAge of CORS headers in seconds/ | ||
MaxAge int | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
package headers | ||
|
||
import ( | ||
"net/http" | ||
"strconv" | ||
|
||
"github.com/spiral/errors" | ||
"github.com/spiral/roadrunner/v2/plugins/config" | ||
) | ||
|
||
// ID contains default service name. | ||
const PluginName = "headers" | ||
const RootPluginName = "http" | ||
|
||
// Service serves headers files. Potentially convert into middleware? | ||
type Plugin struct { | ||
// server configuration (location, forbidden files and etc) | ||
cfg *Config | ||
} | ||
|
||
// Init must return configure service and return true if service hasStatus enabled. Must return error in case of | ||
// misconfiguration. Services must not be used without proper configuration pushed first. | ||
func (s *Plugin) Init(cfg config.Configurer) error { | ||
const op = errors.Op("headers plugin init") | ||
err := cfg.UnmarshalKey(RootPluginName, &s.cfg) | ||
if err != nil { | ||
return errors.E(op, errors.Disabled, err) | ||
} | ||
|
||
return nil | ||
} | ||
|
||
// middleware must return true if request/response pair is handled within the middleware. | ||
func (s *Plugin) Middleware(next http.Handler) http.HandlerFunc { | ||
// Define the http.HandlerFunc | ||
return func(w http.ResponseWriter, r *http.Request) { | ||
if s.cfg.Headers.Request != nil { | ||
for k, v := range s.cfg.Headers.Request { | ||
r.Header.Add(k, v) | ||
} | ||
} | ||
|
||
if s.cfg.Headers.Response != nil { | ||
for k, v := range s.cfg.Headers.Response { | ||
w.Header().Set(k, v) | ||
} | ||
} | ||
|
||
if s.cfg.Headers.CORS != nil { | ||
if r.Method == http.MethodOptions { | ||
s.preflightRequest(w) | ||
return | ||
} | ||
s.corsHeaders(w) | ||
} | ||
|
||
next.ServeHTTP(w, r) | ||
} | ||
} | ||
|
||
func (s *Plugin) Name() string { | ||
return PluginName | ||
} | ||
|
||
// configure OPTIONS response | ||
func (s *Plugin) preflightRequest(w http.ResponseWriter) { | ||
headers := w.Header() | ||
|
||
headers.Add("Vary", "Origin") | ||
headers.Add("Vary", "Access-Control-Request-Method") | ||
headers.Add("Vary", "Access-Control-Request-Headers") | ||
|
||
if s.cfg.Headers.CORS.AllowedOrigin != "" { | ||
headers.Set("Access-Control-Allow-Origin", s.cfg.Headers.CORS.AllowedOrigin) | ||
} | ||
|
||
if s.cfg.Headers.CORS.AllowedHeaders != "" { | ||
headers.Set("Access-Control-Allow-Headers", s.cfg.Headers.CORS.AllowedHeaders) | ||
} | ||
|
||
if s.cfg.Headers.CORS.AllowedMethods != "" { | ||
headers.Set("Access-Control-Allow-Methods", s.cfg.Headers.CORS.AllowedMethods) | ||
} | ||
|
||
if s.cfg.Headers.CORS.AllowCredentials != nil { | ||
headers.Set("Access-Control-Allow-Credentials", strconv.FormatBool(*s.cfg.Headers.CORS.AllowCredentials)) | ||
} | ||
|
||
if s.cfg.Headers.CORS.MaxAge > 0 { | ||
headers.Set("Access-Control-Max-Age", strconv.Itoa(s.cfg.Headers.CORS.MaxAge)) | ||
} | ||
|
||
w.WriteHeader(http.StatusOK) | ||
} | ||
|
||
// configure CORS headers | ||
func (s *Plugin) corsHeaders(w http.ResponseWriter) { | ||
headers := w.Header() | ||
|
||
headers.Add("Vary", "Origin") | ||
|
||
if s.cfg.Headers.CORS.AllowedOrigin != "" { | ||
headers.Set("Access-Control-Allow-Origin", s.cfg.Headers.CORS.AllowedOrigin) | ||
} | ||
|
||
if s.cfg.Headers.CORS.AllowedHeaders != "" { | ||
headers.Set("Access-Control-Allow-Headers", s.cfg.Headers.CORS.AllowedHeaders) | ||
} | ||
|
||
if s.cfg.Headers.CORS.ExposedHeaders != "" { | ||
headers.Set("Access-Control-Expose-Headers", s.cfg.Headers.CORS.ExposedHeaders) | ||
} | ||
|
||
if s.cfg.Headers.CORS.AllowCredentials != nil { | ||
headers.Set("Access-Control-Allow-Credentials", strconv.FormatBool(*s.cfg.Headers.CORS.AllowCredentials)) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
server: | ||
command: "php ../../../tests/http/client.php headers pipes" | ||
user: "" | ||
group: "" | ||
env: | ||
"RR_HTTP": "true" | ||
relay: "pipes" | ||
relayTimeout: "20s" | ||
|
||
http: | ||
debug: true | ||
address: 127.0.0.1:22855 | ||
maxRequestSize: 1024 | ||
middleware: [ "headers" ] | ||
uploads: | ||
forbid: [ ".php", ".exe", ".bat" ] | ||
trustedSubnets: [ "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" ] | ||
# Additional HTTP headers and CORS control. | ||
headers: | ||
cors: | ||
allowedOrigin: "*" | ||
allowedHeaders: "*" | ||
allowedMethods: "GET,POST,PUT,DELETE" | ||
allowCredentials: true | ||
exposedHeaders: "Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma" | ||
maxAge: 600 | ||
request: | ||
"input": "custom-header" | ||
response: | ||
"output": "output-header" | ||
pool: | ||
numWorkers: 2 | ||
maxJobs: 0 | ||
allocateTimeout: 60s | ||
destroyTimeout: 60s | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
server: | ||
command: "php ../../../tests/http/client.php echo pipes" | ||
user: "" | ||
group: "" | ||
env: | ||
"RR_HTTP": "true" | ||
relay: "pipes" | ||
relayTimeout: "20s" | ||
|
||
http: | ||
debug: true | ||
address: 127.0.0.1:33453 | ||
maxRequestSize: 1024 | ||
middleware: [ "headers" ] | ||
uploads: | ||
forbid: [ ".php", ".exe", ".bat" ] | ||
trustedSubnets: [ "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" ] | ||
# Additional HTTP headers and CORS control. | ||
headers: | ||
cors: | ||
allowedOrigin: "*" | ||
allowedHeaders: "*" | ||
allowedMethods: "GET,POST,PUT,DELETE" | ||
allowCredentials: true | ||
exposedHeaders: "Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma" | ||
maxAge: 600 | ||
request: | ||
"Example-Request-Header": "Value" | ||
response: | ||
"X-Powered-By": "RoadRunner" | ||
pool: | ||
numWorkers: 2 | ||
maxJobs: 0 | ||
allocateTimeout: 60s | ||
destroyTimeout: 60s | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
server: | ||
command: "php ../../../tests/http/client.php header pipes" | ||
user: "" | ||
group: "" | ||
env: | ||
"RR_HTTP": "true" | ||
relay: "pipes" | ||
relayTimeout: "20s" | ||
|
||
http: | ||
debug: true | ||
address: 127.0.0.1:22655 | ||
maxRequestSize: 1024 | ||
middleware: [ "headers" ] | ||
uploads: | ||
forbid: [ ".php", ".exe", ".bat" ] | ||
trustedSubnets: [ "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" ] | ||
# Additional HTTP headers and CORS control. | ||
headers: | ||
request: | ||
"input": "custom-header" | ||
response: | ||
"output": "output-header" | ||
pool: | ||
numWorkers: 2 | ||
maxJobs: 0 | ||
allocateTimeout: 60s | ||
destroyTimeout: 60s | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
server: | ||
command: "php ../../../tests/http/client.php header pipes" | ||
user: "" | ||
group: "" | ||
env: | ||
"RR_HTTP": "true" | ||
relay: "pipes" | ||
relayTimeout: "20s" | ||
|
||
http: | ||
debug: true | ||
address: 127.0.0.1:22455 | ||
maxRequestSize: 1024 | ||
middleware: [ "headers" ] | ||
uploads: | ||
forbid: [ ".php", ".exe", ".bat" ] | ||
trustedSubnets: [ "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" ] | ||
# Additional HTTP headers and CORS control. | ||
headers: | ||
request: | ||
"input": "custom-header" | ||
response: | ||
"output": "output-header" | ||
pool: | ||
numWorkers: 2 | ||
maxJobs: 0 | ||
allocateTimeout: 60s | ||
destroyTimeout: 60s | ||
|
||
|
Oops, something went wrong.