vweb: http methods check (#7371)
							parent
							
								
									a6baffcb8c
								
							
						
					
					
						commit
						d96dcefb06
					
				|  | @ -13,6 +13,7 @@ import time | |||
| 
 | ||||
| pub const ( | ||||
| 	methods_with_form       = [http.Method.post, .put, .patch] | ||||
| 	methods_without_first   = ['ost', 'ut', 'et', 'atch', 'ptions', 'elete', 'ead'] // needed for method checking as method parameter
 | ||||
| 	header_server           = 'Server: VWeb\r\n' | ||||
| 	header_connection_close = 'Connection: close\r\n' | ||||
| 	headers_close           = '$header_server$header_connection_close\r\n' | ||||
|  | @ -399,6 +400,7 @@ fn handle_conn<T>(mut conn net.TcpConn, mut app T) { | |||
| 			} else { | ||||
| 				// Get methods
 | ||||
| 				// Get is default
 | ||||
| 				mut req_method_str := '$req.method' | ||||
| 				if req.method == .post { | ||||
| 					if 'post' in attrs { | ||||
| 						route_words_a = attrs.filter(it.to_lower() != 'post').map(it[1..].split('/')) | ||||
|  | @ -426,10 +428,19 @@ fn handle_conn<T>(mut conn net.TcpConn, mut app T) { | |||
| 				} else { | ||||
| 					route_words_a = attrs.filter(it.to_lower() != 'get').map(it[1..].split('/')) | ||||
| 				} | ||||
| 				mut req_method := []string{} | ||||
| 				if route_words_a.len > 0 { | ||||
| 					for route_words in route_words_a { | ||||
| 						if route_words[0] in methods_without_first && route_words.len == 1 { | ||||
| 							req_method << route_words[0] | ||||
| 						} | ||||
| 						if url_words.len == route_words.len || | ||||
| 							(url_words.len >= route_words.len - 1 && route_words.last().ends_with('...')) { | ||||
| 							if req_method.len > 0 { | ||||
| 								if req_method_str.to_lower()[1..] !in req_method { | ||||
| 									continue | ||||
| 								} | ||||
| 							} | ||||
| 							// match `/:user/:repo/tree` to `/vlang/v/tree`
 | ||||
| 							mut matching := false | ||||
| 							mut unknown := false | ||||
|  | @ -471,6 +482,7 @@ fn handle_conn<T>(mut conn net.TcpConn, mut app T) { | |||
| 								action = method.name | ||||
| 								vars = variables | ||||
| 							} | ||||
| 							req_method = []string{} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue