Blame view

http_utility.go 4.39 KB
ea858b8a7   Marko Tikvić   refactoring
1
  package webutility
64041a2ea   Marko Tikvić   first commit
2
3
  
  import (
64041a2ea   Marko Tikvić   first commit
4
  	"encoding/json"
d2ddf82ef   Marko Tikvić   started on new rbac
5
  	"net/http"
64041a2ea   Marko Tikvić   first commit
6
  )
9933169c8   Marko Tikvić   localization support
7
8
9
10
11
12
13
14
15
16
17
  type webError struct {
  	Request string `json:"request"`
  	Error   string `json:"error"`
  }
  
  // NotFoundHandler writes HTTP error 404 to w.
  func NotFoundHandler(w http.ResponseWriter, req *http.Request) {
  	SetDefaultHeaders(w)
  	if req.Method == "OPTIONS" {
  		return
  	}
f84e7607d   Marko Tikvić   added dictionary;...
18
  	NotFound(w, req, "Not found")
9933169c8   Marko Tikvić   localization support
19
20
21
22
23
24
25
26
27
28
  }
  
  // SetDefaultHeaders set's default headers for an HTTP response.
  func SetDefaultHeaders(w http.ResponseWriter) {
  	w.Header().Set("Access-Control-Allow-Origin", "*")
  	w.Header().Set("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS")
  	w.Header().Set("Access-Control-Allow-Headers", `Accept, Content-Type,
  		Content-Length, Accept-Encoding, X-CSRF-Token, Authorization`)
  	w.Header().Set("Content-Type", "application/json; charset=utf-8")
  }
a205e8f40   Marko Tikvić   changes
29
30
31
32
33
34
35
  func ReqLocale(req *http.Request, dflt string) string {
  	loc := req.FormValue("locale")
  	if loc == "" {
  		return dflt
  	}
  	return loc
  }
9933169c8   Marko Tikvić   localization support
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
  // 2xx
  func Success(w http.ResponseWriter, payload *Payload, code int) {
  	w.WriteHeader(code)
  	if payload != nil {
  		json.NewEncoder(w).Encode(*payload)
  	}
  }
  
  // 200
  func OK(w http.ResponseWriter, payload *Payload) {
  	Success(w, payload, http.StatusOK)
  }
  
  // 201
  func Created(w http.ResponseWriter, payload *Payload) {
  	Success(w, payload, http.StatusCreated)
  }
  
  // 4xx; 5xx
  func Error(w http.ResponseWriter, r *http.Request, code int, err string) {
  	werr := webError{Error: err, Request: r.Method + " " + r.RequestURI}
  	w.WriteHeader(code)
  	json.NewEncoder(w).Encode(werr)
  }
  
  // 400
  func BadRequest(w http.ResponseWriter, r *http.Request, err string) {
  	Error(w, r, http.StatusBadRequest, err)
  }
  
  // 404
  func NotFound(w http.ResponseWriter, r *http.Request, err string) {
  	Error(w, r, http.StatusNotFound, err)
  }
  
  // 401
  func Unauthorized(w http.ResponseWriter, r *http.Request, err string) {
  	Error(w, r, http.StatusUnauthorized, err)
  }
  
  // 403
  func Forbidden(w http.ResponseWriter, r *http.Request, err string) {
  	Error(w, r, http.StatusForbidden, err)
  }
  
  // 403
  func Conflict(w http.ResponseWriter, r *http.Request, err string) {
  	Error(w, r, http.StatusConflict, err)
  }
  
  // 500
  func InternalServerError(w http.ResponseWriter, r *http.Request, err string) {
  	Error(w, r, http.StatusInternalServerError, err)
  }
  
  ///
  /// Old API
  ///
d66628295   Marko Tikvić   cleaned up
94
95
96
  const (
  	templateHttpErr500_EN = "An internal server error has occurred."
  	templateHttpErr500_RS = "Došlo je do greške na serveru."
2ea67927f   Marko Tikvić   added support for...
97
  	templateHttpErr400_EN = "Bad request."
d66628295   Marko Tikvić   cleaned up
98
  	templateHttpErr400_RS = "Neispravan zahtev."
6620591d8   Marko Tikvić   moved DeliverPayl...
99
  	templateHttpErr404_EN = "Resource not found."
9933169c8   Marko Tikvić   localization support
100
  	templateHttpErr404_RS = "Resurs nije pronadjen."
d66628295   Marko Tikvić   cleaned up
101
102
103
  	templateHttpErr401_EN = "Unauthorized request."
  	templateHttpErr401_RS = "Neautorizovan zahtev."
  )
64041a2ea   Marko Tikvić   first commit
104

33fd58161   markotikvic   minor changes, sh...
105
  type httpError struct {
64041a2ea   Marko Tikvić   first commit
106
107
108
109
110
111
112
113
  	Error   []HttpErrorDesc `json:"error"`
  	Request string          `json:"request"`
  }
  
  type HttpErrorDesc struct {
  	Lang string `json:"lang"`
  	Desc string `json:"description"`
  }
6620591d8   Marko Tikvić   moved DeliverPayl...
114
115
116
117
118
119
120
  // DeliverPayload encodes payload as JSON to w.
  func DeliverPayload(w http.ResponseWriter, payload Payload) {
  	// Don't write status OK in the headers here. Leave it up for the caller.
  	// E.g. Status 201.
  	json.NewEncoder(w).Encode(payload)
  	payload.Data = nil
  }
e1fbb41f9   Marko Tikvić   added comments
121
  // ErrorResponse writes HTTP error to w.
33fd58161   markotikvic   minor changes, sh...
122
  func ErrorResponse(w http.ResponseWriter, r *http.Request, code int, desc []HttpErrorDesc) {
2d79a4120   Marko Tikvić   Responses contain...
123
  	err := httpError{desc, r.Method + " " + r.RequestURI}
64041a2ea   Marko Tikvić   first commit
124
125
126
  	w.WriteHeader(code)
  	json.NewEncoder(w).Encode(err)
  }
6620591d8   Marko Tikvić   moved DeliverPayl...
127
128
129
130
131
132
133
  // NotFoundResponse writes HTTP error 404 to w.
  func NotFoundResponse(w http.ResponseWriter, req *http.Request) {
  	ErrorResponse(w, req, http.StatusNotFound, []HttpErrorDesc{
  		{"en", templateHttpErr404_EN},
  		{"rs", templateHttpErr404_RS},
  	})
  }
e1fbb41f9   Marko Tikvić   added comments
134
  // BadRequestResponse writes HTTP error 400 to w.
33fd58161   markotikvic   minor changes, sh...
135
136
  func BadRequestResponse(w http.ResponseWriter, req *http.Request) {
  	ErrorResponse(w, req, http.StatusBadRequest, []HttpErrorDesc{
d2ddf82ef   Marko Tikvić   started on new rbac
137
138
  		{"en", templateHttpErr400_EN},
  		{"rs", templateHttpErr400_RS},
25e001550   Marko Tikvić   exported everything
139
  	})
64041a2ea   Marko Tikvić   first commit
140
  }
e1fbb41f9   Marko Tikvić   added comments
141
  // InternalSeverErrorResponse writes HTTP error 500 to w.
33fd58161   markotikvic   minor changes, sh...
142
143
  func InternalServerErrorResponse(w http.ResponseWriter, req *http.Request) {
  	ErrorResponse(w, req, http.StatusInternalServerError, []HttpErrorDesc{
d2ddf82ef   Marko Tikvić   started on new rbac
144
145
  		{"en", templateHttpErr500_EN},
  		{"rs", templateHttpErr500_RS},
25e001550   Marko Tikvić   exported everything
146
  	})
64041a2ea   Marko Tikvić   first commit
147
  }
e1fbb41f9   Marko Tikvić   added comments
148
  // UnauthorizedError writes HTTP error 401 to w.
33fd58161   markotikvic   minor changes, sh...
149
  func UnauthorizedResponse(w http.ResponseWriter, req *http.Request) {
bc3671b26   Marko Tikvić   refactoring token...
150
  	w.Header().Set("WWW-Authenticate", "Bearer")
33fd58161   markotikvic   minor changes, sh...
151
  	ErrorResponse(w, req, http.StatusUnauthorized, []HttpErrorDesc{
d2ddf82ef   Marko Tikvić   started on new rbac
152
153
  		{"en", templateHttpErr401_EN},
  		{"rs", templateHttpErr401_RS},
33fd58161   markotikvic   minor changes, sh...
154
155
  	})
  }