123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- package restful
- import (
- "compress/zlib"
- "net/http"
- )
- var defaultRequestContentType string
- type Request struct {
- Request *http.Request
- pathParameters map[string]string
- attributes map[string]interface{}
- selectedRoutePath string
- }
- func NewRequest(httpRequest *http.Request) *Request {
- return &Request{
- Request: httpRequest,
- pathParameters: map[string]string{},
- attributes: map[string]interface{}{},
- }
- }
- func DefaultRequestContentType(mime string) {
- defaultRequestContentType = mime
- }
- func (r *Request) PathParameter(name string) string {
- return r.pathParameters[name]
- }
- func (r *Request) PathParameters() map[string]string {
- return r.pathParameters
- }
- func (r *Request) QueryParameter(name string) string {
- return r.Request.FormValue(name)
- }
- func (r *Request) BodyParameter(name string) (string, error) {
- err := r.Request.ParseForm()
- if err != nil {
- return "", err
- }
- return r.Request.PostFormValue(name), nil
- }
- func (r *Request) HeaderParameter(name string) string {
- return r.Request.Header.Get(name)
- }
- func (r *Request) ReadEntity(entityPointer interface{}) (err error) {
- contentType := r.Request.Header.Get(HEADER_ContentType)
- contentEncoding := r.Request.Header.Get(HEADER_ContentEncoding)
-
- if ENCODING_GZIP == contentEncoding {
- gzipReader := currentCompressorProvider.AcquireGzipReader()
- defer currentCompressorProvider.ReleaseGzipReader(gzipReader)
- gzipReader.Reset(r.Request.Body)
- r.Request.Body = gzipReader
- } else if ENCODING_DEFLATE == contentEncoding {
- zlibReader, err := zlib.NewReader(r.Request.Body)
- if err != nil {
- return err
- }
- r.Request.Body = zlibReader
- }
-
- entityReader, ok := entityAccessRegistry.accessorAt(contentType)
- if !ok {
- if len(defaultRequestContentType) != 0 {
- entityReader, ok = entityAccessRegistry.accessorAt(defaultRequestContentType)
- }
- if !ok {
- return NewError(http.StatusBadRequest, "Unable to unmarshal content of type:"+contentType)
- }
- }
- return entityReader.Read(r, entityPointer)
- }
- func (r *Request) SetAttribute(name string, value interface{}) {
- r.attributes[name] = value
- }
- func (r Request) Attribute(name string) interface{} {
- return r.attributes[name]
- }
- func (r Request) SelectedRoutePath() string {
- return r.selectedRoutePath
- }
|