11package handler
22
33import (
4+ "runtime"
45 "unsafe"
56
67 "github.com/http-wasm/http-wasm-guest-tinygo/handler/api"
@@ -30,9 +31,11 @@ func (w wasmHeader) Names() (names []string) {
3031 }
3132 // Otherwise, we have to allocate a new buffer for the large entry.
3233 buf := make ([]byte , size )
33- ptr := uintptr (unsafe .Pointer (& buf [0 ]))
34- _ = imports .GetHeaderNames (imports .HeaderKind (w ), ptr , size )
35- return mem .GetNULTerminated (buf )
34+ ptr := unsafe .Pointer (unsafe .SliceData (buf ))
35+ _ = imports .GetHeaderNames (imports .HeaderKind (w ), uintptr (ptr ), size )
36+ names = mem .GetNULTerminated (buf )
37+ runtime .KeepAlive (buf ) // keep buf alive until ptr is no longer needed.
38+ return
3639}
3740
3841// Get implements the same method as documented on api.Request.
@@ -48,10 +51,12 @@ func (w wasmHeader) Get(name string) (value string, ok bool) {
4851// GetAll implements the same method as documented on api.Request.
4952func (w wasmHeader ) GetAll (name string ) (names []string ) {
5053 namePtr , nameSize := mem .StringToPtr (name )
51- countLen := imports .GetHeaderValues (imports .HeaderKind (w ), namePtr , nameSize , mem .ReadBufPtr , mem .ReadBufLimit )
54+ countLen := imports .GetHeaderValues (imports .HeaderKind (w ), uintptr (namePtr ), nameSize , mem .ReadBufPtr , mem .ReadBufLimit )
55+ runtime .KeepAlive (name ) // keep name alive until ptr is no longer needed.
5256 if countLen == 0 {
5357 return
5458 }
59+
5560 size := uint32 (countLen )
5661 if size == 0 {
5762 return
@@ -61,27 +66,35 @@ func (w wasmHeader) GetAll(name string) (names []string) {
6166 }
6267 // Otherwise, we have to allocate a new buffer for the large entry.
6368 buf := make ([]byte , size )
64- ptr := uintptr (unsafe .Pointer (& buf [0 ]))
65- _ = imports .GetHeaderValues (imports .HeaderKind (w ), namePtr , nameSize , ptr , size )
66- return mem .GetNULTerminated (buf )
69+ ptr := unsafe .Pointer (unsafe .SliceData (buf ))
70+ _ = imports .GetHeaderValues (imports .HeaderKind (w ), uintptr (namePtr ), nameSize , uintptr (ptr ), size )
71+ names = mem .GetNULTerminated (buf )
72+ runtime .KeepAlive (name ) // keep name alive until ptr is no longer needed.
73+ runtime .KeepAlive (buf ) // keep buf alive until ptr is no longer needed.
74+ return
6775}
6876
6977// Set implements the same method as documented on api.Request.
7078func (w wasmHeader ) Set (name , value string ) {
7179 namePtr , nameSize := mem .StringToPtr (name )
7280 valuePtr , valueSize := mem .StringToPtr (value )
73- imports .SetHeaderValue (imports .HeaderKind (w ), namePtr , nameSize , valuePtr , valueSize )
81+ imports .SetHeaderValue (imports .HeaderKind (w ), uintptr (namePtr ), nameSize , uintptr (valuePtr ), valueSize )
82+ runtime .KeepAlive (name ) // keep name alive until ptr is no longer needed.
83+ runtime .KeepAlive (value ) // keep value alive until ptr is no longer needed.
7484}
7585
7686// Add implements the same method as documented on api.Request.
7787func (w wasmHeader ) Add (name , value string ) {
7888 namePtr , nameSize := mem .StringToPtr (name )
7989 valuePtr , valueSize := mem .StringToPtr (value )
80- imports .AddHeaderValue (imports .HeaderKind (w ), namePtr , nameSize , valuePtr , valueSize )
90+ imports .AddHeaderValue (imports .HeaderKind (w ), uintptr (namePtr ), nameSize , uintptr (valuePtr ), valueSize )
91+ runtime .KeepAlive (name ) // keep name alive until ptr is no longer needed.
92+ runtime .KeepAlive (value ) // keep value alive until ptr is no longer needed.
8193}
8294
8395// Remove implements the same method as documented on api.Request.
8496func (w wasmHeader ) Remove (name string ) {
8597 namePtr , nameSize := mem .StringToPtr (name )
86- imports .RemoveHeader (imports .HeaderKind (w ), namePtr , nameSize )
98+ imports .RemoveHeader (imports .HeaderKind (w ), uintptr (namePtr ), nameSize )
99+ runtime .KeepAlive (name ) // keep name alive until ptr is no longer needed.
87100}
0 commit comments