From b59b29a534578cb1910a21a394d0279cb423c2b2 Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Fri, 20 Oct 2023 14:20:00 +0200 Subject: feat(plugins): web requests api (#2879) * feat(plugins): web requests api * fix e2e tests * fix e2e tests again --- zellij-utils/src/plugin_api/event.proto | 14 ++++ zellij-utils/src/plugin_api/event.rs | 41 +++++++++++ zellij-utils/src/plugin_api/plugin_command.proto | 17 +++++ zellij-utils/src/plugin_api/plugin_command.rs | 80 ++++++++++++++++++++-- .../src/plugin_api/plugin_permission.proto | 1 + zellij-utils/src/plugin_api/plugin_permission.rs | 2 + 6 files changed, 151 insertions(+), 4 deletions(-) (limited to 'zellij-utils/src/plugin_api') diff --git a/zellij-utils/src/plugin_api/event.proto b/zellij-utils/src/plugin_api/event.proto index 1463d8f0b..cfffe06f5 100644 --- a/zellij-utils/src/plugin_api/event.proto +++ b/zellij-utils/src/plugin_api/event.proto @@ -41,6 +41,7 @@ enum EventType { PermissionRequestResult = 15; SessionUpdate = 16; RunCommandResult = 17; + WebRequestResult = 18; } message EventNameList { @@ -63,6 +64,7 @@ message Event { PermissionRequestResultPayload permission_request_result_payload = 12; SessionUpdatePayload session_update_payload = 13; RunCommandResultPayload run_command_result_payload = 14; + WebRequestResultPayload web_request_result_payload = 15; } } @@ -77,11 +79,23 @@ message RunCommandResultPayload { repeated ContextItem context = 4; } +message WebRequestResultPayload { + int32 status = 1; + repeated Header headers = 2; + bytes body = 3; + repeated ContextItem context = 4; +} + message ContextItem { string name = 1; string value = 2; } +message Header { + string name = 1; + string value = 2; +} + message PermissionRequestResultPayload { bool granted = 1; } diff --git a/zellij-utils/src/plugin_api/event.rs b/zellij-utils/src/plugin_api/event.rs index 6547f383c..a322ec3bf 100644 --- a/zellij-utils/src/plugin_api/event.rs +++ b/zellij-utils/src/plugin_api/event.rs @@ -198,6 +198,25 @@ impl TryFrom for Event { }, _ => Err("Malformed payload for the RunCommandResult Event"), }, + Some(ProtobufEventType::WebRequestResult) => match protobuf_event.payload { + Some(ProtobufEventPayload::WebRequestResultPayload(web_request_result_payload)) => { + Ok(Event::WebRequestResult( + web_request_result_payload.status as u16, + web_request_result_payload + .headers + .into_iter() + .map(|h| (h.name, h.value)) + .collect(), + web_request_result_payload.body, + web_request_result_payload + .context + .into_iter() + .map(|c_i| (c_i.name, c_i.value)) + .collect(), + )) + }, + _ => Err("Malformed payload for the WebRequestResult Event"), + }, None => Err("Unknown Protobuf Event"), } } @@ -370,6 +389,26 @@ impl TryFrom for ProtobufEvent { )), }) }, + Event::WebRequestResult(status, headers, body, context) => { + let web_request_result_payload = WebRequestResultPayload { + status: status as i32, + headers: headers + .into_iter() + .map(|(name, value)| Header { name, value }) + .collect(), + body, + context: context + .into_iter() + .map(|(name, value)| ContextItem { name, value }) + .collect(), + }; + Ok(ProtobufEvent { + name: ProtobufEventType::WebRequestResult as i32, + payload: Some(event::Payload::WebRequestResultPayload( + web_request_result_payload, + )), + }) + }, } } } @@ -816,6 +855,7 @@ impl TryFrom for EventType { ProtobufEventType::PermissionRequestResult => EventType::PermissionRequestResult, ProtobufEventType::SessionUpdate => EventType::SessionUpdate, ProtobufEventType::RunCommandResult => EventType::RunCommandResult, + ProtobufEventType::WebRequestResult => EventType::WebRequestResult, }) } } @@ -842,6 +882,7 @@ impl TryFrom for ProtobufEventType { EventType::PermissionRequestResult => ProtobufEventType::PermissionRequestResult, EventType::SessionUpdate => ProtobufEventType::SessionUpdate, EventType::RunCommandResult => ProtobufEventType::RunCommandResult, + EventType::WebRequestResult => ProtobufEventType::WebRequestResult, }) } } diff --git a/zellij-utils/src/plugin_api/plugin_command.proto b/zellij-utils/src/plugin_api/plugin_command.proto index e0b261847..93e7d6b2b 100644 --- a/zellij-utils/src/plugin_api/plugin_command.proto +++ b/zellij-utils/src/plugin_api/plugin_command.proto @@ -83,6 +83,7 @@ enum CommandName { OpenCommandInPlace = 69; OpenFileInPlace = 70; RunCommand = 71; + WebRequest = 72; } message PluginCommand { @@ -130,6 +131,7 @@ message PluginCommand { OpenFilePayload open_terminal_in_place_payload = 41; OpenCommandPanePayload open_command_pane_in_place_payload = 42; RunCommandPayload run_command_payload = 43; + WebRequestPayload web_request_payload = 44; } } @@ -179,6 +181,21 @@ message RunCommandPayload { repeated ContextItem context = 4; } +message WebRequestPayload { + string url = 1; + HttpVerb verb = 2; + repeated event.Header headers = 3; + bytes body = 4; + repeated ContextItem context = 5; +} + +enum HttpVerb { + Get = 0; + Post = 1; + Put = 2; + Delete = 3; +} + message EnvVariable { string name = 1; string value = 2; diff --git a/zellij-utils/src/plugin_api/plugin_command.rs b/zellij-utils/src/plugin_api/plugin_command.rs index 181953d41..84c083ad5 100644 --- a/zellij-utils/src/plugin_api/plugin_command.rs +++ b/zellij-utils/src/plugin_api/plugin_command.rs @@ -1,24 +1,47 @@ pub use super::generated_api::api::{ action::{PaneIdAndShouldFloat, SwitchToModePayload}, - event::EventNameList as ProtobufEventNameList, + event::{EventNameList as ProtobufEventNameList, Header}, input_mode::InputMode as ProtobufInputMode, plugin_command::{ plugin_command::Payload, CommandName, ContextItem, EnvVariable, ExecCmdPayload, - IdAndNewName, MovePayload, OpenCommandPanePayload, OpenFilePayload, - PluginCommand as ProtobufPluginCommand, PluginMessagePayload, + HttpVerb as ProtobufHttpVerb, IdAndNewName, MovePayload, OpenCommandPanePayload, + OpenFilePayload, PluginCommand as ProtobufPluginCommand, PluginMessagePayload, RequestPluginPermissionPayload, ResizePayload, RunCommandPayload, SetTimeoutPayload, SubscribePayload, SwitchSessionPayload, SwitchTabToPayload, UnsubscribePayload, + WebRequestPayload, }, plugin_permission::PermissionType as ProtobufPermissionType, resize::ResizeAction as ProtobufResizeAction, }; -use crate::data::{ConnectToSession, PermissionType, PluginCommand}; +use crate::data::{ConnectToSession, HttpVerb, PermissionType, PluginCommand}; use std::collections::BTreeMap; use std::convert::TryFrom; use std::path::PathBuf; +impl Into for ProtobufHttpVerb { + fn into(self) -> HttpVerb { + match self { + ProtobufHttpVerb::Get => HttpVerb::Get, + ProtobufHttpVerb::Post => HttpVerb::Post, + ProtobufHttpVerb::Put => HttpVerb::Put, + ProtobufHttpVerb::Delete => HttpVerb::Delete, + } + } +} + +impl Into for HttpVerb { + fn into(self) -> ProtobufHttpVerb { + match self { + HttpVerb::Get => ProtobufHttpVerb::Get, + HttpVerb::Post => ProtobufHttpVerb::Post, + HttpVerb::Put => ProtobufHttpVerb::Put, + HttpVerb::Delete => ProtobufHttpVerb::Delete, + } + } +} + impl TryFrom for PluginCommand { type Error = &'static str; fn try_from(protobuf_plugin_command: ProtobufPluginCommand) -> Result { @@ -577,6 +600,34 @@ impl TryFrom for PluginCommand { }, _ => Err("Mismatched payload for RunCommand"), }, + Some(CommandName::WebRequest) => match protobuf_plugin_command.payload { + Some(Payload::WebRequestPayload(web_request_payload)) => { + let context: BTreeMap = web_request_payload + .context + .into_iter() + .map(|e| (e.name, e.value)) + .collect(); + let headers: BTreeMap = web_request_payload + .headers + .into_iter() + .map(|e| (e.name, e.value)) + .collect(); + let verb = match ProtobufHttpVerb::from_i32(web_request_payload.verb) { + Some(verb) => verb.into(), + None => { + return Err("Unrecognized http verb"); + }, + }; + Ok(PluginCommand::WebRequest( + web_request_payload.url, + verb, + headers, + web_request_payload.body, + context, + )) + }, + _ => Err("Mismatched payload for WebRequest"), + }, None => Err("Unrecognized plugin command"), } } @@ -972,6 +1023,27 @@ impl TryFrom for ProtobufPluginCommand { })), }) }, + PluginCommand::WebRequest(url, verb, headers, body, context) => { + let context: Vec<_> = context + .into_iter() + .map(|(name, value)| ContextItem { name, value }) + .collect(); + let headers: Vec<_> = headers + .into_iter() + .map(|(name, value)| Header { name, value }) + .collect(); + let verb: ProtobufHttpVerb = verb.into(); + Ok(ProtobufPluginCommand { + name: CommandName::WebRequest as i32, + payload: Some(Payload::WebRequestPayload(WebRequestPayload { + url, + verb: verb as i32, + body, + headers, + context, + })), + }) + }, } } } diff --git a/zellij-utils/src/plugin_api/plugin_permission.proto b/zellij-utils/src/plugin_api/plugin_permission.proto index 50072b1bb..a796c7481 100644 --- a/zellij-utils/src/plugin_api/plugin_permission.proto +++ b/zellij-utils/src/plugin_api/plugin_permission.proto @@ -9,4 +9,5 @@ enum PermissionType { RunCommands = 3; OpenTerminalsOrPlugins = 4; WriteToStdin = 5; + WebAccess = 6; } diff --git a/zellij-utils/src/plugin_api/plugin_permission.rs b/zellij-utils/src/plugin_api/plugin_permission.rs index d2839face..c9f0d49f5 100644 --- a/zellij-utils/src/plugin_api/plugin_permission.rs +++ b/zellij-utils/src/plugin_api/plugin_permission.rs @@ -19,6 +19,7 @@ impl TryFrom for PermissionType { Ok(PermissionType::OpenTerminalsOrPlugins) }, ProtobufPermissionType::WriteToStdin => Ok(PermissionType::WriteToStdin), + ProtobufPermissionType::WebAccess => Ok(PermissionType::WebAccess), } } } @@ -39,6 +40,7 @@ impl TryFrom for ProtobufPermissionType { Ok(ProtobufPermissionType::OpenTerminalsOrPlugins) }, PermissionType::WriteToStdin => Ok(ProtobufPermissionType::WriteToStdin), + PermissionType::WebAccess => Ok(ProtobufPermissionType::WebAccess), } } } -- cgit v1.2.3