mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-04 19:39:59 +08:00
106 lines
2.2 KiB
Go
106 lines
2.2 KiB
Go
//go:build windows
|
|
// +build windows
|
|
|
|
package webview
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
var _ http.ResponseWriter = &responseWriter{}
|
|
|
|
type responseWriter struct {
|
|
req *request
|
|
|
|
header http.Header
|
|
wroteHeader bool
|
|
code int
|
|
body *bytes.Buffer
|
|
|
|
finished bool
|
|
}
|
|
|
|
func (rw *responseWriter) Header() http.Header {
|
|
if rw.header == nil {
|
|
rw.header = http.Header{}
|
|
}
|
|
return rw.header
|
|
}
|
|
|
|
func (rw *responseWriter) Write(buf []byte) (int, error) {
|
|
if rw.finished {
|
|
return 0, errResponseFinished
|
|
}
|
|
|
|
rw.WriteHeader(http.StatusOK)
|
|
|
|
return rw.body.Write(buf)
|
|
}
|
|
|
|
func (rw *responseWriter) WriteHeader(code int) {
|
|
if rw.wroteHeader || rw.finished {
|
|
return
|
|
}
|
|
rw.wroteHeader = true
|
|
|
|
if rw.body == nil {
|
|
rw.body = &bytes.Buffer{}
|
|
}
|
|
|
|
rw.code = code
|
|
}
|
|
|
|
func (rw *responseWriter) Finish() error {
|
|
if !rw.wroteHeader {
|
|
rw.WriteHeader(http.StatusNotImplemented)
|
|
}
|
|
|
|
if rw.finished {
|
|
return nil
|
|
}
|
|
rw.finished = true
|
|
|
|
var errs []error
|
|
|
|
code := rw.code
|
|
if code == http.StatusNotModified {
|
|
// WebView2 has problems when a request returns a 304 status code and the WebView2 is going to hang for other
|
|
// requests including IPC calls.
|
|
errs = append(errs, fmt.Errorf("AssetServer returned 304 - StatusNotModified which are going to hang WebView2, changed code to 505 - StatusInternalServerError"))
|
|
code = http.StatusInternalServerError
|
|
}
|
|
|
|
rw.req.invokeSync(func() {
|
|
resp := rw.req.response
|
|
|
|
hdrs, err := resp.GetHeaders()
|
|
if err != nil {
|
|
errs = append(errs, fmt.Errorf("Resp.GetHeaders failed: %s", err))
|
|
} else {
|
|
for k, v := range rw.header {
|
|
if err := hdrs.AppendHeader(k, strings.Join(v, ",")); err != nil {
|
|
errs = append(errs, fmt.Errorf("Resp.AppendHeader failed: %s", err))
|
|
}
|
|
}
|
|
hdrs.Release()
|
|
}
|
|
|
|
if err := resp.PutStatusCode(code); err != nil {
|
|
errs = append(errs, fmt.Errorf("Resp.PutStatusCode failed: %s", err))
|
|
}
|
|
|
|
if err := resp.PutByteContent(rw.body.Bytes()); err != nil {
|
|
errs = append(errs, fmt.Errorf("Resp.PutByteContent failed: %s", err))
|
|
}
|
|
|
|
if err := rw.req.finishResponse(); err != nil {
|
|
errs = append(errs, fmt.Errorf("Resp.finishResponse failed: %s", err))
|
|
}
|
|
})
|
|
|
|
return combineErrs(errs)
|
|
}
|