phpheaders.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package phpheaders
  2. import (
  3. "strings"
  4. "github.com/maypok86/otter"
  5. )
  6. // Translate header names to PHP header names
  7. // All headers in 'commonHeaders' can be cached and registered safely
  8. // All other headers must be sanitized
  9. // Note: net/http will capitalize lowercase headers, so we don't need to worry about case sensitivity
  10. var CommonRequestHeaders = map[string]string{
  11. "Accept": "HTTP_ACCEPT",
  12. "Accept-Charset": "HTTP_ACCEPT_CHARSET",
  13. "Accept-Encoding": "HTTP_ACCEPT_ENCODING",
  14. "Accept-Language": "HTTP_ACCEPT_LANGUAGE",
  15. "Access-Control-Request-Headers": "HTTP_ACCESS_CONTROL_REQUEST_HEADERS",
  16. "Access-Control-Request-Method": "HTTP_ACCESS_CONTROL_REQUEST_METHOD",
  17. "Authorization": "HTTP_AUTHORIZATION",
  18. "Cache-Control": "HTTP_CACHE_CONTROL",
  19. "Connection": "HTTP_CONNECTION",
  20. "Content-Disposition": "HTTP_CONTENT_DISPOSITION",
  21. "Content-Encoding": "HTTP_CONTENT_ENCODING",
  22. "Content-Length": "HTTP_CONTENT_LENGTH",
  23. "Content-Type": "HTTP_CONTENT_TYPE",
  24. "Cookie": "HTTP_COOKIE",
  25. "Date": "HTTP_DATE",
  26. "Device-Memory": "HTTP_DEVICE_MEMORY",
  27. "Dnt": "HTTP_DNT",
  28. "Downlink": "HTTP_DOWNLINK",
  29. "Dpr": "HTTP_DPR",
  30. "Early-Data": "HTTP_EARLY_DATA",
  31. "Ect": "HTTP_ECT",
  32. "Am-I": "HTTP_AM_I",
  33. "Expect": "HTTP_EXPECT",
  34. "Forwarded": "HTTP_FORWARDED",
  35. "From": "HTTP_FROM",
  36. "Host": "HTTP_HOST",
  37. "If-Match": "HTTP_IF_MATCH",
  38. "If-Modified-Since": "HTTP_IF_MODIFIED_SINCE",
  39. "If-None-Match": "HTTP_IF_NONE_MATCH",
  40. "If-Range": "HTTP_IF_RANGE",
  41. "If-Unmodified-Since": "HTTP_IF_UNMODIFIED_SINCE",
  42. "Keep-Alive": "HTTP_KEEP_ALIVE",
  43. "Max-Forwards": "HTTP_MAX_FORWARDS",
  44. "Origin": "HTTP_ORIGIN",
  45. "Pragma": "HTTP_PRAGMA",
  46. "Proxy-Authorization": "HTTP_PROXY_AUTHORIZATION",
  47. "Range": "HTTP_RANGE",
  48. "Referer": "HTTP_REFERER",
  49. "Rtt": "HTTP_RTT",
  50. "Save-Data": "HTTP_SAVE_DATA",
  51. "Sec-Ch-Ua": "HTTP_SEC_CH_UA",
  52. "Sec-Ch-Ua-Arch": "HTTP_SEC_CH_UA_ARCH",
  53. "Sec-Ch-Ua-Bitness": "HTTP_SEC_CH_UA_BITNESS",
  54. "Sec-Ch-Ua-Full-Version": "HTTP_SEC_CH_UA_FULL_VERSION",
  55. "Sec-Ch-Ua-Full-Version-List": "HTTP_SEC_CH_UA_FULL_VERSION_LIST",
  56. "Sec-Ch-Ua-Mobile": "HTTP_SEC_CH_UA_MOBILE",
  57. "Sec-Ch-Ua-Model": "HTTP_SEC_CH_UA_MODEL",
  58. "Sec-Ch-Ua-Platform": "HTTP_SEC_CH_UA_PLATFORM",
  59. "Sec-Ch-Ua-Platform-Version": "HTTP_SEC_CH_UA_PLATFORM_VERSION",
  60. "Sec-Fetch-Dest": "HTTP_SEC_FETCH_DEST",
  61. "Sec-Fetch-Mode": "HTTP_SEC_FETCH_MODE",
  62. "Sec-Fetch-Site": "HTTP_SEC_FETCH_SITE",
  63. "Sec-Fetch-User": "HTTP_SEC_FETCH_USER",
  64. "Sec-Gpc": "HTTP_SEC_GPC",
  65. "Service-Worker-Navigation-Preload": "HTTP_SERVICE_WORKER_NAVIGATION_PRELOAD",
  66. "Te": "HTTP_TE",
  67. "Priority": "HTTP_PRIORITY",
  68. "Trailer": "HTTP_TRAILER",
  69. "Transfer-Encoding": "HTTP_TRANSFER_ENCODING",
  70. "Upgrade": "HTTP_UPGRADE",
  71. "Upgrade-Insecure-Requests": "HTTP_UPGRADE_INSECURE_REQUESTS",
  72. "User-Agent": "HTTP_USER_AGENT",
  73. "Via": "HTTP_VIA",
  74. "Viewport-Width": "HTTP_VIEWPORT_WIDTH",
  75. "Want-Digest": "HTTP_WANT_DIGEST",
  76. "Warning": "HTTP_WARNING",
  77. "Width": "HTTP_WIDTH",
  78. "X-Forwarded-For": "HTTP_X_FORWARDED_FOR",
  79. "X-Forwarded-Host": "HTTP_X_FORWARDED_HOST",
  80. "X-Forwarded-Proto": "HTTP_X_FORWARDED_PROTO",
  81. "A-Im": "HTTP_A_IM",
  82. "Accept-Datetime": "HTTP_ACCEPT_DATETIME",
  83. "Content-Md5": "HTTP_CONTENT_MD5",
  84. "Http2-Settings": "HTTP_HTTP2_SETTINGS",
  85. "Prefer": "HTTP_PREFER",
  86. "X-Requested-With": "HTTP_X_REQUESTED_WITH",
  87. "Front-End-Https": "HTTP_FRONT_END_HTTPS",
  88. "X-Http-Method-Override": "HTTP_X_HTTP_METHOD_OVERRIDE",
  89. "X-Att-Deviceid": "HTTP_X_ATT_DEVICEID",
  90. "X-Wap-Profile": "HTTP_X_WAP_PROFILE",
  91. "Proxy-Connection": "HTTP_PROXY_CONNECTION",
  92. "X-Uidh": "HTTP_X_UIDH",
  93. "X-Csrf-Token": "HTTP_X_CSRF_TOKEN",
  94. "X-Request-Id": "HTTP_X_REQUEST_ID",
  95. "X-Correlation-Id": "HTTP_X_CORRELATION_ID",
  96. // Additional CDN/Framework headers
  97. "Cloudflare-Visitor": "HTTP_CLOUDFLARE_VISITOR",
  98. "Cloudfront-Viewer-Address": "HTTP_CLOUDFRONT_VIEWER_ADDRESS",
  99. "Cloudfront-Viewer-Country": "HTTP_CLOUDFRONT_VIEWER_COUNTRY",
  100. "X-Amzn-Trace-Id": "HTTP_X_AMZN_TRACE_ID",
  101. "X-Cloud-Trace-Context": "HTTP_X_CLOUD_TRACE_CONTEXT",
  102. "Cf-Ray": "HTTP_CF_RAY",
  103. "Cf-Visitor": "HTTP_CF_VISITOR",
  104. "Cf-Request-Id": "HTTP_CF_REQUEST_ID",
  105. "Cf-Ipcountry": "HTTP_CF_IPCOUNTRY",
  106. "X-Device-Type": "HTTP_X_DEVICE_TYPE",
  107. "X-Network-Info": "HTTP_X_NETWORK_INFO",
  108. "X-Client-Id": "HTTP_X_CLIENT_ID",
  109. "X-Livewire": "HTTP_X_LIVEWIRE",
  110. }
  111. // Cache up to 256 uncommon headers
  112. // This is ~2.5x faster than converting the header each time
  113. var headerKeyCache = func() otter.Cache[string, string] {
  114. c, err := otter.MustBuilder[string, string](256).Build()
  115. if err != nil {
  116. panic(err)
  117. }
  118. return c
  119. }()
  120. var headerNameReplacer = strings.NewReplacer(" ", "_", "-", "_")
  121. func GetUnCommonHeader(key string) string {
  122. phpHeaderKey, ok := headerKeyCache.Get(key)
  123. if !ok {
  124. phpHeaderKey = "HTTP_" + headerNameReplacer.Replace(strings.ToUpper(key)) + "\x00"
  125. headerKeyCache.SetIfAbsent(key, phpHeaderKey)
  126. }
  127. return phpHeaderKey
  128. }