github.com/AlpineAIO/wails/v2@v2.0.0-beta.32.0.20240505041856-1047a8fa5fef/pkg/assetserver/webview/webkit2_36+.go (about)

     1  //go:build linux && (webkit2_36 || webkit2_40)
     2  
     3  package webview
     4  
     5  /*
     6  #cgo linux pkg-config: gtk+-3.0 webkit2gtk-4.0 libsoup-2.4
     7  
     8  #include "gtk/gtk.h"
     9  #include "webkit2/webkit2.h"
    10  #include "libsoup/soup.h"
    11  */
    12  import "C"
    13  
    14  import (
    15  	"net/http"
    16  	"strings"
    17  	"unsafe"
    18  )
    19  
    20  func webkit_uri_scheme_request_get_http_method(req *C.WebKitURISchemeRequest) string {
    21  	method := C.GoString(C.webkit_uri_scheme_request_get_http_method(req))
    22  	return strings.ToUpper(method)
    23  }
    24  
    25  func webkit_uri_scheme_request_get_http_headers(req *C.WebKitURISchemeRequest) http.Header {
    26  	hdrs := C.webkit_uri_scheme_request_get_http_headers(req)
    27  
    28  	var iter C.SoupMessageHeadersIter
    29  	C.soup_message_headers_iter_init(&iter, hdrs)
    30  
    31  	var name *C.char
    32  	var value *C.char
    33  
    34  	h := http.Header{}
    35  	for C.soup_message_headers_iter_next(&iter, &name, &value) != 0 {
    36  		h.Add(C.GoString(name), C.GoString(value))
    37  	}
    38  
    39  	return h
    40  }
    41  
    42  func webkit_uri_scheme_request_finish(req *C.WebKitURISchemeRequest, code int, header http.Header, stream *C.GInputStream, streamLength int64) error {
    43  	resp := C.webkit_uri_scheme_response_new(stream, C.gint64(streamLength))
    44  	defer C.g_object_unref(C.gpointer(resp))
    45  
    46  	cReason := C.CString(http.StatusText(code))
    47  	C.webkit_uri_scheme_response_set_status(resp, C.guint(code), cReason)
    48  	C.free(unsafe.Pointer(cReason))
    49  
    50  	cMimeType := C.CString(header.Get(HeaderContentType))
    51  	C.webkit_uri_scheme_response_set_content_type(resp, cMimeType)
    52  	C.free(unsafe.Pointer(cMimeType))
    53  
    54  	hdrs := C.soup_message_headers_new(C.SOUP_MESSAGE_HEADERS_RESPONSE)
    55  	for name, values := range header {
    56  		cName := C.CString(name)
    57  		for _, value := range values {
    58  			cValue := C.CString(value)
    59  			C.soup_message_headers_append(hdrs, cName, cValue)
    60  			C.free(unsafe.Pointer(cValue))
    61  		}
    62  		C.free(unsafe.Pointer(cName))
    63  	}
    64  
    65  	C.webkit_uri_scheme_response_set_http_headers(resp, hdrs)
    66  
    67  	C.webkit_uri_scheme_request_finish_with_response(req, resp)
    68  	return nil
    69  }