aboutsummaryrefslogtreecommitdiffhomepage
path: root/livereload
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <[email protected]>2017-11-12 10:03:56 +0100
committerBjørn Erik Pedersen <[email protected]>2017-11-17 11:01:46 +0100
commit60dfb9a6e076200ab3ca3fd30e34bb3c14e0a893 (patch)
tree810d3d7ca40a55045fec4a0718eb7728621495e4 /livereload
parent2e0465764b5dacc511b977b1c9aa07324ad0ee9c (diff)
downloadhugo-60dfb9a6e076200ab3ca3fd30e34bb3c14e0a893.tar.gz
hugo-60dfb9a6e076200ab3ca3fd30e34bb3c14e0a893.zip
Add support for multiple staticDirs
This commit adds support for multiple statDirs both on the global and language level. A simple `config.toml` example: ```bash staticDir = ["static1", "static2"] [languages] [languages.no] staticDir = ["staticDir_override", "static_no"] baseURL = "https://example.no" languageName = "Norsk" weight = 1 title = "På norsk" [languages.en] staticDir2 = "static_en" baseURL = "https://example.com" languageName = "English" weight = 2 title = "In English" ``` In the above, with no theme used: the English site will get its static files as a union of "static1", "static2" and "static_en". On file duplicates, the right-most version will win. the Norwegian site will get its static files as a union of "staticDir_override" and "static_no". This commit also concludes the Multihost support in #4027. Fixes #36 Closes #4027
Diffstat (limited to 'livereload')
-rw-r--r--livereload/livereload.go57
1 files changed, 51 insertions, 6 deletions
diff --git a/livereload/livereload.go b/livereload/livereload.go
index 74702175f..90096577d 100644
--- a/livereload/livereload.go
+++ b/livereload/livereload.go
@@ -38,7 +38,9 @@ package livereload
import (
"fmt"
+ "net"
"net/http"
+ "net/url"
"path/filepath"
"github.com/gorilla/websocket"
@@ -47,7 +49,31 @@ import (
// Prefix to signal to LiveReload that we need to navigate to another path.
const hugoNavigatePrefix = "__hugo_navigate"
-var upgrader = &websocket.Upgrader{ReadBufferSize: 1024, WriteBufferSize: 1024}
+var upgrader = &websocket.Upgrader{
+ // Hugo may potentially spin up multiple HTTP servers, so we need to exclude the
+ // port when checking the origin.
+ CheckOrigin: func(r *http.Request) bool {
+ origin := r.Header["Origin"]
+ if len(origin) == 0 {
+ return true
+ }
+ u, err := url.Parse(origin[0])
+ if err != nil {
+ return false
+ }
+
+ h1, _, err := net.SplitHostPort(u.Host)
+ if err != nil {
+ return false
+ }
+ h2, _, err := net.SplitHostPort(r.Host)
+ if err != nil {
+ return false
+ }
+
+ return h1 == h2
+ },
+ ReadBufferSize: 1024, WriteBufferSize: 1024}
// Handler is a HandlerFunc handling the livereload
// Websocket interaction.
@@ -79,13 +105,28 @@ func NavigateToPath(path string) {
RefreshPath(hugoNavigatePrefix + path)
}
+// NavigateToPathForPort is similar to NavigateToPath but will also
+// set window.location.port to the given port value.
+func NavigateToPathForPort(path string, port int) {
+ refreshPathForPort(hugoNavigatePrefix+path, port)
+}
+
// RefreshPath tells livereload to refresh only the given path.
// If that path points to a CSS stylesheet or an image, only the changes
// will be updated in the browser, not the entire page.
func RefreshPath(s string) {
+ refreshPathForPort(s, -1)
+}
+
+func refreshPathForPort(s string, port int) {
// Tell livereload a file has changed - will force a hard refresh if not CSS or an image
urlPath := filepath.ToSlash(s)
- wsHub.broadcast <- []byte(`{"command":"reload","path":"` + urlPath + `","originalPath":"","liveCSS":true,"liveImg":true}`)
+ portStr := ""
+ if port > 0 {
+ portStr = fmt.Sprintf(`, "overrideURL": %d`, port)
+ }
+ msg := fmt.Sprintf(`{"command":"reload","path":%q,"originalPath":"","liveCSS":true,"liveImg":true%s}`, urlPath, portStr)
+ wsHub.broadcast <- []byte(msg)
}
// ServeJS serves the liverreload.js who's reference is injected into the page.
@@ -120,13 +161,17 @@ HugoReload.prototype.reload = function(path, options) {
if (path.lastIndexOf(prefix, 0) !== 0) {
return false
}
-
+
path = path.substring(prefix.length);
-
- if (window.location.pathname === path) {
+
+ if (!options.overrideURL && window.location.pathname === path) {
window.location.reload();
} else {
- window.location.href = path;
+ if (options.overrideURL) {
+ window.location = location.protocol + "//" + location.hostname + ":" + options.overrideURL + path;
+ } else {
+ window.location.pathname = path;
+ }
}
return true;