net and http: more consistent error messages

pull/2743/head
Delyan Angelov 2019-11-12 18:23:53 +02:00 committed by Alexander Medvednikov
parent 35741b46bd
commit 32473eeafe
5 changed files with 31 additions and 31 deletions

View File

@ -56,7 +56,7 @@ pub fn post(url, data string) ?Response {
pub fn new_request(typ, _url, _data string) ?Request { pub fn new_request(typ, _url, _data string) ?Request {
if _url == '' { if _url == '' {
return error('bad url') return error('http.new_request: empty url')
} }
mut url := _url mut url := _url
mut data := _data mut data := _data
@ -125,7 +125,7 @@ pub fn (req &Request) do() ?Response {
for key, val in req.headers { for key, val in req.headers {
//h := '$key: $val' //h := '$key: $val'
} }
url := urllib.parse(req.url) or { return error('http.request.do: invalid URL $req.url') } url := urllib.parse(req.url) or { return error('http.request.do: invalid URL "$req.url"') }
mut rurl := url mut rurl := url
mut resp := Response{} mut resp := Response{}
mut no_redirects := 0 mut no_redirects := 0
@ -136,7 +136,7 @@ pub fn (req &Request) do() ?Response {
if ! (resp.status_code in [301, 302, 303, 307, 308]) { break } if ! (resp.status_code in [301, 302, 303, 307, 308]) { break }
// follow any redirects // follow any redirects
redirect_url := resp.headers['Location'] redirect_url := resp.headers['Location']
qrurl := urllib.parse( redirect_url ) or { return error('http.request.do: invalid URL in redirect $redirect_url') } qrurl := urllib.parse( redirect_url ) or { return error('http.request.do: invalid URL in redirect "$redirect_url"') }
rurl = qrurl rurl = qrurl
no_redirects++ no_redirects++
} }
@ -167,7 +167,7 @@ fn (req &Request) method_and_url_to_response(method string, url net_dot_urllib.U
} }
return res return res
} }
return error('http.request.do: unsupported scheme: $scheme') return error('http.request.method_and_url_to_response: unsupported scheme: "$scheme"')
} }
fn parse_response(resp string) Response { fn parse_response(resp string) Response {

View File

@ -13,7 +13,7 @@ fn (req &Request) http_do(port int, method, host_name, path string) ?Response {
client.send( s.str, s.len ) or {} client.send( s.str, s.len ) or {}
for { for {
readbytes := client.crecv( rbuffer, bufsize ) readbytes := client.crecv( rbuffer, bufsize )
if readbytes < 0 { return error('http_do error reading response. readbytes: $readbytes') } if readbytes < 0 { return error('http.request.http_do: error reading response. readbytes=$readbytes') }
if readbytes == 0 { break } if readbytes == 0 { break }
sb.write( tos(rbuffer, readbytes) ) sb.write( tos(rbuffer, readbytes) )
} }

View File

@ -7,7 +7,7 @@ pub fn hostname() ?string {
// The host name is returned as a null-terminated string. // The host name is returned as a null-terminated string.
res := C.gethostname(&name, 256) res := C.gethostname(&name, 256)
if res != 0 { if res != 0 {
return error('net.hostname() cannot get the host name') return error('net.hostname: failed with $res')
} }
return tos_clone(name) return tos_clone(name)
} }

View File

@ -46,7 +46,7 @@ pub fn socket(family int, _type int, proto int) ?Socket {
// same port after the application exits. // same port after the application exits.
C.setsockopt(sockfd, C.SOL_SOCKET, C.SO_REUSEADDR, &one, sizeof(int)) C.setsockopt(sockfd, C.SOL_SOCKET, C.SO_REUSEADDR, &one, sizeof(int))
if sockfd == 0 { if sockfd == 0 {
return error('socket: init failed') return error('net.socket: failed')
} }
s := Socket { s := Socket {
sockfd: sockfd sockfd: sockfd
@ -65,7 +65,7 @@ pub fn socket_udp() ?Socket {
pub fn (s Socket) setsockopt(level int, optname int, optvalue &int) ?int { pub fn (s Socket) setsockopt(level int, optname int, optvalue &int) ?int {
res := C.setsockopt(s.sockfd, level, optname, optvalue, C.sizeof(optvalue)) res := C.setsockopt(s.sockfd, level, optname, optvalue, C.sizeof(optvalue))
if res < 0 { if res < 0 {
return error('socket: setsockopt failed') return error('net.setsocketopt: failed with $res')
} }
return int(res) return int(res)
} }
@ -79,7 +79,7 @@ pub fn (s Socket) bind(port int) ?int {
size := 16 // sizeof(C.sockaddr_in) size := 16 // sizeof(C.sockaddr_in)
res := int(C.bind(s.sockfd, &addr, size)) res := int(C.bind(s.sockfd, &addr, size))
if res < 0 { if res < 0 {
return error('socket: bind failed') return error('net.bind: failed with $res')
} }
return res return res
} }
@ -89,7 +89,7 @@ pub fn (s Socket) listen() ?int {
backlog := 128 backlog := 128
res := int(C.listen(s.sockfd, backlog)) res := int(C.listen(s.sockfd, backlog))
if res < 0 { if res < 0 {
return error('socket: listen failed') return error('net.listen: failed with $res')
} }
$if debug { $if debug {
println('listen res = $res') println('listen res = $res')
@ -105,7 +105,7 @@ pub fn (s Socket) listen_backlog(backlog int) ?int {
} }
res := C.listen(s.sockfd, n) res := C.listen(s.sockfd, n)
if res < 0 { if res < 0 {
return error('socket: listen_backlog failed') return error('net.listen_backlog: failed with $res')
} }
return int(res) return int(res)
} }
@ -136,7 +136,7 @@ pub fn (s Socket) accept() ?Socket {
size := 128 // sizeof(sockaddr_storage) size := 128 // sizeof(sockaddr_storage)
sockfd := C.accept(s.sockfd, &addr, &size) sockfd := C.accept(s.sockfd, &addr, &size)
if sockfd < 0 { if sockfd < 0 {
return error('socket: accept failed') return error('net.accept: failed with $sockfd')
} }
c := Socket { c := Socket {
sockfd: sockfd sockfd: sockfd
@ -165,12 +165,12 @@ pub fn (s Socket) connect(address string, port int) ?int {
info_res := C.getaddrinfo(address.str, sport.str, &hints, &info) info_res := C.getaddrinfo(address.str, sport.str, &hints, &info)
if info_res != 0 { if info_res != 0 {
error_message := os.get_error_msg(net.error_code()) error_message := os.get_error_msg(net.error_code())
return error('socket: getaddrinfo failed ($error_message)') return error('net.connect: getaddrinfo failed "$error_message"')
} }
res := int(C.connect(s.sockfd, info.ai_addr, info.ai_addrlen)) res := int(C.connect(s.sockfd, info.ai_addr, info.ai_addrlen))
if res < 0 { if res < 0 {
error_message := os.get_error_msg(net.error_code()) error_message := os.get_error_msg(net.error_code())
return error('socket: connect failed ($error_message)') return error('net.connect: connect failed "$error_message"')
} }
return int(res) return int(res)
} }
@ -190,7 +190,7 @@ pub fn dial(address string, port int) ?Socket {
pub fn (s Socket) send(buf byteptr, len int) ?int { pub fn (s Socket) send(buf byteptr, len int) ?int {
res := int( C.send(s.sockfd, buf, len, 0) ) res := int( C.send(s.sockfd, buf, len, 0) )
if res < 0 { if res < 0 {
return error('socket: send failed') return error('net.send: failed with $res')
} }
return res return res
} }
@ -224,7 +224,7 @@ pub fn (s Socket) close() ?int {
// TODO: should shutdown throw an error? close will // TODO: should shutdown throw an error? close will
// continue even if shutdown failed // continue even if shutdown failed
// if shutdown_res < 0 { // if shutdown_res < 0 {
// return error('socket: shutdown failed') // return error('net.close: shutdown failed with $shutdown_res')
// } // }
mut res := 0 mut res := 0
@ -235,7 +235,7 @@ pub fn (s Socket) close() ?int {
res = C.close(s.sockfd) res = C.close(s.sockfd)
} }
if res < 0 { if res < 0 {
return error('socket: close failed') return error('net.close: failed with $res')
} }
return 0 return 0

View File

@ -24,12 +24,12 @@ enum EncodingMode {
} }
const ( const (
err_msg_escape = 'invalid URL escape' err_msg_escape = 'unescape: invalid URL escape'
err_msg_parse = 'error parsing url' err_msg_parse = 'parse: failed parsing url'
) )
fn error_msg(message, val string) string { fn error_msg(message, val string) string {
mut msg := 'net.urllib: $message' mut msg := 'net.urllib.$message'
if val != '' { msg = '$msg ($val)' } if val != '' { msg = '$msg ($val)' }
return msg return msg
} }
@ -196,7 +196,7 @@ fn unescape(s_ string, mode EncodingMode) ?string {
i++ i++
} else { } else {
if (mode == .encode_host || mode == .encode_zone) && s[i] < 0x80 && should_escape(s[i], mode) { if (mode == .encode_host || mode == .encode_zone) && s[i] < 0x80 && should_escape(s[i], mode) {
error(error_msg('invalid character in host name', s[i..i+1])) error(error_msg('unescape: invalid character in host name', s[i..i+1]))
} }
i++ i++
} }
@ -397,7 +397,7 @@ fn split_by_scheme(rawurl string) ?[]string {
} }
else if c == `:` { else if c == `:` {
if i == 0 { if i == 0 {
return error(error_msg('missing protocol scheme', '')) return error(error_msg('split_by_scheme: missing protocol scheme', ''))
} }
return [rawurl[..i], rawurl[i+1..]] return [rawurl[..i], rawurl[i+1..]]
} }
@ -468,11 +468,11 @@ fn parse_request_uri(rawurl string) ?URL {
// If via_request is false, all forms of relative URLs are allowed. // If via_request is false, all forms of relative URLs are allowed.
fn parse_url(rawurl string, via_request bool) ?URL { fn parse_url(rawurl string, via_request bool) ?URL {
if string_contains_ctl_byte(rawurl) { if string_contains_ctl_byte(rawurl) {
return error(error_msg('invalid control character in URL', rawurl)) return error(error_msg('parse_url: invalid control character in URL', rawurl))
} }
if rawurl == '' && via_request { if rawurl == '' && via_request {
return error(error_msg('empty URL', '')) return error(error_msg('parse_url: empty URL', rawurl))
} }
mut url := URL{} mut url := URL{}
@ -507,7 +507,7 @@ fn parse_url(rawurl string, via_request bool) ?URL {
return url return url
} }
if via_request { if via_request {
return error(error_msg('invalid URI for request', '')) return error(error_msg('parse_url: invalid URI for request', ''))
} }
// Avoid confusion with malformed schemes, like cache_object:foo/bar. // Avoid confusion with malformed schemes, like cache_object:foo/bar.
@ -520,7 +520,7 @@ fn parse_url(rawurl string, via_request bool) ?URL {
slash := rest.index('/') slash := rest.index('/')
if colon >= 0 && (slash < 0 || colon < slash) { if colon >= 0 && (slash < 0 || colon < slash) {
// First path segment has colon. Not allowed in relative URL. // First path segment has colon. Not allowed in relative URL.
return error(error_msg('first path segment in URL cannot contain colon', '')) return error(error_msg('parse_url: first path segment in URL cannot contain colon', ''))
} }
} }
@ -568,7 +568,7 @@ fn parse_authority(authority string) ?ParseAuthorityRes {
} }
mut userinfo := authority[..i] mut userinfo := authority[..i]
if !valid_userinfo(userinfo) { if !valid_userinfo(userinfo) {
return error(error_msg('invalid userinfo', '')) return error(error_msg('parse_authority: invalid userinfo', ''))
} }
if !userinfo.contains(':') { if !userinfo.contains(':') {
u := unescape(userinfo, .encode_user_password) or { u := unescape(userinfo, .encode_user_password) or {
@ -602,11 +602,11 @@ fn parse_host(host string) ?string {
// E.g., '[fe80::1]', '[fe80::1%25en0]', '[fe80::1]:80'. // E.g., '[fe80::1]', '[fe80::1%25en0]', '[fe80::1]:80'.
mut i := host.last_index(']') mut i := host.last_index(']')
if i < 0 { if i < 0 {
return error(error_msg('missing \']\' in host', '')) return error(error_msg('parse_host: missing \']\' in host', ''))
} }
mut colon_port := host[i+1..] mut colon_port := host[i+1..]
if !valid_optional_port(colon_port) { if !valid_optional_port(colon_port) {
return error(error_msg('invalid port $colon_port after host ', '')) return error(error_msg('parse_host: invalid port $colon_port after host ', ''))
} }
// RFC 6874 defines that %25 (%-encoded percent) introduces // RFC 6874 defines that %25 (%-encoded percent) introduces
@ -632,7 +632,7 @@ fn parse_host(host string) ?string {
if i != -1 { if i != -1 {
colon_port = host[i..] colon_port = host[i..]
if !valid_optional_port(colon_port) { if !valid_optional_port(colon_port) {
return error(error_msg('invalid port $colon_port after host ', '')) return error(error_msg('parse_host: invalid port $colon_port after host ', ''))
} }
} }
} }
@ -872,7 +872,7 @@ fn parse_query_values(m mut Values, query string) ?bool {
m.add(key, value) m.add(key, value)
} }
if had_error { if had_error {
return error(error_msg('error parsing query string', '')) return error(error_msg('parse_query_values: failed parsing query string', ''))
} }
return true return true
} }