Blame view

http_utility.go 4.26 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
29
30
31
32
33
34
35
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
  }
  
  // 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")
  }
  
  // 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
88
89
90
  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...
91
  	templateHttpErr400_EN = "Bad request."
d66628295   Marko Tikvić   cleaned up
92
  	templateHttpErr400_RS = "Neispravan zahtev."
6620591d8   Marko Tikvić   moved DeliverPayl...
93
  	templateHttpErr404_EN = "Resource not found."
9933169c8   Marko Tikvić   localization support
94
  	templateHttpErr404_RS = "Resurs nije pronadjen."
d66628295   Marko Tikvić   cleaned up
95
96
97
  	templateHttpErr401_EN = "Unauthorized request."
  	templateHttpErr401_RS = "Neautorizovan zahtev."
  )
64041a2ea   Marko Tikvić   first commit
98

33fd58161   markotikvic   minor changes, sh...
99
  type httpError struct {
64041a2ea   Marko Tikvić   first commit
100
101
102
103
104
105
106
107
  	Error   []HttpErrorDesc `json:"error"`
  	Request string          `json:"request"`
  }
  
  type HttpErrorDesc struct {
  	Lang string `json:"lang"`
  	Desc string `json:"description"`
  }
6620591d8   Marko Tikvić   moved DeliverPayl...
108
109
110
111
112
113
114
  // 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
115
  // ErrorResponse writes HTTP error to w.
33fd58161   markotikvic   minor changes, sh...
116
  func ErrorResponse(w http.ResponseWriter, r *http.Request, code int, desc []HttpErrorDesc) {
2d79a4120   Marko Tikvić   Responses contain...
117
  	err := httpError{desc, r.Method + " " + r.RequestURI}
64041a2ea   Marko Tikvić   first commit
118
119
120
  	w.WriteHeader(code)
  	json.NewEncoder(w).Encode(err)
  }
6620591d8   Marko Tikvić   moved DeliverPayl...
121
122
123
124
125
126
127
  // 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
128
  // BadRequestResponse writes HTTP error 400 to w.
33fd58161   markotikvic   minor changes, sh...
129
130
  func BadRequestResponse(w http.ResponseWriter, req *http.Request) {
  	ErrorResponse(w, req, http.StatusBadRequest, []HttpErrorDesc{
d2ddf82ef   Marko Tikvić   started on new rbac
131
132
  		{"en", templateHttpErr400_EN},
  		{"rs", templateHttpErr400_RS},
25e001550   Marko Tikvić   exported everything
133
  	})
64041a2ea   Marko Tikvić   first commit
134
  }
e1fbb41f9   Marko Tikvić   added comments
135
  // InternalSeverErrorResponse writes HTTP error 500 to w.
33fd58161   markotikvic   minor changes, sh...
136
137
  func InternalServerErrorResponse(w http.ResponseWriter, req *http.Request) {
  	ErrorResponse(w, req, http.StatusInternalServerError, []HttpErrorDesc{
d2ddf82ef   Marko Tikvić   started on new rbac
138
139
  		{"en", templateHttpErr500_EN},
  		{"rs", templateHttpErr500_RS},
25e001550   Marko Tikvić   exported everything
140
  	})
64041a2ea   Marko Tikvić   first commit
141
  }
e1fbb41f9   Marko Tikvić   added comments
142
  // UnauthorizedError writes HTTP error 401 to w.
33fd58161   markotikvic   minor changes, sh...
143
  func UnauthorizedResponse(w http.ResponseWriter, req *http.Request) {
bc3671b26   Marko Tikvić   refactoring token...
144
  	w.Header().Set("WWW-Authenticate", "Bearer")
33fd58161   markotikvic   minor changes, sh...
145
  	ErrorResponse(w, req, http.StatusUnauthorized, []HttpErrorDesc{
d2ddf82ef   Marko Tikvić   started on new rbac
146
147
  		{"en", templateHttpErr401_EN},
  		{"rs", templateHttpErr401_RS},
33fd58161   markotikvic   minor changes, sh...
148
149
  	})
  }