From c3428e3ca7579dd42c849d623de39a41beb1bca8 Mon Sep 17 00:00:00 2001 From: "Ian A. Sawyer" <49376379+ian-a-sawyer@users.noreply.github.com> Date: Mon, 5 Dec 2022 17:55:39 -0500 Subject: [PATCH] BCDA-6109: Remove jobId/clientId headers for non-bulk requests (#812) --- bcda/client/bluebutton.go | 30 +++++++++++------ bcda/client/bluebutton_test.go | 59 ++++++++++++++++++++++++++++++++-- bcda/constants/constants.go | 3 ++ 3 files changed, 81 insertions(+), 11 deletions(-) diff --git a/bcda/client/bluebutton.go b/bcda/client/bluebutton.go index 201d42049..e49deb9cf 100644 --- a/bcda/client/bluebutton.go +++ b/bcda/client/bluebutton.go @@ -295,7 +295,7 @@ func (bbc *BlueButtonClient) tryBundleRequest(u *url.URL, jobID, cmsID string, h } queryID := uuid.NewRandom() - addRequestHeaders(req, queryID, jobID, cmsID) + addBulkRequestHeaders(req, queryID, jobID, cmsID) result, nextURL, err = bbc.client.DoBundleRequest(req) if err != nil { @@ -333,7 +333,7 @@ func (bbc *BlueButtonClient) getRawData(u *url.URL) (string, error) { logger.Error(err) return err } - addRequestHeaders(req, uuid.NewRandom(), "", "") + addNonBulkRequestHeaders(req, uuid.NewRandom()) result, err = bbc.client.DoRaw(req) if err != nil { @@ -364,16 +364,14 @@ func (bbc *BlueButtonClient) getURL(path string, params url.Values) (*url.URL, e return u, nil } -func addRequestHeaders(req *http.Request, reqID uuid.UUID, jobID, cmsID string) { +func addDefaultRequestHeaders(req *http.Request, reqID uuid.UUID) { // Info for BB backend: https://jira.cms.gov/browse/BLUEBUTTON-483 + req.Header.Add("keep-alive", "") req.Header.Add(constants.BBHeaderTS, time.Now().String()) req.Header.Add(constants.BBHeaderOriginQID, reqID.String()) - req.Header.Add("BlueButton-OriginalQueryCounter", "1") - req.Header.Add("keep-alive", "") - req.Header.Add("BlueButton-OriginalUrl", req.URL.String()) - req.Header.Add("BlueButton-OriginalQuery", req.URL.RawQuery) - req.Header.Add(jobIDHeader, jobID) - req.Header.Add(clientIDHeader, cmsID) + req.Header.Add(constants.BBHeaderOriginQC, "1") + req.Header.Add(constants.BBHeaderOriginURL, req.URL.String()) + req.Header.Add(constants.BBHeaderOriginQ, req.URL.RawQuery) req.Header.Add("IncludeIdentifiers", "mbi") // We SHOULD NOT be specifying "Accept-Encoding: gzip" on the request header. @@ -387,7 +385,21 @@ func addRequestHeaders(req *http.Request, reqID uuid.UUID, jobID, cmsID string) //req.Header.Add("BlueButton-BeneficiaryId", "") //req.Header.Add("BlueButton-OriginatingIpAddress", "") //req.Header.Add("BlueButton-BackendCall", "") +} + +// function to add headers for bulk requests +func addBulkRequestHeaders(req *http.Request, reqID uuid.UUID, jobID, cmsID string) { + // Info: https://github.com/CMSgov/beneficiary-fhir-data/blob/master/docs/request-audit-headers.md + addDefaultRequestHeaders(req, reqID) + + req.Header.Add(jobIDHeader, jobID) + req.Header.Add(clientIDHeader, cmsID) +} +// function to add headers for non-bulk requests +func addNonBulkRequestHeaders(req *http.Request, reqID uuid.UUID) { + // Info: https://github.com/CMSgov/beneficiary-fhir-data/blob/master/docs/request-audit-headers.md + addDefaultRequestHeaders(req, reqID) } func GetDefaultParams() (params url.Values) { diff --git a/bcda/client/bluebutton_test.go b/bcda/client/bluebutton_test.go index 3fa09df11..d51cd9043 100644 --- a/bcda/client/bluebutton_test.go +++ b/bcda/client/bluebutton_test.go @@ -349,6 +349,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { noServiceDateChecker, noIncludeAddressFieldsChecker, includeTaxNumbersChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -368,6 +370,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { noServiceDateChecker, noIncludeAddressFieldsChecker, includeTaxNumbersChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -388,6 +392,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { noServiceDateLowerBoundChecker, noIncludeAddressFieldsChecker, includeTaxNumbersChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -408,6 +414,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { noServiceDateUpperBoundChecker, noIncludeAddressFieldsChecker, includeTaxNumbersChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -428,6 +436,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { serviceDateUpperBoundChecker, noIncludeAddressFieldsChecker, includeTaxNumbersChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -446,6 +456,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { noExcludeSAMHSAChecker, includeAddressFieldsChecker, noIncludeTaxNumbersChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -464,6 +476,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { noExcludeSAMHSAChecker, includeAddressFieldsChecker, noIncludeTaxNumbersChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -482,6 +496,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { noExcludeSAMHSAChecker, noIncludeAddressFieldsChecker, noIncludeTaxNumbersChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -500,6 +516,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { noExcludeSAMHSAChecker, noIncludeAddressFieldsChecker, noIncludeTaxNumbersChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -516,6 +534,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { noExcludeSAMHSAChecker, noIncludeAddressFieldsChecker, noIncludeTaxNumbersChecker, + noBulkRequestHeaders, + hasDefaultRequestHeaders, }, }, { @@ -535,6 +555,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { excludeSAMHSAChecker, includeTaxNumbersChecker, noIncludeAddressFieldsChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -554,6 +576,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { excludeSAMHSAChecker, includeTaxNumbersChecker, noIncludeAddressFieldsChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -574,6 +598,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { excludeSAMHSAChecker, includeTaxNumbersChecker, noIncludeAddressFieldsChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -594,6 +620,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { excludeSAMHSAChecker, includeTaxNumbersChecker, noIncludeAddressFieldsChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -614,6 +642,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { excludeSAMHSAChecker, includeTaxNumbersChecker, noIncludeAddressFieldsChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -633,6 +663,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { excludeSAMHSAChecker, includeTaxNumbersChecker, noIncludeAddressFieldsChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -652,6 +684,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { excludeSAMHSAChecker, includeTaxNumbersChecker, noIncludeAddressFieldsChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -672,6 +706,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { excludeSAMHSAChecker, includeTaxNumbersChecker, noIncludeAddressFieldsChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -692,6 +728,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { excludeSAMHSAChecker, includeTaxNumbersChecker, noIncludeAddressFieldsChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, { @@ -712,6 +750,8 @@ func (s *BBRequestTestSuite) TestValidateRequest() { excludeSAMHSAChecker, includeTaxNumbersChecker, noIncludeAddressFieldsChecker, + hasDefaultRequestHeaders, + hasBulkRequestHeaders, }, }, } @@ -740,8 +780,6 @@ func (s *BBRequestTestSuite) TestValidateRequest() { "%s does not end with %s", req.Header.Get("BlueButton-OriginalUrl"), req.URL.String()) assert.Equal(t, req.URL.RawQuery, req.Header.Get("BlueButton-OriginalQuery")) - assert.Equal(t, jobID, req.Header.Get(jobIDHeader)) - assert.Equal(t, cmsID, req.Header.Get(clientIDHeader)) assert.Empty(t, req.Header.Get(oldJobIDHeader)) assert.Empty(t, req.Header.Get(oldClientIDHeader)) @@ -870,6 +908,23 @@ func noIncludeTaxNumbersChecker(t *testing.T, req *http.Request) { func includeTaxNumbersChecker(t *testing.T, req *http.Request) { assert.Equal(t, "true", req.Header.Get("IncludeTaxNumbers")) } +func hasDefaultRequestHeaders(t *testing.T, req *http.Request) { + assert.NotEmpty(t, req.Header.Get(constants.BBHeaderTS)) + assert.NotEmpty(t, req.Header.Get(constants.BBHeaderOriginURL)) + assert.NotEmpty(t, req.Header.Get(constants.BBHeaderOriginQID)) + assert.NotEmpty(t, req.Header.Get(constants.BBHeaderOriginQ)) + assert.NotEmpty(t, req.Header.Get(constants.BBHeaderOriginQC)) +} +func hasBulkRequestHeaders(t *testing.T, req *http.Request) { + assert.NotEmpty(t, req.Header.Get(jobIDHeader)) + assert.NotEmpty(t, req.Header.Get(clientIDHeader)) +} +func noBulkRequestHeaders(t *testing.T, req *http.Request) { + for k := range req.Header { + assert.NotEqual(t, k, jobIDHeader) + assert.NotEqual(t, k, clientIDHeader) + } +} func TestBBTestSuite(t *testing.T) { suite.Run(t, new(BBTestSuite)) diff --git a/bcda/constants/constants.go b/bcda/constants/constants.go index 085081649..5bb4ac96e 100644 --- a/bcda/constants/constants.go +++ b/bcda/constants/constants.go @@ -27,7 +27,10 @@ const ContentType = "Content-Type" const JsonContentType = "application/json" const BBHeaderTS = "BlueButton-OriginalQueryTimestamp" +const BBHeaderOriginURL = "BlueButton-OriginalUrl" const BBHeaderOriginQID = "BlueButton-OriginalQueryId" +const BBHeaderOriginQ = "BlueButton-OriginalQuery" +const BBHeaderOriginQC = "BlueButton-OriginalQueryCounter" const CCLFFileRetID = "%s RETURNING id" const JobKeyCreateErr = "failed to create job key: %w"