cerebris / jsonapi-resources

A resource-focused Rails library for developing JSON:API compliant servers.
http://jsonapi-resources.com
MIT License
2.32k stars 533 forks source link

BUG: malformed includes raises NoMethodError #1376

Open bf4 opened 3 years ago

bf4 commented 3 years ago

This issue is a (choose one):

Checklist before submitting:

Description

Choose one section below and delete the other:

Bug reports:

The CSV gem raises a NoMethodError when passed an array

e.g. CSV.parse_line(["memberships"]) raises

private method `gets' called for ["memberships"]:Array

And JR in 0.9.x and 0.10.x in a few places uses CSV.parse_line but only rescues CSV::MalformedCSVError

making a request like v1/users/:id?include[]=memberships with call e.g. JSONAPI::RequestParser#parse_include_directives with ["memberships"] and raise an unhandled error.

My proposal is 1) encapsulate wherever CSV.parse_line is called and 2) ensure any errors are handled and raises as JSONAPI::Exceptions

I could possibly make PRs to 0.9 and 0.10

(We're still on 0.9 due to bugs changes in handling of polymorphic types and plain old resources, but I'd like to help however I can)

bf4 commented 2 years ago

on 0.9.x

# Remove when https://github.com/cerebris/jsonapi-resources/issues/1376 is resolved
module JSONAPIIncludeParserPatch
  def parse_include_directives(raw_include)
    super
  rescue NoMethodError
    # CSV.parse_line(["memberships"])
    # private method `gets' called for #<Array:0x00007f2a31bbb0b8>
    fail JSONAPI::Exceptions::InvalidInclude.new(format_key(@resource_klass._type), raw_include)
  end
end
JSONAPI::RequestParser.prepend(JSONAPIIncludeParserPatch)

on 0.10.x

# Remove when https://github.com/cerebris/jsonapi-resources/issues/1376 is resolved
module JSONAPIIncludeParserPatch
  def parse_include_directives(resource_klass, raw_include)
    super
  rescue NoMethodError
    # CSV.parse_line(["memberships"])
    # private method `gets' called for #<Array:0x00007f2a31bbb0b8>
    fail JSONAPI::Exceptions::InvalidInclude.new(format_key(resource_klass._type), raw_include)
  end
end
JSONAPI::RequestParser.prepend(JSONAPIIncludeParserPatch)