diff options
Diffstat (limited to 'v_windows/v/old/vlib/picohttpparser')
| -rw-r--r-- | v_windows/v/old/vlib/picohttpparser/misc.v | 20 | ||||
| -rw-r--r-- | v_windows/v/old/vlib/picohttpparser/picohttpparser.v | 35 | ||||
| -rw-r--r-- | v_windows/v/old/vlib/picohttpparser/request.v | 65 | ||||
| -rw-r--r-- | v_windows/v/old/vlib/picohttpparser/response.v | 114 | 
4 files changed, 234 insertions, 0 deletions
diff --git a/v_windows/v/old/vlib/picohttpparser/misc.v b/v_windows/v/old/vlib/picohttpparser/misc.v new file mode 100644 index 0000000..6c8e1e7 --- /dev/null +++ b/v_windows/v/old/vlib/picohttpparser/misc.v @@ -0,0 +1,20 @@ +module picohttpparser + +[inline; unsafe] +fn cpy(dst &byte, src &byte, len int) int { +	unsafe { C.memcpy(dst, src, len) } +	return len +} + +[inline] +pub fn cmp(dst string, src string) bool { +	if dst.len != src.len { +		return false +	} +	return unsafe { C.memcmp(dst.str, src.str, src.len) == 0 } +} + +[inline] +pub fn cmpn(dst string, src string, n int) bool { +	return unsafe { C.memcmp(dst.str, src.str, n) == 0 } +} diff --git a/v_windows/v/old/vlib/picohttpparser/picohttpparser.v b/v_windows/v/old/vlib/picohttpparser/picohttpparser.v new file mode 100644 index 0000000..a8c93e6 --- /dev/null +++ b/v_windows/v/old/vlib/picohttpparser/picohttpparser.v @@ -0,0 +1,35 @@ +// Copyright (c) 2019-2021 Alexander Medvednikov. All rights reserved. +// Use of this source code is governed by an MIT license +// that can be found in the LICENSE file. +module picohttpparser + +#flag -I @VEXEROOT/thirdparty/picohttpparser +#flag -L @VEXEROOT/thirdparty/picohttpparser +#flag @VEXEROOT/thirdparty/picohttpparser/picohttpparser.o + +#include "picohttpparser.h" + +struct C.phr_header { +pub: +	name      &char +	name_len  int +	value     &char +	value_len int +} + +type PPchar = &&char + +struct C.phr_header_t {} + +fn C.phr_parse_request(buf &char, len size_t, method PPchar, method_len &size_t, path PPchar, path_len &size_t, minor_version &int, headers &C.phr_header, num_headers &size_t, last_len size_t) int + +fn C.phr_parse_response(buf &char, len size_t, minor_version &int, status &int, msg PPchar, msg_len &size_t, headers &C.phr_header, num_headers &size_t, last_len size_t) int + +fn C.phr_parse_headers(buf &char, len size_t, headers &C.phr_header, num_headers &size_t, last_len size_t) int + +fn C.phr_parse_request_path(buf_start &char, len size_t, method PPchar, method_len &size_t, path PPchar, path_len &size_t) int +fn C.phr_parse_request_path_pipeline(buf_start &char, len size_t, method PPchar, method_len &size_t, path PPchar, path_len &size_t) int +fn C.get_date() &byte + +// static inline int u64toa(char* buf, uint64_t value) { +fn C.u64toa(buffer &char, value u64) int diff --git a/v_windows/v/old/vlib/picohttpparser/request.v b/v_windows/v/old/vlib/picohttpparser/request.v new file mode 100644 index 0000000..98667be --- /dev/null +++ b/v_windows/v/old/vlib/picohttpparser/request.v @@ -0,0 +1,65 @@ +module picohttpparser + +pub struct Request { +mut: +	prev_len int +pub mut: +	method      string +	path        string +	headers     [100]C.phr_header +	num_headers u64 +	body        string +} + +[inline] +pub fn (mut r Request) parse_request(s string, max_headers int) int { +	method_len := size_t(0) +	path_len := size_t(0) +	minor_version := 0 +	num_headers := size_t(max_headers) + +	pret := C.phr_parse_request(s.str, s.len, PPchar(&r.method.str), &method_len, PPchar(&r.path.str), +		&path_len, &minor_version, &r.headers[0], &num_headers, r.prev_len) +	if pret > 0 { +		unsafe { +			r.method = tos(r.method.str, int(method_len)) +			r.path = tos(r.path.str, int(path_len)) +		} +		r.num_headers = u64(num_headers) +	} +	r.body = unsafe { (&s.str[pret]).vstring_literal_with_len(s.len - pret) } +	r.prev_len = s.len +	return pret +} + +[inline] +pub fn (mut r Request) parse_request_path(s string) int { +	method_len := size_t(0) +	path_len := size_t(0) + +	pret := C.phr_parse_request_path(s.str, s.len, PPchar(&r.method.str), &method_len, +		PPchar(&r.path.str), &path_len) +	if pret > 0 { +		unsafe { +			r.method = tos(r.method.str, int(method_len)) +			r.path = tos(r.path.str, int(path_len)) +		} +	} +	return pret +} + +[inline] +pub fn (mut r Request) parse_request_path_pipeline(s string) int { +	method_len := size_t(0) +	path_len := size_t(0) + +	pret := C.phr_parse_request_path_pipeline(s.str, s.len, PPchar(&r.method.str), &method_len, +		PPchar(&r.path.str), &path_len) +	if pret > 0 { +		unsafe { +			r.method = tos(r.method.str, int(method_len)) +			r.path = tos(r.path.str, int(path_len)) +		} +	} +	return pret +} diff --git a/v_windows/v/old/vlib/picohttpparser/response.v b/v_windows/v/old/vlib/picohttpparser/response.v new file mode 100644 index 0000000..5c490ea --- /dev/null +++ b/v_windows/v/old/vlib/picohttpparser/response.v @@ -0,0 +1,114 @@ +module picohttpparser + +pub struct Response { +	fd int +pub: +	date      &byte = 0 +	buf_start &byte = 0 +pub mut: +	buf &byte = 0 +} + +[inline] +pub fn (mut r Response) write_string(s string) { +	unsafe { +		C.memcpy(r.buf, s.str, s.len) +		r.buf += s.len +	} +} + +[inline] +pub fn (mut r Response) http_ok() &Response { +	r.write_string('HTTP/1.1 200 OK\r\n') +	return unsafe { r } +} + +[inline] +pub fn (mut r Response) header(k string, v string) &Response { +	r.write_string(k) +	r.write_string(': ') +	r.write_string(v) +	r.write_string('\r\n') +	return unsafe { r } +} + +[inline] +pub fn (mut r Response) header_date() &Response { +	r.write_string('Date: ') +	unsafe { +		r.buf += cpy(r.buf, r.date, 29) +	} +	r.write_string('\r\n') +	return unsafe { r } +} + +[inline] +pub fn (mut r Response) header_server() &Response { +	r.write_string('Server: V\r\n') +	return unsafe { r } +} + +[inline] +pub fn (mut r Response) content_type(s string) &Response { +	r.write_string('Content-Type: ') +	r.write_string(s) +	r.write_string('\r\n') +	return unsafe { r } +} + +[inline] +pub fn (mut r Response) html() &Response { +	r.write_string('Content-Type: text/html\r\n') +	return unsafe { r } +} + +[inline] +pub fn (mut r Response) plain() &Response { +	r.write_string('Content-Type: text/plain\r\n') +	return unsafe { r } +} + +[inline] +pub fn (mut r Response) json() &Response { +	r.write_string('Content-Type: application/json\r\n') +	return unsafe { r } +} + +[inline] +pub fn (mut r Response) body(body string) { +	r.write_string('Content-Length: ') +	unsafe { +		r.buf += C.u64toa(r.buf, body.len) +	} +	r.write_string('\r\n\r\n') +	r.write_string(body) +} + +[inline] +pub fn (mut r Response) http_404() { +	r.write_string('HTTP/1.1 404 Not Found\r\nContent-Length: 0\r\n\r\n') +} + +[inline] +pub fn (mut r Response) http_405() { +	r.write_string('HTTP/1.1 405 Method Not Allowed\r\nContent-Length: 0\r\n\r\n') +} + +[inline] +pub fn (mut r Response) http_500() { +	r.write_string('HTTP/1.1 500 Internal Server Error\r\nContent-Length: 0\r\n\r\n') +} + +[inline] +pub fn (mut r Response) raw(response string) { +	r.write_string(response) +} + +[inline] +pub fn (mut r Response) end() int { +	n := int(r.buf) - int(r.buf_start) +	if C.write(r.fd, r.buf_start, n) != n { +		return -1 +	} +	return n +}  | 
