vweb: fix reading request's body/headers
							parent
							
								
									fb3da327d6
								
							
						
					
					
						commit
						797d4364e7
					
				|  | @ -132,24 +132,31 @@ pub fn run<T>(app mut T, port int) { | ||||||
| 		conn := l.accept() or { panic('accept() failed') } | 		conn := l.accept() or { panic('accept() failed') } | ||||||
| 		//foobar<T>()
 | 		//foobar<T>()
 | ||||||
| 		// TODO move this to handle_conn<T>(conn, app)
 | 		// TODO move this to handle_conn<T>(conn, app)
 | ||||||
| 		message := readall(conn) | 		//message := readall(conn)
 | ||||||
| 
 | 		//println(message)
 | ||||||
|  | /* | ||||||
| 		if message.len > MAX_HTTP_POST_SIZE { | 		if message.len > MAX_HTTP_POST_SIZE { | ||||||
| 			println('message.len = $message.len > MAX_HTTP_POST_SIZE') | 			println('message.len = $message.len > MAX_HTTP_POST_SIZE') | ||||||
| 			conn.send_string(HTTP_500) or {} | 			conn.send_string(HTTP_500) or {} | ||||||
| 			conn.close() or {} | 			conn.close() or {} | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
|  | 		*/ | ||||||
| 
 | 
 | ||||||
| 		lines := message.split_into_lines() | 		//lines := message.split_into_lines()
 | ||||||
|  | 		//println(lines)
 | ||||||
| 
 | 
 | ||||||
|  | /* | ||||||
| 		if lines.len < 2 { | 		if lines.len < 2 { | ||||||
| 			conn.send_string(HTTP_500) or {} | 			conn.send_string(HTTP_500) or {} | ||||||
| 			conn.close() or {} | 			conn.close() or {} | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
|  | 		*/ | ||||||
| 
 | 
 | ||||||
| 		first_line := strip(lines[0]) | 		//first_line := strip(lines[0])
 | ||||||
|  | 		first_line := conn.read_line() | ||||||
|  | 		println('firstline="$first_line"') | ||||||
| 		$if debug { println(first_line) } | 		$if debug { println(first_line) } | ||||||
| 		// Parse the first line
 | 		// Parse the first line
 | ||||||
| 		// "GET / HTTP/1.1"
 | 		// "GET / HTTP/1.1"
 | ||||||
|  | @ -164,13 +171,40 @@ pub fn run<T>(app mut T, port int) { | ||||||
| 		mut headers := []string | 		mut headers := []string | ||||||
| 		mut body := '' | 		mut body := '' | ||||||
| 		mut in_headers := true | 		mut in_headers := true | ||||||
| 		for line in lines[1..] { | 		mut len := 0 | ||||||
|  | 		mut body_len := 0 | ||||||
|  | 		//for line in lines[1..] {
 | ||||||
|  | 		for j := 0; j < 100; j++ { | ||||||
|  | 			//println(j)
 | ||||||
|  | 			line := conn.read_line() | ||||||
| 			sline := strip(line) | 			sline := strip(line) | ||||||
| 			if sline == '' { in_headers = false } | 			if sline == '' { | ||||||
|  | 				//if in_headers {
 | ||||||
|  | 					// End of headers, no body => exit
 | ||||||
|  | 					if len == 0 { | ||||||
|  | 						break | ||||||
|  | 					} | ||||||
|  | 				//} //else {
 | ||||||
|  | 					// End of body
 | ||||||
|  | 					//break
 | ||||||
|  | 				//}
 | ||||||
|  | 				//println('HHH')
 | ||||||
|  | 				in_headers = false | ||||||
|  | 			} | ||||||
| 			if in_headers { | 			if in_headers { | ||||||
|  | 				//println(sline)
 | ||||||
| 				headers << sline | 				headers << sline | ||||||
|  | 				if sline.starts_with('Content-Length') { | ||||||
|  | 					len = sline.all_after(': ').int() | ||||||
|  | 					//println('GOT CL=$len')
 | ||||||
|  | 				} | ||||||
| 			} else { | 			} else { | ||||||
| 				body += strip(sline) + '\r\n' | 				body += sline + '\r\n' | ||||||
|  | 				body_len += body.len | ||||||
|  | 				if body_len >= len { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 				//println('body:$body')
 | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -182,11 +216,11 @@ pub fn run<T>(app mut T, port int) { | ||||||
| 			action = 'index' | 			action = 'index' | ||||||
| 		} | 		} | ||||||
| 		req := http.Request{ | 		req := http.Request{ | ||||||
| 				headers: http.parse_headers(headers) //s.split_into_lines())
 | 			headers: http.parse_headers(headers) //s.split_into_lines())
 | ||||||
| 				ws_func: 0 | 			ws_func: 0 | ||||||
| 				user_ptr: 0 | 			user_ptr: 0 | ||||||
| 				method: vals[0] | 			method: vals[0] | ||||||
| 				url: vals[1] | 			url: vals[1] | ||||||
| 		} | 		} | ||||||
| 		$if debug { | 		$if debug { | ||||||
| 			println('req.headers = ') | 			println('req.headers = ') | ||||||
|  | @ -204,6 +238,7 @@ pub fn run<T>(app mut T, port int) { | ||||||
| 		//}
 | 		//}
 | ||||||
| 		if req.method in methods_with_form { | 		if req.method in methods_with_form { | ||||||
| 			body = strip(body) | 			body = strip(body) | ||||||
|  | 			println('body="$body"' ) | ||||||
| 			app.vweb.parse_form(body) | 			app.vweb.parse_form(body) | ||||||
| 		} | 		} | ||||||
| 		if vals.len < 2 { | 		if vals.len < 2 { | ||||||
|  | @ -311,12 +346,14 @@ pub fn (ctx mut Context) serve_static(url, file_path, mime_type string) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | /* | ||||||
| fn readall(conn net.Socket) string { | fn readall(conn net.Socket) string { | ||||||
| 	// read all message from socket
 | 	// read all message from socket
 | ||||||
|  | 	//printf("waitall=%d\n", C.MSG_WAITALL)
 | ||||||
| 	mut message := '' | 	mut message := '' | ||||||
| 	buf := [1024]byte | 	buf := [1024]byte | ||||||
| 	for { | 	for { | ||||||
| 		n := C.recv(conn.sockfd, buf, 1024, 2) | 		n := C.recv(conn.sockfd, buf, 1024, 0) | ||||||
| 		m := conn.crecv(buf, 1024) | 		m := conn.crecv(buf, 1024) | ||||||
| 		message += string( byteptr(buf), m ) | 		message += string( byteptr(buf), m ) | ||||||
| 		if message.len > MAX_HTTP_POST_SIZE { break } | 		if message.len > MAX_HTTP_POST_SIZE { break } | ||||||
|  | @ -324,6 +361,7 @@ fn readall(conn net.Socket) string { | ||||||
| 	} | 	} | ||||||
| 	return message | 	return message | ||||||
| } | } | ||||||
|  | */ | ||||||
| 
 | 
 | ||||||
| fn strip(s string) string { | fn strip(s string) string { | ||||||
| 	// strip('\nabc\r\n') => 'abc'
 | 	// strip('\nabc\r\n') => 'abc'
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue