summaryrefslogtreecommitdiff
path: root/http/server.go
diff options
context:
space:
mode:
Diffstat (limited to 'http/server.go')
-rw-r--r--http/server.go82
1 files changed, 82 insertions, 0 deletions
diff --git a/http/server.go b/http/server.go
new file mode 100644
index 00000000..363dca2d
--- /dev/null
+++ b/http/server.go
@@ -0,0 +1,82 @@
+package http
+
+import (
+ "github.com/spiral/roadrunner"
+ "net/http"
+)
+
+// Configures RoadRunner HTTP server.
+type Config struct {
+ // serve enables static file serving from desired root directory.
+ ServeStatic bool
+
+ // Root directory, required when serve set to true.
+ Root string
+
+ // UploadsDir contains name of temporary directory to store uploaded files passed to underlying PHP process.
+ UploadsDir string
+}
+
+// Server serves http connections to underlying PHP application using PSR-7 protocol. Context will include request headers,
+// parsed files and query, payload will include parsed form dataTree (if any).
+type Server struct {
+ cfg Config
+ static *staticServer
+ rr *roadrunner.Server
+}
+
+// NewServer returns new instance of HTTP PSR7 server.
+func NewServer(cfg Config, server *roadrunner.Server) *Server {
+ h := &Server{cfg: cfg, rr: server}
+
+ if cfg.ServeStatic {
+ h.static = &staticServer{root: http.Dir(h.cfg.Root)}
+ }
+
+ return h
+}
+
+// ServeHTTP serve using PSR-7 requests passed to underlying application. Attempts to serve static files first if enabled.
+func (srv *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) () {
+ if srv.cfg.ServeStatic && srv.static.serve(w, r) {
+ return
+ }
+
+ req, err := NewRequest(r)
+ if err != nil {
+ srv.sendError(w, r, err)
+ return
+ }
+
+ if err = req.OpenUploads(srv.cfg.UploadsDir); err != nil {
+ srv.sendError(w, r, err)
+ return
+ }
+ defer req.Close()
+
+ p, err := req.Payload()
+ if err != nil {
+ srv.sendError(w, r, err)
+ return
+ }
+
+ rsp, err := srv.rr.Exec(p)
+ if err != nil {
+ srv.sendError(w, r, err)
+ return
+ }
+
+ resp, err := NewResponse(rsp)
+ if err != nil {
+ srv.sendError(w, r, err)
+ return
+ }
+
+ resp.Write(w)
+}
+
+// sendError sends error
+func (srv *Server) sendError(w http.ResponseWriter, r *http.Request, err error) {
+ w.WriteHeader(500)
+ w.Write([]byte(err.Error()))
+}