refine protocol, add comments. add utest for protocol bytes and timeout.
正在显示
3 个修改的文件
包含
188 行增加
和
10 行删除
@@ -61,48 +61,47 @@ public: | @@ -61,48 +61,47 @@ public: | ||
61 | std::string pageUrl; | 61 | std::string pageUrl; |
62 | std::string swfUrl; | 62 | std::string swfUrl; |
63 | double objectEncoding; | 63 | double objectEncoding; |
64 | - | 64 | +// data discovery from request. |
65 | +public: | ||
66 | + // discovery from tcUrl and play/publish. | ||
65 | std::string schema; | 67 | std::string schema; |
66 | std::string vhost; | 68 | std::string vhost; |
67 | std::string host; | 69 | std::string host; |
68 | std::string port; | 70 | std::string port; |
69 | std::string app; | 71 | std::string app; |
70 | std::string stream; | 72 | std::string stream; |
71 | - | ||
72 | // for play live stream, | 73 | // for play live stream, |
73 | // used to specified the stop when exceed the duration. | 74 | // used to specified the stop when exceed the duration. |
74 | // @see https://github.com/winlinvip/simple-rtmp-server/issues/45 | 75 | // @see https://github.com/winlinvip/simple-rtmp-server/issues/45 |
75 | // in ms. | 76 | // in ms. |
76 | double duration; | 77 | double duration; |
77 | - | ||
78 | // the token in the connect request, | 78 | // the token in the connect request, |
79 | // used for edge traverse to origin authentication, | 79 | // used for edge traverse to origin authentication, |
80 | // @see https://github.com/winlinvip/simple-rtmp-server/issues/104 | 80 | // @see https://github.com/winlinvip/simple-rtmp-server/issues/104 |
81 | SrsAmf0Object* args; | 81 | SrsAmf0Object* args; |
82 | - | 82 | +public: |
83 | SrsRequest(); | 83 | SrsRequest(); |
84 | virtual ~SrsRequest(); | 84 | virtual ~SrsRequest(); |
85 | - | 85 | +public: |
86 | /** | 86 | /** |
87 | * deep copy the request, for source to use it to support reload, | 87 | * deep copy the request, for source to use it to support reload, |
88 | * for when initialize the source, the request is valid, | 88 | * for when initialize the source, the request is valid, |
89 | * when reload it, the request maybe invalid, so need to copy it. | 89 | * when reload it, the request maybe invalid, so need to copy it. |
90 | */ | 90 | */ |
91 | virtual SrsRequest* copy(); | 91 | virtual SrsRequest* copy(); |
92 | - | ||
93 | /** | 92 | /** |
94 | * update the auth info of request, | 93 | * update the auth info of request, |
95 | * to keep the current request ptr is ok, | 94 | * to keep the current request ptr is ok, |
96 | * for many components use the ptr of request. | 95 | * for many components use the ptr of request. |
97 | */ | 96 | */ |
98 | virtual void update_auth(SrsRequest* req); | 97 | virtual void update_auth(SrsRequest* req); |
99 | - | ||
100 | /** | 98 | /** |
101 | * get the stream identify, vhost/app/stream. | 99 | * get the stream identify, vhost/app/stream. |
102 | */ | 100 | */ |
103 | virtual std::string get_stream_url(); | 101 | virtual std::string get_stream_url(); |
104 | - | ||
105 | - // strip url, user must strip when update the url. | 102 | + /** |
103 | + * strip url, user must strip when update the url. | ||
104 | + */ | ||
106 | virtual void strip(); | 105 | virtual void strip(); |
107 | }; | 106 | }; |
108 | 107 | ||
@@ -112,8 +111,11 @@ public: | @@ -112,8 +111,11 @@ public: | ||
112 | class SrsResponse | 111 | class SrsResponse |
113 | { | 112 | { |
114 | public: | 113 | public: |
114 | + /** | ||
115 | + * the stream id to response client createStream. | ||
116 | + */ | ||
115 | int stream_id; | 117 | int stream_id; |
116 | - | 118 | +public: |
117 | SrsResponse(); | 119 | SrsResponse(); |
118 | virtual ~SrsResponse(); | 120 | virtual ~SrsResponse(); |
119 | }; | 121 | }; |
@@ -29,6 +29,8 @@ using namespace std; | @@ -29,6 +29,8 @@ using namespace std; | ||
29 | #include <srs_protocol_utility.hpp> | 29 | #include <srs_protocol_utility.hpp> |
30 | #include <srs_protocol_msg_array.hpp> | 30 | #include <srs_protocol_msg_array.hpp> |
31 | #include <srs_protocol_rtmp_stack.hpp> | 31 | #include <srs_protocol_rtmp_stack.hpp> |
32 | +#include <srs_kernel_utility.hpp> | ||
33 | +#include <srs_app_st.hpp> | ||
32 | 34 | ||
33 | MockEmptyIO::MockEmptyIO() | 35 | MockEmptyIO::MockEmptyIO() |
34 | { | 36 | { |
@@ -91,6 +93,114 @@ int MockEmptyIO::read(void* /*buf*/, size_t /*size*/, ssize_t* /*nread*/) | @@ -91,6 +93,114 @@ int MockEmptyIO::read(void* /*buf*/, size_t /*size*/, ssize_t* /*nread*/) | ||
91 | return ERROR_SUCCESS; | 93 | return ERROR_SUCCESS; |
92 | } | 94 | } |
93 | 95 | ||
96 | +MockBufferIO::MockBufferIO() | ||
97 | +{ | ||
98 | + recv_timeout = send_timeout = ST_UTIME_NO_TIMEOUT; | ||
99 | + recv_bytes = send_bytes = 0; | ||
100 | +} | ||
101 | + | ||
102 | +MockBufferIO::~MockBufferIO() | ||
103 | +{ | ||
104 | +} | ||
105 | + | ||
106 | +bool MockBufferIO::is_never_timeout(int64_t timeout_us) | ||
107 | +{ | ||
108 | + return (int64_t)ST_UTIME_NO_TIMEOUT == timeout_us; | ||
109 | +} | ||
110 | + | ||
111 | +int MockBufferIO::read_fully(void* buf, size_t size, ssize_t* nread) | ||
112 | +{ | ||
113 | + if (in_buffer.length() < (int)size) { | ||
114 | + return ERROR_SOCKET_READ; | ||
115 | + } | ||
116 | + memcpy(buf, in_buffer.bytes(), size); | ||
117 | + | ||
118 | + recv_bytes += size; | ||
119 | + if (nread) { | ||
120 | + *nread = size; | ||
121 | + } | ||
122 | + in_buffer.erase(size); | ||
123 | + return ERROR_SUCCESS; | ||
124 | +} | ||
125 | + | ||
126 | +int MockBufferIO::write(void* buf, size_t size, ssize_t* nwrite) | ||
127 | +{ | ||
128 | + send_bytes += size; | ||
129 | + if (nwrite) { | ||
130 | + *nwrite = size; | ||
131 | + } | ||
132 | + out_buffer.append((char*)buf, size); | ||
133 | + return ERROR_SUCCESS; | ||
134 | +} | ||
135 | + | ||
136 | +void MockBufferIO::set_recv_timeout(int64_t timeout_us) | ||
137 | +{ | ||
138 | + recv_timeout = timeout_us; | ||
139 | +} | ||
140 | + | ||
141 | +int64_t MockBufferIO::get_recv_timeout() | ||
142 | +{ | ||
143 | + return recv_timeout; | ||
144 | +} | ||
145 | + | ||
146 | +int64_t MockBufferIO::get_recv_bytes() | ||
147 | +{ | ||
148 | + return recv_bytes; | ||
149 | +} | ||
150 | + | ||
151 | +void MockBufferIO::set_send_timeout(int64_t timeout_us) | ||
152 | +{ | ||
153 | + send_timeout = timeout_us; | ||
154 | +} | ||
155 | + | ||
156 | +int64_t MockBufferIO::get_send_timeout() | ||
157 | +{ | ||
158 | + return send_timeout; | ||
159 | +} | ||
160 | + | ||
161 | +int64_t MockBufferIO::get_send_bytes() | ||
162 | +{ | ||
163 | + return send_bytes; | ||
164 | +} | ||
165 | + | ||
166 | +int MockBufferIO::writev(const iovec *iov, int iov_size, ssize_t* nwrite) | ||
167 | +{ | ||
168 | + int ret = ERROR_SUCCESS; | ||
169 | + | ||
170 | + ssize_t total = 0; | ||
171 | + for (int i = 0; i <iov_size; i++) { | ||
172 | + const iovec& pi = iov[i]; | ||
173 | + | ||
174 | + ssize_t writen = 0; | ||
175 | + if ((ret = write(pi.iov_base, pi.iov_len, &writen)) != ERROR_SUCCESS) { | ||
176 | + return ret; | ||
177 | + } | ||
178 | + total += writen; | ||
179 | + } | ||
180 | + | ||
181 | + if (nwrite) { | ||
182 | + *nwrite = total; | ||
183 | + } | ||
184 | + return ret; | ||
185 | +} | ||
186 | + | ||
187 | +int MockBufferIO::read(void* buf, size_t size, ssize_t* nread) | ||
188 | +{ | ||
189 | + if (in_buffer.length() <= 0) { | ||
190 | + return ERROR_SOCKET_READ; | ||
191 | + } | ||
192 | + | ||
193 | + size_t available = srs_min(in_buffer.length(), (int)size); | ||
194 | + memcpy(buf, in_buffer.bytes(), available); | ||
195 | + | ||
196 | + recv_bytes += available; | ||
197 | + if (nread) { | ||
198 | + *nread = available; | ||
199 | + } | ||
200 | + in_buffer.erase(available); | ||
201 | + return ERROR_SUCCESS; | ||
202 | +} | ||
203 | + | ||
94 | #ifdef SRS_AUTO_SSL | 204 | #ifdef SRS_AUTO_SSL |
95 | 205 | ||
96 | // verify the sha256 | 206 | // verify the sha256 |
@@ -426,3 +536,31 @@ VOID TEST(ProtocolMsgArrayTest, MessageArray) | @@ -426,3 +536,31 @@ VOID TEST(ProtocolMsgArrayTest, MessageArray) | ||
426 | EXPECT_EQ(0, msg.count()); | 536 | EXPECT_EQ(0, msg.count()); |
427 | } | 537 | } |
428 | 538 | ||
539 | +VOID TEST(ProtocolStackTest, ProtocolTimeout) | ||
540 | +{ | ||
541 | + MockBufferIO bio; | ||
542 | + SrsProtocol proto(&bio); | ||
543 | + | ||
544 | + EXPECT_TRUE((int64_t)ST_UTIME_NO_TIMEOUT == proto.get_recv_timeout()); | ||
545 | + EXPECT_TRUE((int64_t)ST_UTIME_NO_TIMEOUT == proto.get_send_timeout()); | ||
546 | + | ||
547 | + proto.set_recv_timeout(10); | ||
548 | + EXPECT_TRUE(10 == proto.get_recv_timeout()); | ||
549 | + | ||
550 | + proto.set_send_timeout(10); | ||
551 | + EXPECT_TRUE(10 == proto.get_send_timeout()); | ||
552 | +} | ||
553 | + | ||
554 | +VOID TEST(ProtocolStackTest, ProtocolBytes) | ||
555 | +{ | ||
556 | + MockBufferIO bio; | ||
557 | + SrsProtocol proto(&bio); | ||
558 | + | ||
559 | + EXPECT_TRUE(0 == proto.get_recv_bytes()); | ||
560 | + EXPECT_TRUE(0 == proto.get_send_bytes()); | ||
561 | + | ||
562 | + SrsConnectAppPacket* pkt = new SrsConnectAppPacket(); | ||
563 | + proto.send_and_free_packet(pkt, 0); | ||
564 | + EXPECT_TRUE(0 < proto.get_send_bytes()); | ||
565 | +} | ||
566 | + |
@@ -34,6 +34,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -34,6 +34,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
34 | 34 | ||
35 | #include <srs_protocol_rtmp.hpp> | 35 | #include <srs_protocol_rtmp.hpp> |
36 | #include <srs_protocol_handshake.hpp> | 36 | #include <srs_protocol_handshake.hpp> |
37 | +#include <srs_kernel_buffer.hpp> | ||
37 | 38 | ||
38 | #ifdef SRS_AUTO_SSL | 39 | #ifdef SRS_AUTO_SSL |
39 | using namespace _srs_internal; | 40 | using namespace _srs_internal; |
@@ -69,4 +70,41 @@ public: | @@ -69,4 +70,41 @@ public: | ||
69 | virtual int read(void* buf, size_t size, ssize_t* nread); | 70 | virtual int read(void* buf, size_t size, ssize_t* nread); |
70 | }; | 71 | }; |
71 | 72 | ||
73 | +class MockBufferIO : public ISrsProtocolReaderWriter | ||
74 | +{ | ||
75 | +public: | ||
76 | + int64_t recv_timeout; | ||
77 | + int64_t send_timeout; | ||
78 | + int64_t recv_bytes; | ||
79 | + int64_t send_bytes; | ||
80 | + // data source for socket read. | ||
81 | + SrsBuffer in_buffer; | ||
82 | + // data buffer for socket send. | ||
83 | + SrsBuffer out_buffer; | ||
84 | +public: | ||
85 | + MockBufferIO(); | ||
86 | + virtual ~MockBufferIO(); | ||
87 | +// for protocol | ||
88 | +public: | ||
89 | + virtual bool is_never_timeout(int64_t timeout_us); | ||
90 | +// for handshake. | ||
91 | +public: | ||
92 | + virtual int read_fully(void* buf, size_t size, ssize_t* nread); | ||
93 | + virtual int write(void* buf, size_t size, ssize_t* nwrite); | ||
94 | +// for protocol | ||
95 | +public: | ||
96 | + virtual void set_recv_timeout(int64_t timeout_us); | ||
97 | + virtual int64_t get_recv_timeout(); | ||
98 | + virtual int64_t get_recv_bytes(); | ||
99 | +// for protocol | ||
100 | +public: | ||
101 | + virtual void set_send_timeout(int64_t timeout_us); | ||
102 | + virtual int64_t get_send_timeout(); | ||
103 | + virtual int64_t get_send_bytes(); | ||
104 | + virtual int writev(const iovec *iov, int iov_size, ssize_t* nwrite); | ||
105 | +// for protocol/amf0/msg-codec | ||
106 | +public: | ||
107 | + virtual int read(void* buf, size_t size, ssize_t* nread); | ||
108 | +}; | ||
109 | + | ||
72 | #endif | 110 | #endif |
-
请 注册 或 登录 后发表评论