diff --git a/context/input.go b/context/input.go index f535e6a2..24d43bbb 100644 --- a/context/input.go +++ b/context/input.go @@ -21,12 +21,21 @@ import ( "net/http" "net/url" "reflect" + "regexp" "strconv" "strings" "github.com/astaxie/beego/session" ) +// Regexes for checking the accept headers +// TODO make sure these are correct +var ( + acceptsHtmlRegex = regexp.MustCompile(`(text/html|application/xhtml\+xml)(?:,|$)`) + acceptsXmlRegex = regexp.MustCompile(`(application/xml|text/xml)(?:,|$)`) + acceptsJsonRegex = regexp.MustCompile(`(application/json)(?:,|$)`) +) + // BeegoInput operates the http request header, data, cookie and body. // it also contains router params and current session. type BeegoInput struct { @@ -163,6 +172,21 @@ func (input *BeegoInput) IsUpload() bool { return strings.Contains(input.Header("Content-Type"), "multipart/form-data") } +// Checks if request accepts html response +func (input *BeegoInput) AcceptsHtml() bool { + return acceptsHtmlRegex.MatchString(input.Header("Accept")) +} + +// Checks if request accepts xml response +func (input *BeegoInput) AcceptsXml() bool { + return acceptsXmlRegex.MatchString(input.Header("Accept")) +} + +// Checks if request accepts json response +func (input *BeegoInput) AcceptsJson() bool { + return acceptsJsonRegex.MatchString(input.Header("Accept")) +} + // IP returns request client ip. // if in proxy, return first proxy id. // if error, return 127.0.0.1.