diff options
author | Max Romanov <max.romanov@nginx.com> | 2017-06-23 19:20:08 +0300 |
---|---|---|
committer | Max Romanov <max.romanov@nginx.com> | 2017-06-23 19:20:08 +0300 |
commit | 4a1b59c27a8e85fc3b03c420fbc1642ce52e96cf (patch) | |
tree | c72ab253541c53dd918afc86973192416078fceb /src/nginext/response.go | |
parent | 5a43bd0bfd1eaa60dede7beb3206a53e8d008fa4 (diff) | |
download | unit-4a1b59c27a8e85fc3b03c420fbc1642ce52e96cf.tar.gz unit-4a1b59c27a8e85fc3b03c420fbc1642ce52e96cf.tar.bz2 |
External Go app request processing.
Diffstat (limited to '')
-rw-r--r-- | src/nginext/response.go | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/nginext/response.go b/src/nginext/response.go new file mode 100644 index 00000000..dc864f6e --- /dev/null +++ b/src/nginext/response.go @@ -0,0 +1,69 @@ +/* + * Copyright (C) Max Romanov + * Copyright (C) NGINX, Inc. + */ + +package nginext + +/* +#include "nxt_go_lib.h" +*/ +import "C" + +import ( + "fmt" + "net/http" + "os" +) + +type response struct { + header http.Header + headerSent bool + req *http.Request + c_req C.nxt_go_request_t +} + +func new_response(c_req C.nxt_go_request_t, req *http.Request) *response { + resp := &response{ + header: http.Header{}, + req: req, + c_req: c_req, + } + + return resp +} + +func (r *response) Header() http.Header { + return r.header +} + +func (r *response) Write(p []byte) (n int, err error) { + if !r.headerSent { + r.WriteHeader(http.StatusOK) + } + + l := C.size_t(len(p)) + b := getCBytes(p) + res := C.nxt_go_response_write(r.c_req, b, l) + C.free(b) + return int(res), nil +} + +func (r *response) WriteHeader(code int) { + if r.headerSent { + // Note: explicitly using Stderr, as Stdout is our HTTP output. + fmt.Fprintf(os.Stderr, "CGI attempted to write header twice") + return + } + r.headerSent = true + fmt.Fprintf(r, "%s %d %s\r\n", r.req.Proto, code, http.StatusText(code)) + + // Set a default Content-Type + if _, hasType := r.header["Content-Type"]; !hasType { + r.header.Add("Content-Type", "text/html; charset=utf-8") + } + + r.header.Write(r) + + r.Write([]byte("\r\n")) +} |