HTTP Clients
Response Status
Client code usually branches on a response status before reading the body.
status code
HTTP status codes group results into success, client error, server error, and other categories.
Response Status
response_status.go
Replay: real traced execution (multi-file project)
package main
import "fmt"
type responseMeta struct {
StatusCode int
Status string
}
func main() {
var statusCode = 200
text := "OK"
if statusCode == 404 {
text = "Not Found"
}
if statusCode == 503 {
text = "Service Unavailable"
}
response := responseMeta{
StatusCode: statusCode,
Status: fmt.Sprintf("%d %s", statusCode, text),
}
group := "other"
if response.StatusCode >= 200 && response.StatusCode < 300 {
group = "success"
}
if response.StatusCode >= 400 && response.StatusCode < 500 {
group = "client error"
}
if response.StatusCode >= 500 {
group = "server error"
}
fmt.Println("status=", response.Status)
fmt.Println("code=", response.StatusCode)
fmt.Println("group=", group)
}
package main
import "fmt"
type responseMeta struct {
StatusCode int
Status string
}
func main() {
var statusCode = 404
text := "OK"
if statusCode == 404 {
text = "Not Found"
}
if statusCode == 503 {
text = "Service Unavailable"
}
response := responseMeta{
StatusCode: statusCode,
Status: fmt.Sprintf("%d %s", statusCode, text),
}
group := "other"
if response.StatusCode >= 200 && response.StatusCode < 300 {
group = "success"
}
if response.StatusCode >= 400 && response.StatusCode < 500 {
group = "client error"
}
if response.StatusCode >= 500 {
group = "server error"
}
fmt.Println("status=", response.Status)
fmt.Println("code=", response.StatusCode)
fmt.Println("group=", group)
}
package main
import "fmt"
type responseMeta struct {
StatusCode int
Status string
}
func main() {
var statusCode = 503
text := "OK"
if statusCode == 404 {
text = "Not Found"
}
if statusCode == 503 {
text = "Service Unavailable"
}
response := responseMeta{
StatusCode: statusCode,
Status: fmt.Sprintf("%d %s", statusCode, text),
}
group := "other"
if response.StatusCode >= 200 && response.StatusCode < 300 {
group = "success"
}
if response.StatusCode >= 400 && response.StatusCode < 500 {
group = "client error"
}
if response.StatusCode >= 500 {
group = "server error"
}
fmt.Println("status=", response.Status)
fmt.Println("code=", response.StatusCode)
fmt.Println("group=", group)
}
statusCode ← 200, text ← "OK", response ← main.responseMeta{StatusCode:200, Status:"200 OK"}
10func main() {11 var statusCode→ 200 = 200 //@statusCode=404, 50312 text→ "OK" := "OK"13 if statusCode == 404 {14 text = "Not Found"15 }16 if statusCode == 503 {17 text = "Service Unavailable"18 }19 response→ main.responseMeta{StatusCode:200, Status:"200 OK"} := responseMeta{20 StatusCode: statusCode200,21 Status: fmt.Sprintf("%d %s", statusCode200, text"OK"),22 }2324 group→ "other" := "other"25 if response.StatusCode >= 200 && response.StatusCode < 300 {group ← "success"
24group := "other"25if response.StatusCode200 >= 200 && response.StatusCode < 300 {26 group→ "success" = "success"27}fmt.Println("status=", response.Status)
35 fmt.Println("status=", response.Status"200 OK")36 fmt.Println("code=", response.StatusCode200)37 fmt.Println("group=", group"success")38}outputstatus= 200 OK code= 200 group= success
statusCode ← 404, text ← "OK"
10func main() {11 var statusCode→ 404 = 40412 text→ "OK" := "OK"13 if statusCode == 404 {text ← "Not Found"
12text := "OK"13if statusCode404 == 404 {14 text→ "Not Found" = "Not Found"15}response ← main.responseMeta{StatusCode:404, Status:"404 Not Found"}
18}19response→ main.responseMeta{StatusCode:404, Status:"404 Not Found"} := responseMeta{20 StatusCode: statusCode404,21 Status: fmt.Sprintf("%d %s", statusCode404, text"Not Found"),22}2324group→ "other" := "other"25if response.StatusCode >= 200 && response.StatusCode < 300 {group ← "client error"
27}28if response.StatusCode404 >= 400 && response.StatusCode < 500 {29 group→ "client error" = "client error"30}fmt.Println("status=", response.Status)
35 fmt.Println("status=", response.Status"404 Not Found")36 fmt.Println("code=", response.StatusCode404)37 fmt.Println("group=", group"client error")38}outputstatus= 404 Not Found code= 404 group= client error
statusCode ← 503, text ← "OK"
10func main() {11 var statusCode→ 503 = 50312 text→ "OK" := "OK"13 if statusCode == 404 {text ← "Service Unavailable"
15}16if statusCode503 == 503 {17 text→ "Service Unavailable" = "Service Unavailable"18}response ← main.responseMeta{StatusCode:503, Status:"503 Service Unavailable"}
18}19response→ main.responseMeta{StatusCode:503, Status:"503 Service Unavailable"} := responseMeta{20 StatusCode: statusCode503,21 Status: fmt.Sprintf("%d %s", statusCode503, text"Service Unavailable"),22}2324group→ "other" := "other"25if response.StatusCode >= 200 && response.StatusCode < 300 {group ← "server error"
30}31if response.StatusCode503 >= 500 {32 group→ "server error" = "server error"33}fmt.Println("status=", response.Status)
35 fmt.Println("status=", response.Status"503 Service Unavailable")36 fmt.Println("code=", response.StatusCode503)37 fmt.Println("group=", group"server error")38}outputstatus= 503 Service Unavailable code= 503 group= server error