Fixed location header bug & added graceful quit
This commit is contained in:
+69
-5
@@ -6,14 +6,18 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/gob"
|
"encoding/gob"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
"os/signal"
|
||||||
"sync"
|
"sync"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
"github.com/go-yaml/yaml"
|
"github.com/go-yaml/yaml"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
@@ -24,6 +28,41 @@ import (
|
|||||||
var config_t Config
|
var config_t Config
|
||||||
var http_port string
|
var http_port string
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function gets:
|
||||||
|
* id: uuid
|
||||||
|
* p2p: pointer to the peer connection
|
||||||
|
* conn: pointer to the websocket connection
|
||||||
|
* Gracefully quits the program by closing connections.
|
||||||
|
*/
|
||||||
|
func quit(id uuid.UUID, p2p *webrtc.PeerConnection, conn *websocket.Conn) {
|
||||||
|
if p2p != nil {
|
||||||
|
p2p_close_error := p2p.Close()
|
||||||
|
if p2p_close_error != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, config_t.Messages.WEBRTC.CLOSE.ERROR, p2p_close_error)
|
||||||
|
} else {
|
||||||
|
fmt.Print(config_t.Messages.WEBRTC.CLOSE.SUCCESS)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ws_close_msg := websocket.FormatCloseMessage(1000, id.String())
|
||||||
|
ws_close_msg_error := conn.WriteMessage(websocket.CloseMessage, ws_close_msg)
|
||||||
|
if ws_close_msg_error != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, config_t.Messages.WS.CLOSE_MESSAGE.ERROR, ws_close_msg_error)
|
||||||
|
} else {
|
||||||
|
fmt.Print(config_t.Messages.WS.CLOSE_MESSAGE.SUCCESS)
|
||||||
|
}
|
||||||
|
|
||||||
|
ws_close_error := conn.Close()
|
||||||
|
if ws_close_error != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, config_t.Messages.WS.CLOSE.ERROR, ws_close_error)
|
||||||
|
} else {
|
||||||
|
fmt.Print(config_t.Messages.WS.CLOSE.SUCCESS)
|
||||||
|
}
|
||||||
|
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function gets:
|
* This function gets:
|
||||||
* pending_mutex: pointer to mutex
|
* pending_mutex: pointer to mutex
|
||||||
@@ -90,6 +129,18 @@ func httpHandler(pending_mutex *sync.Mutex, pending map[string]chan Response,
|
|||||||
// Setting HTTP headers and writing response
|
// Setting HTTP headers and writing response
|
||||||
for key, vals := range response.Headers {
|
for key, vals := range response.Headers {
|
||||||
for _, val := range vals {
|
for _, val := range vals {
|
||||||
|
// Updating Location header - needed for HTTP redirects
|
||||||
|
if key == "Location" {
|
||||||
|
redirect_url, url_parse_error := url.Parse(val)
|
||||||
|
if url_parse_error != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, config_t.Messages.HTTP.URL_PARSE.ERROR, url_parse_error)
|
||||||
|
os.Exit(-1)
|
||||||
|
} else {
|
||||||
|
fmt.Print(config_t.Messages.HTTP.URL_PARSE.SUCCESS)
|
||||||
|
redirect_url.Host = redirect_url.Hostname() + ":" + http_port
|
||||||
|
val = redirect_url.String()
|
||||||
|
}
|
||||||
|
}
|
||||||
w.Header().Add(key, val)
|
w.Header().Add(key, val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -393,11 +444,24 @@ func main() {
|
|||||||
|
|
||||||
// Attempt to close WebSocket connection on quit
|
// Attempt to close WebSocket connection on quit
|
||||||
defer func() {
|
defer func() {
|
||||||
ws_close_error := conn.Close()
|
quit(id, p2p, conn)
|
||||||
if ws_close_error != nil {
|
}()
|
||||||
fmt.Fprintf(os.Stderr, config_t.Messages.WS.CLOSE.ERROR, ws_close_error)
|
|
||||||
} else {
|
// Handling SIGINT and SIGTERM signals
|
||||||
fmt.Print(config_t.Messages.WS.CLOSE.SUCCESS)
|
signal_channel := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(signal_channel, syscall.SIGINT, syscall.SIGTERM)
|
||||||
|
go func() {
|
||||||
|
<-signal_channel
|
||||||
|
quit(id, p2p, conn)
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Handling exit command
|
||||||
|
go func() {
|
||||||
|
scanner := bufio.NewScanner(os.Stdin)
|
||||||
|
for scanner.Scan() {
|
||||||
|
if scanner.Text() == "exit" {
|
||||||
|
quit(id, p2p, conn)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user