@@ -70,6 +70,11 @@ var definitions = []PathDef{
7070 PathDef : []string {"[type]" , "_search?" },
7171 Verb : "POST" ,
7272 },
73+ {
74+ Interaction : fhir .TypeRestfulInteractionSearchType ,
75+ PathDef : []string {"[type]" , "_search" },
76+ Verb : "POST" ,
77+ },
7378 {
7479 Interaction : fhir .TypeRestfulInteractionSearchSystem ,
7580 PathDef : []string {"?" },
@@ -368,8 +373,19 @@ func getSingleParameter(params url.Values, name string) (string, error) {
368373func NewPolicyInput (request PDPRequest ) (PolicyInput , PolicyResult ) {
369374 var policyInput PolicyInput
370375
376+ // URL decode query parameters
377+ decodeHTTPRequest := request .Input .Request
378+ decodedQueryParams , err := urlValuesDecode (request .Input .Request .QueryParams )
379+ if err != nil {
380+ return policyInput , Deny (ResultReason {
381+ Code : TypeResultCodeUnexpectedInput ,
382+ Description : "unable to decode query parameters: " + err .Error (),
383+ })
384+ }
385+ decodeHTTPRequest .QueryParams = * decodedQueryParams
386+
371387 policyInput .Subject = request .Input .Subject
372- policyInput .Action .Request = request . Input . Request
388+ policyInput .Action .Request = decodeHTTPRequest
373389 policyInput .Context .DataHolderOrganizationId = request .Input .Context .DataHolderOrganizationId
374390 policyInput .Context .DataHolderFacilityType = request .Input .Context .DataHolderFacilityType
375391 policyInput .Context .PatientBSN = request .Input .Context .PatientBSN
@@ -385,7 +401,7 @@ func NewPolicyInput(request PDPRequest) (PolicyInput, PolicyResult) {
385401 if ! ok {
386402 reason := ResultReason {
387403 Code : TypeResultCodeUnexpectedInput ,
388- Description : "unexpected input, unable to parse fhir request" ,
404+ Description : "unable to parse FHIR request" ,
389405 }
390406 return policyInput , Deny (reason )
391407 }
@@ -417,17 +433,17 @@ func NewPolicyInput(request PDPRequest) (PolicyInput, PolicyResult) {
417433 hasFormData
418434
419435 if paramsInBody {
420- values , err := url .ParseQuery (request .Input .Request .Body )
436+ decodedBody , err := url .ParseQuery (request .Input .Request .Body )
421437 if err != nil {
422438 reason := ResultReason {
423439 Code : TypeResultCodeUnexpectedInput ,
424- Description : "Could not parse form encoded data" ,
440+ Description : fmt . Sprintf ( "could not parse form encoded request body: %v" , err ) ,
425441 }
426442 return PolicyInput {}, Deny (reason )
427443 }
428- rawParams = values
444+ rawParams = decodedBody
429445 } else {
430- rawParams = request . Input . Request . QueryParams
446+ rawParams = * decodedQueryParams
431447 }
432448
433449 params := groupParams (rawParams )
@@ -462,3 +478,17 @@ func NewPolicyInput(request PDPRequest) (PolicyInput, PolicyResult) {
462478
463479 return policyInput , result
464480}
481+
482+ func urlValuesDecode (in url.Values ) (* url.Values , error ) {
483+ out := make (url.Values )
484+ for key , values := range in {
485+ for _ , value := range values {
486+ decodedValue , err := url .QueryUnescape (value )
487+ if err != nil {
488+ return nil , fmt .Errorf ("parameter '%s': %w" , key , err )
489+ }
490+ out .Add (key , decodedValue )
491+ }
492+ }
493+ return & out , nil
494+ }
0 commit comments