Experimenting with request state in local errors.
Move the sheet and style declarations after the initial error on the profiles. Use a global URL ID error message for the profiles. Updates #51
This commit is contained in:
parent
a465850adb
commit
e9e527e76a
|
@ -212,16 +212,32 @@ func PreErrorJSQ(errmsg string, w http.ResponseWriter, r *http.Request, isJs boo
|
||||||
|
|
||||||
// LocalError is an error shown to the end-user when something goes wrong and it's not the software's fault
|
// LocalError is an error shown to the end-user when something goes wrong and it's not the software's fault
|
||||||
// TODO: Pass header in for this and similar errors instead of having to pass in both user and w? Would also allow for more stateful things, although this could be a problem
|
// TODO: Pass header in for this and similar errors instead of having to pass in both user and w? Would also allow for more stateful things, although this could be a problem
|
||||||
func LocalError(errmsg string, w http.ResponseWriter, r *http.Request, user User) RouteError {
|
/*func LocalError(errmsg string, w http.ResponseWriter, r *http.Request, user User) RouteError {
|
||||||
w.WriteHeader(500)
|
w.WriteHeader(500)
|
||||||
pi := ErrorPage{errorHeader(w, user, phrases.GetErrorPhrase("local_error_title")), errmsg}
|
pi := ErrorPage{errorHeader(w, user, phrases.GetErrorPhrase("local_error_title")), errmsg}
|
||||||
handleErrorTemplate(w, r, pi)
|
handleErrorTemplate(w, r, pi)
|
||||||
return HandledRouteError()
|
return HandledRouteError()
|
||||||
|
}*/
|
||||||
|
|
||||||
|
func LocalError(errmsg string, w http.ResponseWriter, r *http.Request, user User) RouteError {
|
||||||
|
return SimpleError(errmsg, w, r, errorHeader(w, user, ""))
|
||||||
|
}
|
||||||
|
|
||||||
|
func SimpleError(errmsg string, w http.ResponseWriter, r *http.Request, header *Header) RouteError {
|
||||||
|
if header == nil {
|
||||||
|
header = errorHeader(w, GuestUser, phrases.GetErrorPhrase("local_error_title"))
|
||||||
|
} else {
|
||||||
|
header.Title = phrases.GetErrorPhrase("local_error_title")
|
||||||
|
}
|
||||||
|
w.WriteHeader(500)
|
||||||
|
pi := ErrorPage{header, errmsg}
|
||||||
|
handleErrorTemplate(w, r, pi)
|
||||||
|
return HandledRouteError()
|
||||||
}
|
}
|
||||||
|
|
||||||
func LocalErrorJSQ(errmsg string, w http.ResponseWriter, r *http.Request, user User, isJs bool) RouteError {
|
func LocalErrorJSQ(errmsg string, w http.ResponseWriter, r *http.Request, user User, isJs bool) RouteError {
|
||||||
if !isJs {
|
if !isJs {
|
||||||
return LocalError(errmsg, w, r, user)
|
return SimpleError(errmsg, w, r, errorHeader(w, user, ""))
|
||||||
}
|
}
|
||||||
return LocalErrorJS(errmsg, w, r)
|
return LocalErrorJS(errmsg, w, r)
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,12 +28,6 @@ func init() {
|
||||||
|
|
||||||
// TODO: Remove the View part of the name?
|
// TODO: Remove the View part of the name?
|
||||||
func ViewProfile(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header) c.RouteError {
|
func ViewProfile(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header) c.RouteError {
|
||||||
// TODO: Preload this?
|
|
||||||
header.AddSheet(header.Theme.Name + "/profile.css")
|
|
||||||
if user.Loggedin {
|
|
||||||
header.AddScriptAsync("profile_member.js")
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
var replyCreatedAt time.Time
|
var replyCreatedAt time.Time
|
||||||
var replyContent, replyCreatedByName, replyAvatar string
|
var replyContent, replyCreatedByName, replyAvatar string
|
||||||
|
@ -43,7 +37,13 @@ func ViewProfile(w http.ResponseWriter, r *http.Request, user c.User, header *c.
|
||||||
// TODO: Do a 301 if it's the wrong username? Do a canonical too?
|
// TODO: Do a 301 if it's the wrong username? Do a canonical too?
|
||||||
_, pid, err := ParseSEOURL(r.URL.Path[len("/user/"):])
|
_, pid, err := ParseSEOURL(r.URL.Path[len("/user/"):])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return c.LocalError("The provided UserID is not a valid number.", w, r, user)
|
return c.SimpleError(phrases.GetErrorPhrase("url_id_must_be_integer"),w,r,header)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Preload this?
|
||||||
|
header.AddSheet(header.Theme.Name + "/profile.css")
|
||||||
|
if user.Loggedin {
|
||||||
|
header.AddScriptAsync("profile_member.js")
|
||||||
}
|
}
|
||||||
|
|
||||||
var puser *c.User
|
var puser *c.User
|
||||||
|
|
|
@ -44,7 +44,7 @@ func ViewTopic(w http.ResponseWriter, r *http.Request, user c.User, header *c.He
|
||||||
page, _ := strconv.Atoi(r.FormValue("page"))
|
page, _ := strconv.Atoi(r.FormValue("page"))
|
||||||
_, tid, err := ParseSEOURL(urlBit)
|
_, tid, err := ParseSEOURL(urlBit)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return c.PreError(phrases.GetErrorPhrase("url_id_must_be_integer"), w, r)
|
return c.SimpleError(phrases.GetErrorPhrase("url_id_must_be_integer"),w,r,header)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the topic...
|
// Get the topic...
|
||||||
|
@ -369,26 +369,26 @@ func CreateTopicSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.Ro
|
||||||
if !strings.HasPrefix(key, "pollinputitem[") {
|
if !strings.HasPrefix(key, "pollinputitem[") {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
halves := strings.Split(key, "[")
|
halves := strings.Split(key, "[")
|
||||||
if len(halves) != 2 {
|
if len(halves) != 2 {
|
||||||
return c.LocalError("Malformed pollinputitem", w, r, user)
|
return c.LocalError("Malformed pollinputitem", w, r, user)
|
||||||
}
|
}
|
||||||
halves[1] = strings.TrimSuffix(halves[1], "]")
|
halves[1] = strings.TrimSuffix(halves[1], "]")
|
||||||
|
|
||||||
index, err := strconv.Atoi(halves[1])
|
index, err := strconv.Atoi(halves[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return c.LocalError("Malformed pollinputitem", w, r, user)
|
return c.LocalError("Malformed pollinputitem", w, r, user)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there are duplicates, then something has gone horribly wrong, so let's ignore them, this'll likely happen during an attack
|
// If there are duplicates, then something has gone horribly wrong, so let's ignore them, this'll likely happen during an attack
|
||||||
_, exists := pollInputItems[index]
|
_, exists := pollInputItems[index]
|
||||||
// TODO: Should we use SanitiseBody instead to keep the newlines?
|
// TODO: Should we use SanitiseBody instead to keep the newlines?
|
||||||
if !exists && len(c.SanitiseSingleLine(value)) != 0 {
|
if !exists && len(c.SanitiseSingleLine(value)) != 0 {
|
||||||
pollInputItems[index] = c.SanitiseSingleLine(value)
|
pollInputItems[index] = c.SanitiseSingleLine(value)
|
||||||
if len(pollInputItems) >= maxPollOptions {
|
if len(pollInputItems) >= maxPollOptions {
|
||||||
break
|
break
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue