/// <summary>
 /// Event arguments for HTTPX data responses.
 /// </summary>
 /// <param name="Response">Response event arguments.</param>
 /// <param name="Data">Data response, possibly partial.</param>
 /// <param name="StreamId">Stream ID.</param>
 /// <param name="Last">If it is the last data block.</param>
 /// <param name="State">State object.</param>
 public HttpxResponseDataEventArgs(HttpxResponseEventArgs Response, byte[] Data, string StreamId, bool Last, object State)
     : base()
 {
     this.response = Response;
     this.data     = Data;
     this.streamId = StreamId;
     this.last     = Last;
     this.state    = State;
 }
Example #2
0
 internal ClientChunkRecord(HttpxClient Client, HttpxResponseEventArgs e, HttpResponse Response,
                            HttpxResponseDataEventHandler DataCallback, object State, string StreamId, string Jid, bool E2e)
     : base()
 {
     this.client       = Client;
     this.e            = e;
     this.response     = Response;
     this.dataCallback = DataCallback;
     this.state        = State;
     this.streamId     = StreamId;
     this.jid          = Jid;
     this.e2e          = E2e;
 }
Example #3
0
 internal ClientChunkRecord(HttpxClient Client, HttpxResponseEventArgs e, HttpResponse Response,
                            HttpxResponseDataEventHandler DataCallback, object State, string StreamId, string From, string To, bool E2e,
                            string EndpointReference, IE2eSymmetricCipher SymmetricCipher)
     : base()
 {
     this.client            = Client;
     this.e                 = e;
     this.response          = Response;
     this.dataCallback      = DataCallback;
     this.state             = State;
     this.streamId          = StreamId;
     this.from              = From;
     this.to                = To;
     this.e2e               = E2e;
     this.endpointReference = EndpointReference;
     this.symmetricCipher   = SymmetricCipher;
 }
Example #4
0
        private void RequestResponse(object Sender, HttpxResponseEventArgs e)
        {
            ReadoutState State2 = (ReadoutState)e.State;

            State2.Response.StatusCode    = e.StatusCode;
            State2.Response.StatusMessage = e.StatusMessage;

            if (e.HttpResponse != null)
            {
                foreach (KeyValuePair <string, string> Field in e.HttpResponse.GetHeaders())
                {
                    switch (Field.Key.ToLower())
                    {
                    case "cookie":
                    case "set-cookie":
                        // Do not forward cookies.
                        break;

                    case "content-type":
                        State2.ContentType = Field.Value;
                        State2.Response.SetHeader(Field.Key, Field.Value);
                        break;

                    case "etag":
                        State2.ETag = Field.Value;
                        State2.Response.SetHeader(Field.Key, Field.Value);
                        break;

                    case "last-modified":
                        DateTimeOffset TP;
                        if (CommonTypes.TryParseRfc822(Field.Value, out TP))
                        {
                            State2.LastModified = TP;
                        }
                        State2.Response.SetHeader(Field.Key, Field.Value);
                        break;

                    case "expires":
                        if (CommonTypes.TryParseRfc822(Field.Value, out TP))
                        {
                            State2.Expires = TP;
                        }
                        State2.Response.SetHeader(Field.Key, Field.Value);
                        break;

                    case "cache-control":
                        State2.CacheControl = Field.Value;
                        State2.Response.SetHeader(Field.Key, Field.Value);
                        break;

                    case "pragma":
                        State2.Pragma = Field.Value;
                        State2.Response.SetHeader(Field.Key, Field.Value);
                        break;

                    default:
                        State2.Response.SetHeader(Field.Key, Field.Value);
                        break;
                    }
                }
            }

            if (!e.HasData)
            {
                State2.Response.SendResponse();
            }
            else
            {
                if (e.StatusCode == 200 && State2.Cacheable && State2.CanCache &&
                    this.httpxCache.CanCache(State2.BareJid, State2.LocalResource, State2.ContentType))
                {
                    State2.TempOutput = new TemporaryFile();
                }

                if (e.Data != null)
                {
                    this.BinaryDataReceived(State2, true, e.Data);
                }
            }
        }
Example #5
0
        private void ResponseHandler(object Sender, IqResultEventArgs e)
        {
            XmlElement   E = e.FirstElement;
            HttpResponse Response;
            string       StatusMessage;
            double       Version;
            int          StatusCode;

            object[] P = (object[])e.State;
            HttpxResponseEventHandler     Callback     = (HttpxResponseEventHandler)P[0];
            HttpxResponseDataEventHandler DataCallback = (HttpxResponseDataEventHandler)P[1];
            object State = P[2];

            byte[] Data            = null;
            bool   HasData         = false;
            bool   DisposeResponse = true;

            if (e.Ok && E != null && E.LocalName == "resp" && E.NamespaceURI == Namespace)
            {
                Version       = XML.Attribute(E, "version", 0.0);
                StatusCode    = XML.Attribute(E, "statusCode", 0);
                StatusMessage = XML.Attribute(E, "statusMessage");
                Response      = new HttpResponse();

                foreach (XmlNode N in E.ChildNodes)
                {
                    switch (N.LocalName)
                    {
                    case "headers":
                        foreach (XmlNode N2 in N.ChildNodes)
                        {
                            switch (N2.LocalName)
                            {
                            case "header":
                                string Key   = XML.Attribute((XmlElement)N2, "name");
                                string Value = N2.InnerText;

                                Response.SetHeader(Key, Value);
                                break;
                            }
                        }
                        break;

                    case "data":
                        foreach (XmlNode N2 in N.ChildNodes)
                        {
                            switch (N2.LocalName)
                            {
                            case "text":
                                MemoryStream ms = new MemoryStream();
                                Response.SetResponseStream(ms);
                                Data = Response.Encoding.GetBytes(N2.InnerText);
                                ms.Write(Data, 0, Data.Length);
                                ms.Position = 0;
                                HasData     = true;
                                break;

                            case "xml":
                                ms = new MemoryStream();
                                Response.SetResponseStream(ms);
                                Data = Response.Encoding.GetBytes(N2.InnerText);
                                ms.Write(Data, 0, Data.Length);
                                ms.Position = 0;
                                HasData     = true;
                                break;

                            case "base64":
                                ms = new MemoryStream();
                                Response.SetResponseStream(ms);
                                Data = Convert.FromBase64String(N2.InnerText);
                                ms.Write(Data, 0, Data.Length);
                                ms.Position = 0;
                                HasData     = true;
                                break;

                            case "chunkedBase64":
                                string StreamId = XML.Attribute((XmlElement)N2, "streamId");

                                HttpxChunks.chunkedStreams.Add(e.From + " " + StreamId, new ClientChunkRecord(this,
                                                                                                              new HttpxResponseEventArgs(e, Response, State, Version, StatusCode, StatusMessage, true, null),
                                                                                                              Response, DataCallback, State, StreamId, XmppClient.GetBareJID(e.From), false));

                                DisposeResponse = false;
                                HasData         = true;
                                break;

                            case "ibb":
                                StreamId = XML.Attribute((XmlElement)N2, "sid");

                                HttpxChunks.chunkedStreams.Add(e.From + " " + StreamId, new ClientChunkRecord(this,
                                                                                                              new HttpxResponseEventArgs(e, Response, State, Version, StatusCode, StatusMessage, true, null),
                                                                                                              Response, DataCallback, State, StreamId, XmppClient.GetBareJID(e.From), false));

                                DisposeResponse = false;
                                HasData         = true;
                                break;

                            case "s5":
                                StreamId = XML.Attribute((XmlElement)N2, "sid");
                                bool E2e = XML.Attribute((XmlElement)N2, "e2e", false);

                                HttpxChunks.chunkedStreams.Add(e.From + " " + StreamId, new ClientChunkRecord(this,
                                                                                                              new HttpxResponseEventArgs(e, Response, State, Version, StatusCode, StatusMessage, true, null),
                                                                                                              Response, DataCallback, State, StreamId, XmppClient.GetBareJID(e.From), E2e));

                                DisposeResponse = false;
                                HasData         = true;
                                break;

                            case "sipub":
                                // TODO: Implement File Transfer support.
                                break;

                            case "jingle":
                                // TODO: Implement Jingle support.
                                break;
                            }
                        }
                        break;
                    }
                }
            }
            else
            {
                Version       = 0.0;
                StatusCode    = 505;
                StatusMessage = "HTTP Version Not Supported";
                Response      = new HttpResponse();
            }

            HttpxResponseEventArgs e2 = new HttpxResponseEventArgs(e, Response, State, Version, StatusCode, StatusMessage, HasData, Data);

            try
            {
                Callback(this, e2);
            }
            catch (Exception)
            {
                // Ignore.
            }
            finally
            {
                if (DisposeResponse)
                {
                    Response.Dispose();
                }
            }
        }