Example #1
0
        /// <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);
        }
Example #2
0
        /// <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);
        }
Example #3
0
        /// <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);
        }
Example #4
0
        /// <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);
        }
Example #5
0
        /// <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>
        /// 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);
        }
Example #10
0
        /// <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;
        }
Example #14
0
 /// <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));
 }
Example #15
0
 /// <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;
        }
Example #20
0
 /// <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 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));
 }
Example #25
0
        /// <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();
        }
Example #29
0
 /// <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();
 }
Example #30
0
 /// <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);
 }