private void VerifyPreferHeaderOnRequest(HttpRequestData request, DataServiceResponsePreference responsePreference) { bool preferExists = request.Headers.Keys.Contains(HttpHeaders.Prefer); // NOTE: if the prefer header is not present, we cannot tell if it should have been, because we don't // know here whether or not this is an entity-specific operation // In other words: even though this is POST/PUT/PATCH, it might be AddLink, SetLink, or a media-resource // update, and therefore should NOT have a prefer header // For now, this component will simply verify what it can, and the rest will be covered by the // verification of the requests sent during SaveChanges. We may be able to remove this component altogether. if (responsePreference == DataServiceResponsePreference.None || !this.IsCreateOrUpdate(request.GetEffectiveVerb())) { this.Assert.IsFalse(preferExists, "Unexpected presence of Prefer Header"); } else if (preferExists) { string value = request.Headers[HttpHeaders.Prefer]; if (responsePreference == DataServiceResponsePreference.IncludeContent) { this.Assert.AreEqual(HttpHeaders.ReturnContent, value, "Incorrect value of Prefer Header"); } if (responsePreference == DataServiceResponsePreference.NoContent) { this.Assert.AreEqual(HttpHeaders.ReturnNoContent, value, "Incorrect value of Prefer Header"); } } }
protected static void ApplyPreferences(ODataRequestMessageWrapper requestMessage, string method, DataServiceResponsePreference responsePreference, ref Version requestVersion) { if (((string.CompareOrdinal("POST", method) == 0) || (string.CompareOrdinal("PUT", method) == 0)) || ((string.CompareOrdinal("MERGE", method) == 0) || (string.CompareOrdinal("PATCH", method) == 0))) { string preferHeaderAndRequestVersion = WebUtil.GetPreferHeaderAndRequestVersion(responsePreference, ref requestVersion); if (preferHeaderAndRequestVersion != null) { requestMessage.SetHeader("Prefer", preferHeaderAndRequestVersion); } } }
private static int GetStatusCodeForUpdate(DSClient.DataServiceContext context) { DataServiceResponsePreference preference = DataServiceResponsePreference.Unspecified; preference = context.AddAndUpdateResponsePreference.ToTestEnum(); if (preference == DataServiceResponsePreference.IncludeContent) { return((int)HttpStatusCode.OK); } else { return((int)HttpStatusCode.NoContent); } }
/// <summary> /// Gets the header value for the given response preference /// </summary> /// <param name="preference">The response preference</param> /// <returns>The header value for the given response preference</returns> public static string ToHeaderValue(this DataServiceResponsePreference preference) { if (preference == DataServiceResponsePreference.None) { return(null); } else if (preference == DataServiceResponsePreference.IncludeContent) { return(HttpHeaders.ReturnContent); } else { ExceptionUtilities.Assert(preference == DataServiceResponsePreference.NoContent, "Unexpected preference value"); return(HttpHeaders.ReturnNoContent); } }
private static void SetExpectedPreferHeader(HttpRequestData request, DataServiceResponsePreference preference) { if (preference == DataServiceResponsePreference.None) { SetUnexpectedPreferHeader(request); } else if (preference == DataServiceResponsePreference.IncludeContent) { request.Headers[HttpHeaders.Prefer] = HttpHeaders.ReturnContent; } else { ExceptionUtilities.Assert(preference == DataServiceResponsePreference.NoContent, "Unexpected preference value"); request.Headers[HttpHeaders.Prefer] = HttpHeaders.ReturnNoContent; } }
private static int GetStatusCodeForInsert(DSClient.DataServiceContext context) { DataServiceResponsePreference preference = DataServiceResponsePreference.Unspecified; #if !WINDOWS_PHONE preference = context.AddAndUpdateResponsePreference.ToTestEnum(); #endif if (preference == DataServiceResponsePreference.NoContent) { return((int)HttpStatusCode.NoContent); } else { return((int)HttpStatusCode.Created); } }
internal static string GetPreferHeaderAndRequestVersion(DataServiceResponsePreference responsePreference, ref Version requestVersion) { string str = null; if (responsePreference != DataServiceResponsePreference.None) { if (responsePreference == DataServiceResponsePreference.IncludeContent) { str = "return-content"; } else { str = "return-no-content"; } RaiseVersion(ref requestVersion, Util.DataServiceVersion3); } return(str); }
/// <summary> /// Determines the value of the Prefer header based on the response preference settings. Also modifies the request version as necessary. /// </summary> /// <param name="responsePreference">The response preference setting for the request.</param> /// <param name="requestVersion">The request version so far, this might be modified (raised) if necessary due to response preference being applied.</param> /// <returns>The value of the Prefer header to apply to the request.</returns> internal static string GetPreferHeaderAndRequestVersion(DataServiceResponsePreference responsePreference, ref Version requestVersion) { string preferHeaderValue = null; if (responsePreference != DataServiceResponsePreference.None) { if (responsePreference == DataServiceResponsePreference.IncludeContent) { preferHeaderValue = XmlConstants.HttpPreferReturnContent; } else { Debug.Assert(responsePreference == DataServiceResponsePreference.NoContent, "Invalid value for DataServiceResponsePreference."); preferHeaderValue = XmlConstants.HttpPreferReturnNoContent; } RaiseVersion(ref requestVersion, Util.ODataVersion4); } return(preferHeaderValue); }
/// <summary> /// Converts the DataServiceResponsePreference test enum value to the equivalent product enum value /// </summary> /// <param name="preference">The value to convert</param> /// <returns>The converted value</returns> public static DSClient.DataServiceResponsePreference ToProductEnum(this DataServiceResponsePreference preference) { ExceptionUtilities.Assert(preference != DataServiceResponsePreference.Unspecified, "Cannot convert unspecified preference value"); return(Contracts.ExtensionMethods.ConvertEnum <DataServiceResponsePreference, DSClient.DataServiceResponsePreference>(preference)); }
/// <summary> /// Apply the response preferences for the client. /// </summary> /// <param name="headers">Headers to which preferences will be added.</param> /// <param name="method">HTTP method.</param> /// <param name="responsePreference">Response preference.</param> /// <param name="requestVersion">Request version so far for the request. The method may modify it.</param> protected static void ApplyPreferences(HeaderCollection headers, string method, DataServiceResponsePreference responsePreference, ref Version requestVersion) { // The AddAndUpdateResponsePreference only applies to POST/PUT/PATCH requests if (string.CompareOrdinal(XmlConstants.HttpMethodPost, method) != 0 && string.CompareOrdinal(XmlConstants.HttpMethodPut, method) != 0 && string.CompareOrdinal(XmlConstants.HttpMethodPatch, method) != 0) { return; } string preferHeaderValue = WebUtil.GetPreferHeaderAndRequestVersion(responsePreference, ref requestVersion); if (preferHeaderValue != null) { headers.SetHeader(XmlConstants.HttpPrefer, preferHeaderValue); } }