diff --git a/examples/vweb/vweb_example.v b/examples/vweb/vweb_example.v index 91ede68e37..61e6328af6 100644 --- a/examples/vweb/vweb_example.v +++ b/examples/vweb/vweb_example.v @@ -27,8 +27,7 @@ pub fn (app & App) json_endpoint() { } pub fn (app mut App) index() { - app.cnt ++ - + app.cnt++ $vweb.html() } diff --git a/vlib/net/socket.v b/vlib/net/socket.v index e4a9129f91..d906228a2d 100644 --- a/vlib/net/socket.v +++ b/vlib/net/socket.v @@ -312,6 +312,19 @@ pub fn (s Socket) read_line() string { return res } +// TODO +pub fn (s Socket) read_all() string { + mut buf := [MAX_READ]byte // where C.recv will store the network data + mut res := '' // The final result, including the ending \n. + for { + n := C.recv(s.sockfd, buf, MAX_READ-1, 0) + if n == -1 { return res } + if n == 0 { return res } + res += tos_clone(buf) + } + return res +} + pub fn (s Socket) get_port() int { mut addr := C.sockaddr_in {} size := 16 // sizeof(sockaddr_in) diff --git a/vlib/vweb/vweb.v b/vlib/vweb/vweb.v index 67b9d33a82..add46ec0b2 100644 --- a/vlib/vweb/vweb.v +++ b/vlib/vweb/vweb.v @@ -44,7 +44,7 @@ mut: } pub fn (ctx Context) html(html string) { - //println('$html HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n$ctx.headers\r\n\r\n$html') + //println('HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n$ctx.headers\r\n\r\n$html') ctx.conn.write('HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n$ctx.headers\r\n\r\n$html') or { panic(err) } } @@ -74,7 +74,8 @@ pub fn (ctx &Context) get_cookie(key string) ?string { // TODO refactor cookie := if cookie_header.contains(';') { cookie_header.find_between('$key=', ';') } else { - cookie_header + cookie_header.find_between('$key=', '\r') + //cookie_header } if cookie != '' { return cookie @@ -90,7 +91,7 @@ fn (ctx mut Context) add_header(key, val string) { } fn (ctx &Context) get_header(key string) string { - return ctx.headers.find_between('\r\n$key: ', '\r\n') + return ctx.req.headers[key] } //pub fn run(port int) { @@ -105,15 +106,15 @@ pub fn run(app mut T, port int) { } //foobar() // TODO move this to handle_conn(conn, app) - s := conn.read_line() - if s == '' { + first_line:= conn.read_line() + if first_line == '' { conn.write(HTTP_500) or {} conn.close() or {} return } // Parse the first line // "GET / HTTP/1.1" - first_line := s.all_before('\n') + //first_line := s.all_before('\n') vals := first_line.split(' ') if vals.len < 2 { println('no vals for http') @@ -121,6 +122,15 @@ pub fn run(app mut T, port int) { conn.close() or {} return } + mut headers := []string + for _ in 0..30 { + header := conn.read_line() + headers << header + //println('header="$header" len = ' + header.len.str()) + if header.len <= 2 { + break + } + } mut action := vals[1][1..].all_before('/') if action.contains('?') { action = action.all_before('?') @@ -129,13 +139,15 @@ pub fn run(app mut T, port int) { action = 'index' } req := http.Request{ - headers: http.parse_headers(s.split_into_lines()) + headers: http.parse_headers(headers) //s.split_into_lines()) ws_func: 0 user_ptr: 0 method: vals[0] url: vals[1] } $if debug { + println('req.headers = ') + println(req.headers) println('vweb action = "$action"') } //mut app := T{