/// <summary> /// Builds the headers frame. /// </summary> /// <param name="streamId">The stream id.</param> /// <param name="headers">The headers.</param> /// <param name="final">if set to <c>true</c> than this frame is final for the stream.</param> /// <returns>Headers frame.</returns> public ControlFrame BuildHeadersFrame(int streamId, SMHeaders headers, bool final) { ControlFrame frame = BuildControlFrame(FrameType.Headers, streamId, headers); frame.IsFinal = final; return(frame); }
/// <summary> /// Builds the SYN_STREAM frame. /// </summary> /// <param name="streamId">The stream id.</param> /// <param name="headers">The headers.</param> /// <returns>SYN_STREAM frame.</returns> public ControlFrame BuildSynStreamFrame(int streamId, SMHeaders headers) { ControlFrame frame = BuildControlFrame(FrameType.SynStream, streamId, headers); frame.Priority = SYNStreamPriority; return(frame); }
/// <summary> /// Builds the SYN_STREAM frame. /// </summary> /// <param name="stream">The stream.</param> /// <param name="headers">The headers.</param> /// <param name="final">Indicates that stream is not going to send any more data.</param> /// <returns>SYN_STREAM frame.</returns> public ControlFrame BuildSynStreamFrame(SMStream stream, SMHeaders headers, bool final) { ControlFrame frame = BuildControlFrame(FrameType.SynStream, stream, headers); frame.Priority = SYNStreamPriority; frame.IsFinal = final; return(frame); }
/// <summary> /// Builds the control frame. /// </summary> /// <param name="type">The frame type.</param> /// <param name="streamId">The SM stream id.</param> /// <param name="headers">The headers.</param> /// <returns>Returns Control frame object.</returns> private static ControlFrame BuildControlFrame(FrameType type, int streamId, SMHeaders headers) { ControlFrame frame = new ControlFrame(headers); frame.StreamId = streamId; frame.Type = type; frame.Priority = ControlPriority; return(frame); }
/// <summary> /// Opens the stream. /// </summary> /// <param name="headers">The headers.</param> /// <param name="isFin">The Final flag.</param> internal void Open(SMHeaders headers, bool isFin) { this.Headers.Merge(headers); if (isFin) { this.State = SMStreamState.HalfClosed; } this.protocol.SendSynStream(this, headers, isFin); }
/// <summary> /// Open of stream and sent request for receive data. /// </summary> /// <param name="fileName">Path to the data on server.</param> /// <param name="session">Current session.</param> /// <param name="isFin">Flag fin.</param> /// <returns>New SMstream.</returns> private static SMStream DownloadPathForList(string fileName, ref SMSession session, bool isFin) { if (session.State == SMSessionState.Opened) { SMHeaders headers = new SMHeaders(); headers[SMHeaders.Path] = fileName; headers[SMHeaders.Version] = "http/1.1"; headers[SMHeaders.Method] = "GET"; headers[SMHeaders.Scheme] = "http"; headers[SMHeaders.ContentType] = ContentTypes.GetTypeFromFileName(fileName); return(session.OpenStream(headers, isFin)); } return(null); }
/// <summary> /// Builds the SYN_REPLY frame. /// </summary> /// <param name="streamId">The stream id.</param> /// <param name="headers">The headers.</param> /// <returns>SYN_REPLY frame.</returns> public ControlFrame BuildSynReplyFrame(int streamId, SMHeaders headers) { return BuildControlFrame(FrameType.SynReply, streamId, headers); }
/// <summary> /// Builds the SYN_REPLY frame. /// </summary> /// <param name="stream">The stream.</param> /// <param name="headers">The headers.</param> /// <returns>SYN_REPLY frame.</returns> public ControlFrame BuildSynReplyFrame(SMStream stream, SMHeaders headers) { return BuildControlFrame(FrameType.SynReply, stream, headers); }
/// <summary> /// File download. /// </summary> /// <param name="fileName">The file name</param> /// <returns>The return code.</returns> private static bool DownloadPath(string fileName) { if (session == null) { SMLogger.LogError("Not connected to server. Please use CONNECT to connect to server first."); return false; } else { switch (session.State) { case SMSessionState.Created: SMLogger.LogError("Session was created but not opened yet."); break; case SMSessionState.Opened: SMHeaders headers = new SMHeaders(); headers[SMHeaders.Path] = fileName; headers[SMHeaders.Version] = "http/1.1"; headers[SMHeaders.Method] = "GET"; headers[SMHeaders.Scheme] = "http"; headers[SMHeaders.ContentType] = ContentTypes.GetTypeFromFileName(fileName); SMStream stream = session.OpenStream(headers, true); stream.OnDataReceived += OnDataReceived; stream.OnRSTReceived += OnRSTReceived; break; case SMSessionState.Closed: SMLogger.LogError("Session was closed due to error or not opened. Use CONNECT <Uri> to open new the session."); return false; default: SMLogger.LogError("Unknown SMSessionState " + session.State); break; } return true; } }
/// <summary> /// Initializes a new instance of the <see cref="HeadersEventArgs"/> class. /// </summary> /// <param name="stream">The stream.</param> /// <param name="headers">The headers.</param> public HeadersEventArgs(SMStream stream, SMHeaders headers) : base(stream) { this.Headers = headers; }
/// <summary> /// Builds the SYN_STREAM frame. /// </summary> /// <param name="stream">The stream.</param> /// <param name="headers">The headers.</param> /// <param name="final">Indicates that stream is not going to send any more data.</param> /// <returns>SYN_STREAM frame.</returns> public ControlFrame BuildSynStreamFrame(SMStream stream, SMHeaders headers, bool final) { ControlFrame frame = BuildControlFrame(FrameType.SynStream, stream, headers); frame.Priority = SYNStreamPriority; frame.IsFinal = final; return frame; }
/// <summary> /// Builds the control frame. /// </summary> /// <param name="type">The frame type.</param> /// <param name="streamId">The SM stream id.</param> /// <param name="headers">The headers.</param> /// <returns>Returns Control frame object.</returns> private static ControlFrame BuildControlFrame(FrameType type, int streamId, SMHeaders headers) { ControlFrame frame = new ControlFrame(headers); frame.StreamId = streamId; frame.Type = type; frame.Priority = ControlPriority; return frame; }
/// <summary> /// Builds the SYN_REPLY frame. /// </summary> /// <param name="streamId">The stream id.</param> /// <param name="headers">The headers.</param> /// <returns>SYN_REPLY frame.</returns> public ControlFrame BuildSynReplyFrame(int streamId, SMHeaders headers) { return(BuildControlFrame(FrameType.SynReply, streamId, headers)); }
/// <summary> /// Builds the SYN_REPLY frame. /// </summary> /// <param name="stream">The stream.</param> /// <param name="headers">The headers.</param> /// <returns>SYN_REPLY frame.</returns> public ControlFrame BuildSynReplyFrame(SMStream stream, SMHeaders headers) { return(BuildControlFrame(FrameType.SynReply, stream, headers)); }
/// <summary> /// Displays the files listing on the server. /// </summary> private static void DisplayFilesListing() { if (session == null) { SMLogger.LogError("Not connected to server. Please use CONNECT to connect to server first."); } else { switch (session.State) { case SMSessionState.Opened: SMHeaders headers = new SMHeaders(); headers[SMHeaders.Path] = "index"; headers[SMHeaders.Version] = "http/1.1"; headers[SMHeaders.Method] = "GET"; headers[SMHeaders.Scheme] = "http"; headers[SMHeaders.ContentType] = ContentTypes.TextPlain; SMStream stream = session.OpenStream(headers, true); stream.OnDataReceived += OnDataReceived; break; case SMSessionState.Closed: SMLogger.LogError("Session was closed due to error or not opened. Use CONNECT <Uri> to open new the session."); break; default: SMLogger.LogError("Unknown SMSessionState"); break; } } }
/// <summary> /// Opens the stream in current session. /// </summary> /// <param name="headers">The S+M headers.</param> /// <param name="isFinal">the final flag.</param> /// <returns>The Stream.</returns> public SMStream OpenStream(SMHeaders headers, bool isFinal) { return this.OpenStream(this.GenerateNewStreamId(), headers, isFinal); }
/// <summary> /// Opens the stream in current session. /// </summary> /// <param name="id">the stream id.</param> /// <param name="headers">The S+M headers.</param> /// <param name="isFinal">the final flag.</param> /// <returns>The Stream.</returns> private SMStream OpenStream(int id, SMHeaders headers, bool isFinal) { if (id <= this.lastSeenStreamId) { this.End(StatusCode.ProtocolError); return null; } this.lastSeenStreamId = id; // don't have to wait for stream opening SMStream stream = new SMStream(id, this); stream.OnClose += this.OnCloseStream; stream.Open(headers, isFinal); this.streams.Add(stream); if (this.OnStreamOpened != null) { this.OnStreamOpened(this, new StreamEventArgs(stream)); } return stream; }
/// <summary> /// Builds the SYN_STREAM frame. /// </summary> /// <param name="streamId">The stream id.</param> /// <param name="headers">The headers.</param> /// <returns>SYN_STREAM frame.</returns> public ControlFrame BuildSynStreamFrame(int streamId, SMHeaders headers) { ControlFrame frame = BuildControlFrame(FrameType.SynStream, streamId, headers); frame.Priority = SYNStreamPriority; return frame; }
/// <summary> /// Builds the headers frame. /// </summary> /// <param name="stream">The stream.</param> /// <param name="headers">The headers.</param> /// <param name="final">if set to <c>true</c> than this frame is final for the stream.</param> /// <returns>Headers frame.</returns> public ControlFrame BuildHeadersFrame(SMStream stream, SMHeaders headers, bool final) { ControlFrame frame = BuildControlFrame(FrameType.Headers, stream, headers); frame.IsFinal = final; return frame; }
private static SMStream DownloadPathForList(string fileName, ref SMSession session, bool isFin) { if (session.State == SMSessionState.Opened) { SMHeaders headers = new SMHeaders(); headers[SMHeaders.Path] = fileName; headers[SMHeaders.Scheme] = fileName; headers[SMHeaders.Version] = "http/1.1"; headers[SMHeaders.Method] = "GET"; headers[SMHeaders.Scheme] = "http"; headers[SMHeaders.ContentType] = ContentTypes.GetTypeFromFileName(fileName); return session.OpenStream(headers, isFin); } return null; }
/// <summary> /// Initializes a new instance of the <see cref="ControlFrame"/> class. /// </summary> /// <param name="headers">The headers.</param> public ControlFrame(SMHeaders headers) { this.IsControl = true; this.Version = SMProtocol.Version; this.Headers = headers ?? new SMHeaders(); }
/// <summary> /// Sends the headers. /// </summary> /// <param name="stream">The stream.</param> /// <param name="headers">The headers.</param> /// <param name="isFin">FIN flag.</param> public void SendHeaders(SMStream stream, SMHeaders headers, bool isFin) { this.SendFrame(stream, this.builder.BuildHeadersFrame(stream, headers, isFin)); }
/// <summary> /// Displays the files listing on the server. /// </summary> private static void DisplayFilesListing() { if (session == null) { SMLogger.LogError("Not connected to server. Please use CONNECT to connect to server first."); } else { switch (session.State) { case SMSessionState.Opened: // event will be set in OnDataReceived event handler rootDownloadEvent.Reset(); rootFileName = "index"; SMHeaders headers = new SMHeaders(); headers[SMHeaders.Path] = "index"; headers[SMHeaders.Version] = "http/1.1"; headers[SMHeaders.Method] = "GET"; headers[SMHeaders.Scheme] = "http"; headers[SMHeaders.ContentType] = ContentTypes.TextPlain; SMStream stream = session.OpenStream(headers, true); stream.OnDataReceived += OnDataReceived; // Wait till we get OnDataReceived if (false == rootDownloadEvent.WaitOne(30000)) { SMLogger.LogError("Timeout on DIR"); } break; case SMSessionState.Closed: SMLogger.LogError("Session was closed due to error or not opened. Use CONNECT <Uri> to open new the session."); break; default: SMLogger.LogError("Unknown SMSessionState"); break; } } }
/// <summary> /// Sends the syn stream request. /// </summary> /// <param name="stream">The stream.</param> /// <param name="headers">The headers.</param> /// <param name="isFin">FIN flag.</param> public void SendSynStream(SMStream stream, SMHeaders headers, bool isFin) { this.SendFrame(this.builder.BuildSynStreamFrame(stream, headers, isFin)); }
/// <summary> /// Sends the headers to the stream. /// </summary> /// <param name="headers">The headers.</param> /// <param name="isFin">if set to <c>true</c> than this stream will be half-closed.</param> public void SendHeaders(SMHeaders headers, bool isFin) { this.Headers.Merge(headers); this.protocol.SendHeaders(this, headers, isFin); }
private byte[] SerializeControlFrameHeaders(SMHeaders frameHeaders) { var headers = new List<byte>(); foreach (KeyValuePair<string, string> pair in frameHeaders) { byte[] nameBin = Encoding.UTF8.GetBytes(pair.Key); headers.AddRange(BinaryHelper.Int32ToBytes(nameBin.Length)); headers.AddRange(nameBin); byte[] valBin = Encoding.UTF8.GetBytes(pair.Value); headers.AddRange(BinaryHelper.Int32ToBytes(valBin.Length)); headers.AddRange(valBin); } return headers.ToArray(); }