/// <summary>
        /// Brews a cup of coffee. E.g. Executes the specified script.
        /// </summary>
        /// <param name="code"></param>
        /// <param name="codePath"></param>
        /// <param name="requestBody"></param>
        public static void Brew(string code, string codePath, Stream requestBody, string scriptEngineFactory = "Barista.SharePoint.SPBaristaJurassicScriptEngineFactory, Barista.SharePoint, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a2d8064cb9226f52")
        {
            var webContext = WebOperationContext.Current;

            if (webContext == null)
            {
                throw new InvalidOperationException("Current WebOperationContext is null.");
            }

            var request = BrewRequest.CreateBrewRequestFromIncomingWebRequest(webContext.IncomingRequest, requestBody, OperationContext.Current);

            request.ScriptEngineFactory = scriptEngineFactory;
            request.Code     = code;
            request.CodePath = codePath;

            //If the request has a header named "X-Barista-Bootstrapper" define it on the request.
            var requestHeaders  = webContext.IncomingRequest.Headers;
            var bootstrapperKey = requestHeaders.AllKeys.FirstOrDefault(k => k.ToLowerInvariant() == "X-Barista-Bootstrapper".ToLowerInvariant());

            if (!String.IsNullOrWhiteSpace(bootstrapperKey))
            {
                var bootstrapperValue = requestHeaders[bootstrapperKey];
                if (!String.IsNullOrWhiteSpace(bootstrapperValue))
                {
                    request.Bootstrapper = bootstrapperValue;
                }
            }

            var instanceSettings = request.ParseInstanceSettings();

            if (string.IsNullOrEmpty(instanceSettings.InstanceInitializationCode) == false)
            {
                string instanceInitializationCodePath;
                request.InstanceInitializationCode     = Tamp(instanceSettings.InstanceInitializationCode, out instanceInitializationCodePath);
                request.InstanceInitializationCodePath = instanceInitializationCodePath;
            }

            request.SetExtendedPropertiesFromCurrentSPContext();
            var client = new BaristaServiceClient(SPServiceContext.Current);

            client.Exec(request);

            //abandon the session and set the ASP.net session cookie to nothing.
            if (HttpContext.Current != null && HttpContext.Current.Session != null)
            {
                HttpContext.Current.Session.Abandon();
                HttpContext.Current.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
            }
        }
        /// <summary>
        /// Pulls a shot of espresso. E.g. Executes the specified script and sets the appropriate values on the response object.
        /// </summary>
        /// <param name="code"></param>
        /// <param name="codePath"></param>
        /// <param name="requestBody"></param>
        /// <returns></returns>
        public static Message Pull(string code, string codePath, Stream requestBody, string scriptEngineFactory = "Barista.SharePoint.SPBaristaJurassicScriptEngineFactory, Barista.SharePoint, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a2d8064cb9226f52")
        {
            var webContext = WebOperationContext.Current;

            if (webContext == null)
            {
                throw new InvalidOperationException("Current WebOperationContext is null.");
            }

            var request = BrewRequest.CreateBrewRequestFromIncomingWebRequest(webContext.IncomingRequest, requestBody, OperationContext.Current);

            request.ScriptEngineFactory = scriptEngineFactory;
            request.Code     = code;
            request.CodePath = codePath;

            var instanceSettings = request.ParseInstanceSettings();

            if (string.IsNullOrEmpty(instanceSettings.InstanceInitializationCode) == false)
            {
                string instanceInitializationCodePath;
                request.InstanceInitializationCode     = Tamp(instanceSettings.InstanceInitializationCode, out instanceInitializationCodePath);
                request.InstanceInitializationCodePath = instanceInitializationCodePath;
            }

            request.SetExtendedPropertiesFromCurrentSPContext();

            //Make a call to the Barista Service application to handle the request.
            var client = new BaristaServiceClient(SPServiceContext.Current);
            var result = client.Eval(request);

            //abandon the session and set the ASP.net session cookie to nothing.
            var cookies = new List <IBaristaCookie>();

            cookies.AddRange(result.Cookies);

            var existingCookie = cookies.FirstOrDefault(c => c != null && c.Name == "ASP.NET_SessionId");

            if (existingCookie != null)
            {
                cookies.Remove(existingCookie);
            }
            cookies.Add(new Biscotti("ASP.NET_SessionId", ""));
            result.Cookies = cookies;

            result.ModifyOutgoingWebResponse(webContext.OutgoingResponse);

            //if (HttpContext.Current != null && HttpContext.Current.Session != null)
            //{
            //    HttpContext.Current.Session.Abandon();
            //    HttpContext.Current.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
            //}

            return(webContext.CreateStreamResponse(
                       stream =>
            {
                if (result.Content == null)
                {
                    return;
                }

                using (var writer = new BinaryWriter(stream))
                {
                    writer.Write(result.Content);
                }
            },
                       result.ContentType ?? string.Empty));
        }