diff --git a/backend/handlers/onlyoffice.go b/backend/handlers/onlyoffice.go index 10b99a2..7ca9e97 100644 --- a/backend/handlers/onlyoffice.go +++ b/backend/handlers/onlyoffice.go @@ -6,6 +6,7 @@ import ( "net/http" "os" "path/filepath" + "strings" "git.elijahkuntz.com/Elijah/drive/config" "git.elijahkuntz.com/Elijah/drive/middleware" @@ -48,8 +49,15 @@ func (h *OnlyOfficeHandler) Callback(c *fiber.Ctx) error { return c.Status(400).JSON(fiber.Map{"error": "url required"}) } + // If the server cannot resolve the public URL due to hairpin NAT, + // we can rewrite it to use the internal Docker IP + downloadUrl := req.Url + if strings.HasPrefix(downloadUrl, "https://office.elijahkuntz.com") { + downloadUrl = strings.Replace(downloadUrl, "https://office.elijahkuntz.com", "http://192.168.50.81:8084", 1) + } + // Download modified file from Document Server - resp, err := http.Get(req.Url) + resp, err := http.Get(downloadUrl) if err != nil { return c.Status(500).JSON(fiber.Map{"error": "failed to download file"}) } diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index 1e68c03..f9306e7 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -473,7 +473,7 @@ class ApiClient { async createOnlyOfficeFile(type: 'word' | 'slide') { const res = await this.request('/api/onlyoffice/create', { method: 'POST', - body: JSON.stringify({ type }) + body: { type } }); return res.json(); } @@ -481,7 +481,7 @@ class ApiClient { async signOnlyOfficeConfig(config: any) { const res = await this.request('/api/onlyoffice/sign', { method: 'POST', - body: JSON.stringify(config) + body: config }); return res.json(); }