Send "Precondition Failed" message body with 412 responses
This commit is contained in:
		
							parent
							
								
									cc91b5c4cd
								
							
						
					
					
						commit
						c897959029
					
				| @ -139,10 +139,10 @@ module RemoteStorage | ||||
|       url = url_for_key(user, directory, key) | ||||
| 
 | ||||
|       if required_match = server.env["HTTP_IF_MATCH"] | ||||
|         server.halt 412 unless required_match == %Q("#{existing_metadata["e"]}") | ||||
|         server.halt 412, "Precondition Failed" unless required_match == %Q("#{existing_metadata["e"]}") | ||||
|       end | ||||
|       if server.env["HTTP_IF_NONE_MATCH"] == "*" | ||||
|         server.halt 412 unless existing_metadata.empty? | ||||
|         server.halt 412, "Precondition Failed" unless existing_metadata.empty? | ||||
|       end | ||||
| 
 | ||||
|       res = do_put_request(url, data, content_type) | ||||
| @ -178,7 +178,7 @@ module RemoteStorage | ||||
|       existing_metadata = redis.hgetall "rs:m:#{user}:#{directory}/#{key}" | ||||
| 
 | ||||
|       if required_match = server.env["HTTP_IF_MATCH"] | ||||
|         server.halt 412 unless required_match == %Q("#{existing_metadata["e"]}") | ||||
|         server.halt 412, "Precondition Failed" unless required_match == %Q("#{existing_metadata["e"]}") | ||||
|       end | ||||
| 
 | ||||
|       do_delete_request(url) | ||||
|  | ||||
| @ -165,7 +165,82 @@ describe "App" do | ||||
|           last_response.status.must_equal 400 | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       describe "If-Match header" do | ||||
|         before do | ||||
|           put_stub = OpenStruct.new(headers: { | ||||
|             etag: "oldetag", | ||||
|             last_modified: "Fri, 04 Mar 2016 12:20:18 GMT" | ||||
|           }) | ||||
| 
 | ||||
|           RestClient.stub :put, put_stub do | ||||
|             put "/phil/food/aguacate", "si" | ||||
|           end | ||||
|         end | ||||
| 
 | ||||
|         it "allows the request if the header matches the current ETag" do | ||||
|           header "If-Match", "\"oldetag\"" | ||||
| 
 | ||||
|           put_stub = OpenStruct.new(headers: { | ||||
|             etag: "newetag", | ||||
|             last_modified: "Fri, 04 Mar 2016 12:20:18 GMT" | ||||
|           }) | ||||
| 
 | ||||
|           RestClient.stub :put, put_stub do | ||||
|             put "/phil/food/aguacate", "aye" | ||||
|           end | ||||
| 
 | ||||
|           last_response.status.must_equal 200 | ||||
|           last_response.headers["Etag"].must_equal "\"newetag\"" | ||||
|         end | ||||
| 
 | ||||
|         it "fails the request if the header does not match the current ETag" do | ||||
|           header "If-Match", "someotheretag" | ||||
| 
 | ||||
|           put "/phil/food/aguacate", "aye" | ||||
| 
 | ||||
|           last_response.status.must_equal 412 | ||||
|           last_response.body.must_equal "Precondition Failed" | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       describe "If-None-Match header set to '*'" do | ||||
|         it "succeeds when the document doesn't exist yet" do | ||||
|           put_stub = OpenStruct.new(headers: { | ||||
|             etag: "someetag", | ||||
|             last_modified: "Fri, 04 Mar 2016 12:20:18 GMT" | ||||
|           }) | ||||
| 
 | ||||
|           header "If-None-Match", "*" | ||||
| 
 | ||||
|           RestClient.stub :put, put_stub do | ||||
|             put "/phil/food/aguacate", "si" | ||||
|           end | ||||
| 
 | ||||
|           last_response.status.must_equal 200 | ||||
|         end | ||||
| 
 | ||||
|         it "fails the request if the document already exsits" do | ||||
|           put_stub = OpenStruct.new(headers: { | ||||
|             etag: "someetag", | ||||
|             last_modified: "Fri, 04 Mar 2016 12:20:18 GMT" | ||||
|           }) | ||||
| 
 | ||||
|           RestClient.stub :put, put_stub do | ||||
|             put "/phil/food/aguacate", "si" | ||||
|           end | ||||
| 
 | ||||
|           header "If-None-Match", "*" | ||||
|           RestClient.stub :put, put_stub do | ||||
|             put "/phil/food/aguacate", "si" | ||||
|           end | ||||
| 
 | ||||
|           last_response.status.must_equal 412 | ||||
|           last_response.body.must_equal "Precondition Failed" | ||||
|         end | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|   end | ||||
| 
 | ||||
|   describe "DELETE requests" do | ||||
| @ -273,6 +348,27 @@ describe "App" do | ||||
|         last_response.status.must_equal 404 | ||||
|         last_response.body.must_equal "Not Found" | ||||
|       end | ||||
| 
 | ||||
|       describe "If-Match header" do | ||||
|         it "succeeds when the header matches the current ETag" do | ||||
|           header "If-Match", "\"bla\"" | ||||
| 
 | ||||
|           RestClient.stub :delete, "" do | ||||
|             delete "/phil/food/aguacate" | ||||
|           end | ||||
| 
 | ||||
|           last_response.status.must_equal 200 | ||||
|         end | ||||
| 
 | ||||
|         it "fails the request if it does not match the current ETag" do | ||||
|           header "If-Match", "someotheretag" | ||||
| 
 | ||||
|           delete "/phil/food/aguacate" | ||||
| 
 | ||||
|           last_response.status.must_equal 412 | ||||
|           last_response.body.must_equal "Precondition Failed" | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user