/// <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; }
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; }
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; }
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); } } }
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(); } } }