示例#1
0
        /// <summary>
        /// Encodes an HTTP response that will instruct the user agent to forward a message to
        /// some remote third party using a form POST method.
        /// </summary>
        /// <param name="message">The message to forward.</param>
        /// <param name="fields">The pre-serialized fields from the message.</param>
        /// <returns>The encoded HTTP response.</returns>
        protected virtual UserAgentResponse CreateFormPostResponse(IDirectedProtocolMessage message, IDictionary <string, string> fields)
        {
            ErrorUtilities.VerifyArgumentNotNull(message, "message");
            ErrorUtilities.VerifyArgumentNamed(message.Recipient != null, "message", MessagingStrings.DirectedMessageMissingRecipient);
            ErrorUtilities.VerifyArgumentNotNull(fields, "fields");

            WebHeaderCollection headers      = new WebHeaderCollection();
            StringWriter        bodyWriter   = new StringWriter(CultureInfo.InvariantCulture);
            StringBuilder       hiddenFields = new StringBuilder();

            foreach (var field in fields)
            {
                hiddenFields.AppendFormat(
                    "\t<input type=\"hidden\" name=\"{0}\" value=\"{1}\" />\r\n",
                    HttpUtility.HtmlEncode(field.Key),
                    HttpUtility.HtmlEncode(field.Value));
            }
            bodyWriter.WriteLine(
                indirectMessageFormPostFormat,
                HttpUtility.HtmlEncode(message.Recipient.AbsoluteUri),
                hiddenFields);
            bodyWriter.Flush();
            UserAgentResponse response = new UserAgentResponse {
                Status          = HttpStatusCode.OK,
                Headers         = headers,
                Body            = bodyWriter.ToString(),
                OriginalMessage = message
            };

            return(response);
        }
示例#2
0
        /// <summary>
        /// Queues an indirect message for transmittal via the user agent.
        /// </summary>
        /// <param name="message">The message to send.</param>
        /// <returns>The pending user agent redirect based message to be sent as an HttpResponse.</returns>
        protected virtual UserAgentResponse SendIndirectMessage(IDirectedProtocolMessage message)
        {
            ErrorUtilities.VerifyArgumentNotNull(message, "message");

            var serializer = MessageSerializer.Get(message.GetType());
            var fields     = serializer.Serialize(message);

            // First try creating a 301 redirect, and fallback to a form POST
            // if the message is too big.
            UserAgentResponse response = this.Create301RedirectResponse(message, fields);

            if (response.Headers[HttpResponseHeader.Location].Length > indirectMessageGetToPostThreshold)
            {
                response = this.CreateFormPostResponse(message, fields);
            }

            return(response);
        }
示例#3
0
        /// <summary>
        /// Encodes an HTTP response that will instruct the user agent to forward a message to
        /// some remote third party using a 301 Redirect GET method.
        /// </summary>
        /// <param name="message">The message to forward.</param>
        /// <param name="fields">The pre-serialized fields from the message.</param>
        /// <returns>The encoded HTTP response.</returns>
        protected virtual UserAgentResponse Create301RedirectResponse(IDirectedProtocolMessage message, IDictionary <string, string> fields)
        {
            ErrorUtilities.VerifyArgumentNotNull(message, "message");
            ErrorUtilities.VerifyArgumentNamed(message.Recipient != null, "message", MessagingStrings.DirectedMessageMissingRecipient);
            ErrorUtilities.VerifyArgumentNotNull(fields, "fields");

            WebHeaderCollection headers = new WebHeaderCollection();
            UriBuilder          builder = new UriBuilder(message.Recipient);

            MessagingUtilities.AppendQueryArgs(builder, fields);
            headers.Add(HttpResponseHeader.Location, builder.Uri.AbsoluteUri);
            Logger.DebugFormat("Redirecting to {0}", builder.Uri.AbsoluteUri);
            UserAgentResponse response = new UserAgentResponse {
                Status          = HttpStatusCode.Redirect,
                Headers         = headers,
                Body            = null,
                OriginalMessage = message
            };

            return(response);
        }