-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathreceiver.el
99 lines (80 loc) · 2.8 KB
/
receiver.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
;;; receiver.el --- a quick and easy tunnel to listen to the outside world
;;
;; Public domain.
;;; Commentary:
;;
;; Requires beame-insta-ssl to be install.
;;; Code:
;;
(require 'json)
(require 'elnode)
(defgroup receiver nil
"A quick and easy tunnel to listen to the outside world"
:group 'tools)
(defcustom receiver-port 8010
"The port number at which to listen."
:group 'receiver
:type 'integer)
(defcustom receiver-tunnel-command "beame-insta-ssl tunnel %p http"
"The command to use to start the tunnel, where %p is replaced by the port."
:group 'receiver
:type 'string)
(defcustom receiver-tunnel-buffer-name "receiver"
"Name for tunnel process buffer."
:group 'receiver
:type 'string)
(defcustom receiver-request-buffer-name "*HTTP Request*"
"Name for request buffer."
:group 'receiver
:type 'string)
(defcustom receiver-response-code 200
"The HTTP code to send in response."
:group 'receiver
:type 'integer)
(defcustom receiver-response-content-type "text/plain"
"The content-type header to send in response."
:group 'receiver
:type 'string)
(defcustom receiver-response-body ""
"The body to send in response."
:group 'receiver
:type 'string)
(defvar receiver-request-received-hook nil
"Hook run after request buffer created and data loaded.")
(defun receiver--handler (httpcon)
"The elnode response handler. HTTPCON: the elnode request map."
(let* ((params (elnode-http-params httpcon))
(json (car (car params))))
(get-buffer-create receiver-request-buffer-name)
(with-current-buffer receiver-request-buffer-name
(save-excursion
(erase-buffer)
(princ json (current-buffer))
(ignore-errors (json-pretty-print-buffer))
(js-mode)
(run-hooks 'receiver-request-received-hook))))
(elnode-http-start httpcon receiver-response-code '("Content-type" . receiver-response-content-type))
(elnode-http-return httpcon receiver-response-body))
(defun receiver--start-tunnel ()
"Start the tunnel connection."
(start-process-shell-command receiver-tunnel-buffer-name
receiver-tunnel-buffer-name
(format-spec receiver-tunnel-command (format-spec-make ?p receiver-port))))
(defun receiver--kill-tunnel ()
"Kill the tunnel connection."
(ignore-errors (kill-process receiver-tunnel-buffer-name))
(kill-buffer receiver-tunnel-buffer-name))
(defun receiver-listen ()
"Start listening."
(interactive)
(elnode-start 'receiver--handler :port receiver-port)
(receiver--start-tunnel)
(message "receiver is listening on port %s" receiver-port))
(defun receiver-hangup ()
"Stop listening."
(interactive)
(receiver--kill-tunnel)
(elnode-stop receiver-port)
(message "receiver hung up on port %s" receiver-port))
(provide 'receiver)
;;; receiver.el ends here