Predefined packages and variables
A Go Server Page has available to it one package and a few variables that do not need to be declared explicitly. These are described below.
To avoid introducing name conflicts with future versions of Go Server Pages it is recommended that you not declare your own variables, functions, types, etc. with names beginning with either Gosp
or gosp
.
Packages
The gosp
package is automatically imported. It defines a few functions intended for internal use by the Go code generated from a Go Server Page and a few values that can be of use to the user-written Go code appearing on a Go Server Page.
The most useful declaration is gosp.RequestData
, a struct
type that encapsulates Web-server information passed to a Go Server Page. Note that many of its fields come from the client. Those should therefore not be used without first checking them for invalid or malicious content.
type RequestData struct {
Scheme string // HTTP scheme ("http" or "https")
LocalHostname string // Name of the local host
Port int // Port number to which the request was issued
URI string // Path portion of the URI
PathInfo string // Additional text following the Gosp filename
QueryArgs string // Query arguments from the request
URL string // Complete URL requested
Method string // Request method ("GET", "POST", etc.)
RequestLine string // First line of the request (e.g., "GET / HTTP/1.1")
RequestTime int64 // Request time in nanoseconds since the Unix epoch
RemoteHostname string // Name of the remote host
RemoteIP string // IP address of the remote host
Filename string // Local filename of the Gosp page
PostData map[string]string // {Key, value} pairs sent by a POST request
GetData map[string]string // {Key, value} pairs sent by a GET request (parsed version of QueryArgs)
HeaderData map[string]string // Request headers as {key, value} pairs
AdminEmail string // Email address of the Web server administrator
Environment map[string]string // Environment variables passed in from the server
}
The gosp
package makes available four functions that can be used to pass metadata back to the Web server:
func SetHTTPStatus(m Metadata, s int)
func SetMIMEType(m Metadata, mt string)
func SetHeaderField(m Metadata, k, v string, repl bool)
func LogDebugMessage(m Metadata, s string)
Always pass the variable gospMeta
(see Variables below) as the first argument to each of these four functions.
gosp.SetHTTPStatus
indicates the HTTP status code the Web server should return to the client. The status code defaults to 200 (“OK”) but can be set to any of the codes defined in the HTTP Status Code Registry. If the Go Server Page is allowed to import "net/http"
(not a particularly good idea from a security perspective) it can use any of the Status
constants defined by net/http
instead of specifying a status code numerically. Calling gosp.SetHTTPStatus
repeatedly is allowed. Only the final value takes effect.
gosp.SetMIMEType
specifies the document’s MIME type, which defaults to text/html
. A Go Server Page can change its MIME type with gosp.SetMIMEType
then return data of that type. For example, it can specify text/plain
and return plain text or image/png
and return a binary PNG image. Calling gosp.SetMIMEType
repeatedly is allowed. Only the final value takes effect.
gosp.SetHeaderField
provides a very general capability. It enables a Go Server Page to send arbitrary HTTP response header fields back to the client. The arguments are the field name, the value to assign to that field, and a Boolean that indicates whether the value should replace the prior value associated with the field (true
) as opposed to being appended to the prior value (false
). Some uses of gosp.SetHeaderField
include transmitting cookies to the client and setting caching properties for the page. Calling gosp.SetHeaderField
repeatedly is allowed.
gosp.LogDebugMessage
asks the Web server to write a debug-level message to its log file (typically error.log
). Apache must be configured with LogLevel debug
for this to work. See also Debugging tips.
Other useful exports from the gosp
package include gosp.Fprintf
, gosp.Writer
, and gosp.Open
. gosp.Fprintf
is exactly the same as fmt.Fprintf
but does not require importing the fmt
package. (As mentioned in Configuring Go Server Pages, package imports other than gosp
are forbidden unless explicitly allowed by the Web administrator.) Similarly, gosp.Writer
wraps io.Writer
without requiring that a page import the io
package. gosp.Open
behaves similarly to os.Open
. However, only files that lie in the same directory or a subdirectory of the Go Server Page that invokes gosp.Open
can be opened. A file can be checked explicitly for this property with the gosp.LiesInOrBelow
function.
See the gosp
package documentation for documentation of the complete set of exported symbols.
Variables
Three variables that are available within all ?go:block
and ?go:expr
markup are gospReq
, gospOut
, and gospMeta
. gospReq
is of type *gosp.RequestData
(presented above) and encapsulates a large set of data provided by the Web server in response to a client request. Many of the fields correspond to parts of the URL provided by the client and should therefore be sanitized before use in any sensitive operation. gospOut
is a gosp.Writer
that represents the contents of the Go Server Page. Writing to gospOut
(e.g., with gosp.Fprintf(gospOut, …)
) injects text into the page right where the ?go:block
or ?go:expr
appeared. gospMeta
, of type gosp.Metadata
, should be treated as an opaque value that is used only as the first argument to gosp.SetHTTPStatus
, gosp.SetMIMEType
, and gosp.SetHeaderField
.
Functions defined by ?go:top
markup do not have access to gospReq
, gospOut
, or gospMeta
. These must be passed in as parameters if needed.