Most of the arguments in the BeforeNavigate2 event are read only. The only affect you are allowed to have on the request itself is to allow it or cancel it. This is for security reasons I believe and works the same with Shell.Explorer.
If you want to modify the request you have to cancel it and do a new navigate with the modified URL, headers, or post data.
To read the values of headers and post data you do what it sounds like you are doing.
DEF OBJECT url
DEF OBJECT flags
DEF OBJECT targetFrameName
DEF OBJECT headers
DEF OBJECT postData
MSGBOX "url="+url'val$+" flags="+STR(flags'val)+" targetFrameName="+targetFrameName'val$+" headers="+headers'val$+" postData="+postData'val$,"INFO"
Note that post data will only be present on a POST request and not a usual GET request. Headers also does not mean response headers as this is being called before the request is issued so there is no response. Headers are any additional headers set when the request is made. This is not something done often and if the navigation happened using our navigate method for *browser then we know for sure it didn't happen because our code does not set any request headers.