Compare commits

...

9 Commits

Author SHA1 Message Date
Přemysl Eric Janouch 4236a4943a
WebSocket: adapt to common "await" infrastructure 2020-10-14 13:37:10 +02:00
Přemysl Eric Janouch 23c728e535
Add a backend for co-processes
Targets language servers.

In this first stage, we don't need to support bi-directionality,
although it's a requirement for finishing this task.

Updates #4
2020-10-14 13:37:08 +02:00
Přemysl Eric Janouch dfe814316f
This software is no longer simple 2020-10-14 13:36:35 +02:00
Přemysl Eric Janouch efc663a178
WebSocket: some clean-up 2020-10-14 12:25:22 +02:00
Přemysl Eric Janouch 2b8f52ac72
Split out a http-parser wrapper 2020-10-14 12:25:22 +02:00
Přemysl Eric Janouch bb7ffe1da2
Simplify the FAIL macro 2020-10-14 12:25:21 +02:00
Přemysl Eric Janouch ad1aba9d22
WebSocket: fix upgrade processing
When http-parser sets the upgrade field, it checks for status code 101
and even resolves our TODO about checking the entire Connection header.
2020-10-14 09:44:46 +02:00
Přemysl Eric Janouch 0107d09abc
json-rpc-shell.adoc: document the M-Enter binding 2020-10-14 02:37:50 +02:00
Přemysl Eric Janouch 01767198f2
WebSockets -> WebSocket
This is the correct name of the protocol, usage of the word
"WebSockets" should be limited.
2020-10-14 00:03:34 +02:00
5 changed files with 653 additions and 277 deletions

View File

@ -113,8 +113,7 @@ foreach (page ${project_MAN_PAGES})
endforeach (page)
# CPack
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY
"A shell for running JSON-RPC 2.0 queries")
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "A shell for JSON-RPC 2.0")
set (CPACK_PACKAGE_VENDOR "Premysl Eric Janouch")
set (CPACK_PACKAGE_CONTACT "Přemysl Eric Janouch <p@janouch.name>")
set (CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")

View File

@ -2,23 +2,25 @@ json-rpc-shell
==============
:compact-option:
'json-rpc-shell' is a simple shell for running JSON-RPC 2.0 queries.
'json-rpc-shell' is a shell for running JSON-RPC 2.0 queries.
This software has been created as a replacement for the following shell, which
is written in Java: http://software.dzhuvinov.com/json-rpc-2.0-shell.html
This software was originally created as a replacement for
http://software.dzhuvinov.com/json-rpc-2.0-shell.html[a different one] made by
Vladimir Dzhuvinov, in order to avoid Java, but has evolved since.
Features
--------
In addition to most of the features provided by Vladimir Dzhuvinov's shell
you get the following niceties:
In addition to most of the features provided by its predecessor, you will get
the following niceties:
- configurable JSON syntax highlight, which with prettyprinting turned on
helps you make sense of the results significantly
- ability to pipe output through a shell command, so that you can view the
results in your favourite editor or redirect them to a file
- ability to edit the input line in your favourite editor as well with Alt+E
- WebSockets (RFC 6455) can also be used as a transport rather than HTTP
- support for method name tab completion using OpenRPC discovery
- WebSocket (RFC 6455) can also be used as a transport rather than HTTP
- even Language Server Protocol servers may be launched as a slave command
- support for method name tab completion using OpenRPC discovery or file input
Documentation
-------------

View File

@ -6,11 +6,11 @@ json-rpc-shell(1)
Name
----
json-rpc-shell - a simple JSON-RPC 2.0 shell
json-rpc-shell - a shell for JSON-RPC 2.0
Synopsis
--------
*json-rpc-shell* [_OPTION_]... _ENDPOINT_
*json-rpc-shell* [_OPTION_]... { _ENDPOINT_ | _COMMAND_ [_ARG_]... }
Description
-----------
@ -80,6 +80,11 @@ Protocol
Call "rpc.discover" upon start-up in order to pull in OpenRPC data for
tab completion of method names. If a path is given, it is read from a file.
*-e*, *--execute*::
Rather than an _ENDPOINT_, accept a command line to execute and communicate
with using the JSON-RPC 2.0 protocol variation used in the Language Server
Protocol.
Program information
~~~~~~~~~~~~~~~~~~~
*-h*, *--help*::
@ -111,11 +116,11 @@ requests, it is often convenient or even necessary to run a full text editor
in order to construct complex objects or arrays, and may even be used to import
data from elsewhere. You can launch an editor for the current request using
the M-e key combination. Both *readline*(3) and *editline*(7) also support
multiline editing natively, though you need to press C-v C-j in order to insert
multiline editing natively, press either M-Enter or C-v C-j in order to insert
newlines.
WebSockets
~~~~~~~~~~
WebSocket
~~~~~~~~~
The JSON-RPC 2.0 specification doesn't say almost anything about underlying
transports. The way it's implemented here is that every request is sent as
a single text message. If it has an "id" field, i.e., it's not just

File diff suppressed because it is too large Load Diff

View File

@ -525,11 +525,11 @@ fcgi_muxer_push (struct fcgi_muxer *self, const void *data, size_t len)
}
/// @}
// --- WebSockets --------------------------------------------------------------
/// @defgroup WebSockets
// --- WebSocket ---------------------------------------------------------------
/// @defgroup WebSocket
/// @{
// WebSockets aren't CGI-compatible, therefore we must handle the initial HTTP
// WebSocket isn't CGI-compatible, therefore we must handle the initial HTTP
// handshake ourselves. Luckily it's not too much of a bother with http-parser.
// Typically there will be a normal HTTP server in front of us, proxying the
// requests based on the URI.
@ -537,7 +537,7 @@ fcgi_muxer_push (struct fcgi_muxer *self, const void *data, size_t len)
enum ws_handler_state
{
WS_HANDLER_CONNECTING, ///< Parsing HTTP
WS_HANDLER_OPEN, ///< Parsing WebSockets frames
WS_HANDLER_OPEN, ///< Parsing WebSocket frames
WS_HANDLER_CLOSING, ///< Partial closure by us
WS_HANDLER_FLUSHING, ///< Just waiting for client EOF
WS_HANDLER_CLOSED ///< Dead, both sides closed
@ -1110,7 +1110,7 @@ ws_handler_finish_handshake (struct ws_handler *self)
if (!connection || strcasecmp_ascii (connection, "Upgrade"))
FAIL_HANDSHAKE (HTTP_400_BAD_REQUEST);
// Check if we can actually upgrade the protocol to WebSockets
// Check if we can actually upgrade the protocol to WebSocket
const char *upgrade = str_map_find (&self->headers, "Upgrade");
struct http_protocol *offered_upgrades = NULL;
bool can_upgrade = false;
@ -1286,7 +1286,7 @@ static struct simple_config_item g_config_table[] =
{ "bind_host", NULL, "Address of the server" },
{ "port_fastcgi", "9000", "Port to bind for FastCGI" },
{ "port_scgi", NULL, "Port to bind for SCGI" },
{ "port_ws", NULL, "Port to bind for WebSockets" },
{ "port_ws", NULL, "Port to bind for WebSocket" },
{ "pid_file", NULL, "Full path for the PID file" },
// XXX: here belongs something like a web SPA that interfaces with us
{ "static_root", NULL, "The root for static content" },
@ -2452,12 +2452,12 @@ client_scgi_create (EV_P_ int sock_fd)
return &self->client;
}
// --- WebSockets client handler -----------------------------------------------
// --- WebSocket client handler ------------------------------------------------
struct client_ws
{
struct client client; ///< Parent class
struct ws_handler handler; ///< WebSockets connection handler
struct ws_handler handler; ///< WebSocket connection handler
};
static bool