new exyus PutCondition checking
2007-09-17 @ 22:56#
i updated the exyus engine this evening to simplify the process of checking pre-conditions for HTTP PUT. now i have to utility methods (CheckPutUpdateConditions
and CheckPutCreateConditions
) that encapsulate the details of sorting out the various headers and coming up with a final determination on whether the method can continue. code is pretty simple. i relies on a struct
that contains the headers passed by the client when making the PUT call:
public struct PutHeaders { public string IfMatch; public string IfNoneMatch; public string IfUnmodifiedSince; public string IfModifiedSince; public PutHeaders(HttpContext ctx) { Utility util = new Utility(); this.IfMatch = util.GetHttpHeader(Constants.hdr_if_match, ctx.Request.Headers); this.IfUnmodifiedSince = util.GetHttpHeader(Constants.hdr_if_unmodified_since, ctx.Request.Headers); this.IfNoneMatch = util.GetHttpHeader(Constants.hdr_if_none_match, ctx.Request.Headers); this.IfModifiedSince = util.GetHttpHeader(Constants.hdr_if_modified_since, ctx.Request.Headers); } }
and here's the methods themselves
public void CheckPutCreateCondition(PutHeaders ph, bool allowcreate, string etag, ref string put_error, ref bool save_item) { if (allowcreate == false) { put_error = "Cannot create using PUT."; save_item = false; } else if ( (ph.IfNoneMatch == "*" && etag == string.Empty) // anything || (ph.IfNoneMatch == string.Empty) // none passed || (ph.IfNoneMatch != etag) // passed, but not equal ) save_item = true; else { put_error = "Header mismatch (If-None-Match). Unable to create."; save_item = false; } } public void CheckPutUpdateCondition(PutHeaders ph, string etag, string last_mod, ref string put_error, ref bool save_item) { // compare resource headers to client headers if (ph.IfMatch == string.Empty && ph.IfUnmodifiedSince == string.Empty) { // gotta gimme one of these put_error = "Missing If-Match and If-Unmodified-Since headers. Unable to update."; save_item = false; } else if (ph.IfMatch != string.Empty && etag != ph.IfMatch) { // etags must match put_error = "Header mismatch (If-Match). Unable to update."; save_item = false; } else if (ph.IfUnmodifiedSince != string.Empty && last_mod != ph.IfUnmodifiedSince) { // last mod date must match put_error = "Header mismatch (If-Unmodified-Since). Unable to update."; save_item = false; } else { save_item = true; } }