75 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			V
		
	
	
module vweb
 | 
						|
 | 
						|
import net.urllib
 | 
						|
import net.http
 | 
						|
 | 
						|
// Parsing function attributes for methods and path.
 | 
						|
fn parse_attrs(name string, attrs []string) ?([]http.Method, string) {
 | 
						|
	if attrs.len == 0 {
 | 
						|
		return [http.Method.get], '/$name'
 | 
						|
	}
 | 
						|
 | 
						|
	mut x := attrs.clone()
 | 
						|
	mut methods := []http.Method{}
 | 
						|
	mut path := ''
 | 
						|
 | 
						|
	for i := 0; i < x.len; {
 | 
						|
		attr := x[i]
 | 
						|
		attru := attr.to_upper()
 | 
						|
		m := http.method_from_str(attru)
 | 
						|
		if attru == 'GET' || m != .get {
 | 
						|
			methods << m
 | 
						|
			x.delete(i)
 | 
						|
			continue
 | 
						|
		}
 | 
						|
		if attr.starts_with('/') {
 | 
						|
			if path != '' {
 | 
						|
				return IError(http.MultiplePathAttributesError{})
 | 
						|
			}
 | 
						|
			path = attr
 | 
						|
			x.delete(i)
 | 
						|
			continue
 | 
						|
		}
 | 
						|
		i++
 | 
						|
	}
 | 
						|
	if x.len > 0 {
 | 
						|
		return IError(http.UnexpectedExtraAttributeError{
 | 
						|
			msg: 'Encountered unexpected extra attributes: $x'
 | 
						|
		})
 | 
						|
	}
 | 
						|
	if methods.len == 0 {
 | 
						|
		methods = [http.Method.get]
 | 
						|
	}
 | 
						|
	if path == '' {
 | 
						|
		path = '/$name'
 | 
						|
	}
 | 
						|
	// Make path lowercase for case-insensitive comparisons
 | 
						|
	return methods, path.to_lower()
 | 
						|
}
 | 
						|
 | 
						|
fn parse_query_from_url(url urllib.URL) map[string]string {
 | 
						|
	mut query := map[string]string{}
 | 
						|
	for k, v in url.query().data {
 | 
						|
		query[k] = v.data[0]
 | 
						|
	}
 | 
						|
	return query
 | 
						|
}
 | 
						|
 | 
						|
fn parse_form_from_request(request http.Request) ?(map[string]string, map[string][]http.FileData) {
 | 
						|
	mut form := map[string]string{}
 | 
						|
	mut files := map[string][]http.FileData{}
 | 
						|
	if request.method in methods_with_form {
 | 
						|
		ct := request.header.get(.content_type) or { '' }.split(';').map(it.trim_left(' \t'))
 | 
						|
		if 'multipart/form-data' in ct {
 | 
						|
			boundary := ct.filter(it.starts_with('boundary='))
 | 
						|
			if boundary.len != 1 {
 | 
						|
				return error('detected more that one form-data boundary')
 | 
						|
			}
 | 
						|
			form, files = http.parse_multipart_form(request.data, boundary[0][9..])
 | 
						|
		} else {
 | 
						|
			form = http.parse_form(request.data)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return form, files
 | 
						|
}
 |