cross_process_http.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package internal
  2. import (
  3. "net/http"
  4. "github.com/newrelic/go-agent/internal/cat"
  5. )
  6. // InitFromHTTPRequest initialises the TxnCrossProcess from the given request.
  7. // This is a convenience method to keep newTxn() as clean as possible, and to
  8. // support unit tests.
  9. func (txp *TxnCrossProcess) InitFromHTTPRequest(enabled bool, dt bool, reply *ConnectReply, req *http.Request) error {
  10. metadata := CrossProcessMetadata{}
  11. if req != nil {
  12. metadata = HTTPHeaderToMetadata(req.Header)
  13. }
  14. return txp.Init(enabled, dt, reply, metadata)
  15. }
  16. // AppDataToHTTPHeader encapsulates the given appData value in the correct HTTP
  17. // header.
  18. func AppDataToHTTPHeader(appData string) http.Header {
  19. header := http.Header{}
  20. if appData != "" {
  21. header.Add(cat.NewRelicAppDataName, appData)
  22. }
  23. return header
  24. }
  25. // HTTPHeaderToAppData gets the appData value from the correct HTTP header.
  26. func HTTPHeaderToAppData(header http.Header) string {
  27. if header == nil {
  28. return ""
  29. }
  30. return header.Get(cat.NewRelicAppDataName)
  31. }
  32. // HTTPHeaderToMetadata gets the cross process metadata from the relevant HTTP
  33. // headers.
  34. func HTTPHeaderToMetadata(header http.Header) CrossProcessMetadata {
  35. if header == nil {
  36. return CrossProcessMetadata{}
  37. }
  38. return CrossProcessMetadata{
  39. ID: header.Get(cat.NewRelicIDName),
  40. TxnData: header.Get(cat.NewRelicTxnName),
  41. Synthetics: header.Get(cat.NewRelicSyntheticsName),
  42. }
  43. }
  44. // MetadataToHTTPHeader creates a set of HTTP headers to represent the given
  45. // cross process metadata.
  46. func MetadataToHTTPHeader(metadata CrossProcessMetadata) http.Header {
  47. header := http.Header{}
  48. if metadata.ID != "" {
  49. header.Add(cat.NewRelicIDName, metadata.ID)
  50. }
  51. if metadata.TxnData != "" {
  52. header.Add(cat.NewRelicTxnName, metadata.TxnData)
  53. }
  54. if metadata.Synthetics != "" {
  55. header.Add(cat.NewRelicSyntheticsName, metadata.Synthetics)
  56. }
  57. return header
  58. }