Handle invalid JSON on PUT requests
This commit is contained in:
		
							parent
							
								
									84e69376fd
								
							
						
					
					
						commit
						acf2003487
					
				| @ -63,12 +63,11 @@ module RemoteStorage | |||||||
|     def put_data(user, directory, key, data, content_type=nil) |     def put_data(user, directory, key, data, content_type=nil) | ||||||
|       object = data_bucket.new("#{user}:#{directory}:#{key}") |       object = data_bucket.new("#{user}:#{directory}:#{key}") | ||||||
|       object.content_type = content_type || "text/plain; charset=utf-8" |       object.content_type = content_type || "text/plain; charset=utf-8" | ||||||
|       data = JSON.parse(data) if content_type[/^[^;\s]+/] == "application/json" | 
 | ||||||
|       if serializer_for(object.content_type) |       unless set_object_data(object, data) | ||||||
|         object.data = data |         halt 422 | ||||||
|       else |  | ||||||
|         object.raw_data = data |  | ||||||
|       end |       end | ||||||
|  | 
 | ||||||
|       directory_index = directory == "" ? "/" : directory |       directory_index = directory == "" ? "/" : directory | ||||||
|       object.indexes.merge!({:user_id_bin => [user], |       object.indexes.merge!({:user_id_bin => [user], | ||||||
|                              :directory_bin => [directory_index]}) |                              :directory_bin => [directory_index]}) | ||||||
| @ -206,5 +205,20 @@ module RemoteStorage | |||||||
|       directory_object.store |       directory_object.store | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  |     def set_object_data(object, data) | ||||||
|  |       if object.content_type[/^[^;\s]+/] == "application/json" | ||||||
|  |         data = "{}" if data.blank? | ||||||
|  |         data = JSON.parse(data) | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |       if serializer_for(object.content_type) | ||||||
|  |         object.data = data | ||||||
|  |       else | ||||||
|  |         object.raw_data = data | ||||||
|  |       end | ||||||
|  |     rescue JSON::ParserError | ||||||
|  |       return false | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  | |||||||
| @ -173,6 +173,32 @@ describe "App with Riak backend" do | |||||||
|           last_response.content_type.must_equal "application/json; charset=UTF-8" |           last_response.content_type.must_equal "application/json; charset=UTF-8" | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
|  | 
 | ||||||
|  |       context "invalid JSON" do | ||||||
|  |         context "empty body" do | ||||||
|  |           before do | ||||||
|  |             header "Content-Type", "application/json" | ||||||
|  |             put "/jimmy/documents/jason", "" | ||||||
|  |           end | ||||||
|  | 
 | ||||||
|  |           it "saves an empty JSON object" do | ||||||
|  |             last_response.status.must_equal 200 | ||||||
|  |             data_bucket.get("jimmy:documents:jason").data.must_be_kind_of Hash | ||||||
|  |             data_bucket.get("jimmy:documents:jason").data.must_equal({}) | ||||||
|  |           end | ||||||
|  |         end | ||||||
|  | 
 | ||||||
|  |         context "unparsable JSON" do | ||||||
|  |           before do | ||||||
|  |             header "Content-Type", "application/json" | ||||||
|  |             put "/jimmy/documents/jason", "foo" | ||||||
|  |           end | ||||||
|  | 
 | ||||||
|  |           it "returns a 422" do | ||||||
|  |             last_response.status.must_equal 422 | ||||||
|  |           end | ||||||
|  |         end | ||||||
|  |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     describe "DELETE" do |     describe "DELETE" do | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user