480 lines
17 KiB
Rust
480 lines
17 KiB
Rust
|
|
/*! 🌐 HTTP Method Implementations
|
||
|
|
*
|
||
|
|
* HTTP関連Boxのメソッド実行を実装
|
||
|
|
* SocketBox, HTTPServerBox, HTTPRequestBox, HTTPResponseBox
|
||
|
|
*/
|
||
|
|
|
||
|
|
use super::super::*;
|
||
|
|
use crate::boxes::{SocketBox, HTTPServerBox, HTTPRequestBox, HTTPResponseBox};
|
||
|
|
|
||
|
|
impl NyashInterpreter {
|
||
|
|
/// SocketBox methods
|
||
|
|
pub(in crate::interpreter) fn execute_socket_method(
|
||
|
|
&mut self,
|
||
|
|
socket_box: &SocketBox,
|
||
|
|
method: &str,
|
||
|
|
arguments: &[ASTNode]
|
||
|
|
) -> Result<Box<dyn NyashBox>, RuntimeError> {
|
||
|
|
match method {
|
||
|
|
"bind" => {
|
||
|
|
if arguments.len() != 2 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 2,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let address = self.execute_expression(&arguments[0])?;
|
||
|
|
let port = self.execute_expression(&arguments[1])?;
|
||
|
|
Ok(socket_box.bind(address, port))
|
||
|
|
}
|
||
|
|
"listen" => {
|
||
|
|
if arguments.len() != 1 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 1,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let backlog = self.execute_expression(&arguments[0])?;
|
||
|
|
Ok(socket_box.listen(backlog))
|
||
|
|
}
|
||
|
|
"accept" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(socket_box.accept())
|
||
|
|
}
|
||
|
|
"connect" => {
|
||
|
|
if arguments.len() != 2 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 2,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let address = self.execute_expression(&arguments[0])?;
|
||
|
|
let port = self.execute_expression(&arguments[1])?;
|
||
|
|
Ok(socket_box.connect(address, port))
|
||
|
|
}
|
||
|
|
"read" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(socket_box.read())
|
||
|
|
}
|
||
|
|
"readHttpRequest" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(socket_box.read_http_request())
|
||
|
|
}
|
||
|
|
"write" => {
|
||
|
|
if arguments.len() != 1 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 1,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let data = self.execute_expression(&arguments[0])?;
|
||
|
|
Ok(socket_box.write(data))
|
||
|
|
}
|
||
|
|
"close" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(socket_box.close())
|
||
|
|
}
|
||
|
|
"isConnected" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(socket_box.is_connected())
|
||
|
|
}
|
||
|
|
"isServer" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(socket_box.is_server())
|
||
|
|
}
|
||
|
|
_ => Err(RuntimeError::UndefinedMethod {
|
||
|
|
method: method.to_string(),
|
||
|
|
object_type: "SocketBox".to_string(),
|
||
|
|
}),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// HTTPServerBox methods
|
||
|
|
pub(in crate::interpreter) fn execute_http_server_method(
|
||
|
|
&mut self,
|
||
|
|
server_box: &HTTPServerBox,
|
||
|
|
method: &str,
|
||
|
|
arguments: &[ASTNode]
|
||
|
|
) -> Result<Box<dyn NyashBox>, RuntimeError> {
|
||
|
|
match method {
|
||
|
|
"bind" => {
|
||
|
|
if arguments.len() != 2 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 2,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let address = self.execute_expression(&arguments[0])?;
|
||
|
|
let port = self.execute_expression(&arguments[1])?;
|
||
|
|
Ok(server_box.bind(address, port))
|
||
|
|
}
|
||
|
|
"listen" => {
|
||
|
|
if arguments.len() != 1 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 1,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let backlog = self.execute_expression(&arguments[0])?;
|
||
|
|
Ok(server_box.listen(backlog))
|
||
|
|
}
|
||
|
|
"start" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(server_box.start())
|
||
|
|
}
|
||
|
|
"stop" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(server_box.stop())
|
||
|
|
}
|
||
|
|
"get" => {
|
||
|
|
if arguments.len() != 2 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 2,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let path = self.execute_expression(&arguments[0])?;
|
||
|
|
let handler = self.execute_expression(&arguments[1])?;
|
||
|
|
Ok(server_box.get(path, handler))
|
||
|
|
}
|
||
|
|
"post" => {
|
||
|
|
if arguments.len() != 2 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 2,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let path = self.execute_expression(&arguments[0])?;
|
||
|
|
let handler = self.execute_expression(&arguments[1])?;
|
||
|
|
Ok(server_box.post(path, handler))
|
||
|
|
}
|
||
|
|
"put" => {
|
||
|
|
if arguments.len() != 2 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 2,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let path = self.execute_expression(&arguments[0])?;
|
||
|
|
let handler = self.execute_expression(&arguments[1])?;
|
||
|
|
Ok(server_box.put(path, handler))
|
||
|
|
}
|
||
|
|
"delete" => {
|
||
|
|
if arguments.len() != 2 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 2,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let path = self.execute_expression(&arguments[0])?;
|
||
|
|
let handler = self.execute_expression(&arguments[1])?;
|
||
|
|
Ok(server_box.delete(path, handler))
|
||
|
|
}
|
||
|
|
"route" => {
|
||
|
|
if arguments.len() != 2 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 2,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let path = self.execute_expression(&arguments[0])?;
|
||
|
|
let handler = self.execute_expression(&arguments[1])?;
|
||
|
|
Ok(server_box.route(path, handler))
|
||
|
|
}
|
||
|
|
"setStaticPath" => {
|
||
|
|
if arguments.len() != 1 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 1,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let path = self.execute_expression(&arguments[0])?;
|
||
|
|
Ok(server_box.set_static_path(path))
|
||
|
|
}
|
||
|
|
"setTimeout" => {
|
||
|
|
if arguments.len() != 1 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 1,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let timeout = self.execute_expression(&arguments[0])?;
|
||
|
|
Ok(server_box.set_timeout(timeout))
|
||
|
|
}
|
||
|
|
"getActiveConnections" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(server_box.get_active_connections())
|
||
|
|
}
|
||
|
|
"isRunning" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(server_box.is_running())
|
||
|
|
}
|
||
|
|
_ => Err(RuntimeError::UndefinedMethod {
|
||
|
|
method: method.to_string(),
|
||
|
|
object_type: "HTTPServerBox".to_string(),
|
||
|
|
}),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// HTTPRequestBox methods
|
||
|
|
pub(in crate::interpreter) fn execute_http_request_method(
|
||
|
|
&mut self,
|
||
|
|
request_box: &HTTPRequestBox,
|
||
|
|
method: &str,
|
||
|
|
arguments: &[ASTNode]
|
||
|
|
) -> Result<Box<dyn NyashBox>, RuntimeError> {
|
||
|
|
match method {
|
||
|
|
"getMethod" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(request_box.get_method())
|
||
|
|
}
|
||
|
|
"getPath" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(request_box.get_path())
|
||
|
|
}
|
||
|
|
"getQueryString" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(request_box.get_query_string())
|
||
|
|
}
|
||
|
|
"getHeader" => {
|
||
|
|
if arguments.len() != 1 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 1,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let header_name = self.execute_expression(&arguments[0])?;
|
||
|
|
Ok(request_box.get_header(header_name))
|
||
|
|
}
|
||
|
|
"getAllHeaders" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(request_box.get_all_headers())
|
||
|
|
}
|
||
|
|
"hasHeader" => {
|
||
|
|
if arguments.len() != 1 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 1,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let header_name = self.execute_expression(&arguments[0])?;
|
||
|
|
Ok(request_box.has_header(header_name))
|
||
|
|
}
|
||
|
|
"getBody" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(request_box.get_body())
|
||
|
|
}
|
||
|
|
"getContentType" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(request_box.get_content_type())
|
||
|
|
}
|
||
|
|
"getContentLength" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(request_box.get_content_length())
|
||
|
|
}
|
||
|
|
_ => Err(RuntimeError::UndefinedMethod {
|
||
|
|
method: method.to_string(),
|
||
|
|
object_type: "HTTPRequestBox".to_string(),
|
||
|
|
}),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// HTTPResponseBox methods
|
||
|
|
pub(in crate::interpreter) fn execute_http_response_method(
|
||
|
|
&mut self,
|
||
|
|
response_box: &HTTPResponseBox,
|
||
|
|
method: &str,
|
||
|
|
arguments: &[ASTNode]
|
||
|
|
) -> Result<Box<dyn NyashBox>, RuntimeError> {
|
||
|
|
match method {
|
||
|
|
"setStatus" => {
|
||
|
|
if arguments.len() != 2 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 2,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let code = self.execute_expression(&arguments[0])?;
|
||
|
|
let message = self.execute_expression(&arguments[1])?;
|
||
|
|
Ok(response_box.set_status(code, message))
|
||
|
|
}
|
||
|
|
"setHeader" => {
|
||
|
|
if arguments.len() != 2 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 2,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let name = self.execute_expression(&arguments[0])?;
|
||
|
|
let value = self.execute_expression(&arguments[1])?;
|
||
|
|
Ok(response_box.set_header(name, value))
|
||
|
|
}
|
||
|
|
"setContentType" => {
|
||
|
|
if arguments.len() != 1 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 1,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let content_type = self.execute_expression(&arguments[0])?;
|
||
|
|
Ok(response_box.set_content_type(content_type))
|
||
|
|
}
|
||
|
|
"setBody" => {
|
||
|
|
if arguments.len() != 1 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 1,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let content = self.execute_expression(&arguments[0])?;
|
||
|
|
Ok(response_box.set_body(content))
|
||
|
|
}
|
||
|
|
"appendBody" => {
|
||
|
|
if arguments.len() != 1 {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 1,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
let content = self.execute_expression(&arguments[0])?;
|
||
|
|
Ok(response_box.append_body(content))
|
||
|
|
}
|
||
|
|
"toHttpString" => {
|
||
|
|
if !arguments.is_empty() {
|
||
|
|
return Err(RuntimeError::WrongNumberOfArguments {
|
||
|
|
expected: 0,
|
||
|
|
actual: arguments.len(),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(response_box.to_http_string())
|
||
|
|
}
|
||
|
|
_ => Err(RuntimeError::UndefinedMethod {
|
||
|
|
method: method.to_string(),
|
||
|
|
object_type: "HTTPResponseBox".to_string(),
|
||
|
|
}),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|