@@ -98,20 +98,21 @@ int SrsHttpResponseWriter::write(char* data, int size)
9898
9999 if (!header_wrote) {
100100 write_header (SRS_CONSTS_HTTP_OK);
101+
102+ if ((ret = send_header (data, size)) != ERROR_SUCCESS) {
103+ srs_error (" http: send header failed. ret=%d" , ret);
104+ return ret;
105+ }
101106 }
102107
108+ // check the bytes send and content length.
103109 written += size;
104110 if (content_length != -1 && written > content_length) {
105111 ret = ERROR_HTTP_CONTENT_LENGTH;
106112 srs_error (" http: exceed content length. ret=%d" , ret);
107113 return ret;
108114 }
109115
110- if ((ret = send_header (data, size)) != ERROR_SUCCESS) {
111- srs_error (" http: send header failed. ret=%d" , ret);
112- return ret;
113- }
114-
115116 // ignore NULL content.
116117 if (!data) {
117118 return ret;
@@ -143,6 +144,71 @@ int SrsHttpResponseWriter::write(char* data, int size)
143144 return ret;
144145}
145146
147+ int SrsHttpResponseWriter::writev (iovec* iov, int iovcnt, ssize_t * pnwrite)
148+ {
149+ int ret = ERROR_SUCCESS;
150+
151+ // when header not ready, or not chunked, send one by one.
152+ if (!header_wrote || content_length != -1 ) {
153+ ssize_t nwrite = 0 ;
154+ for (int i = 0 ; i < iovcnt; i++) {
155+ iovec* piovc = iov + i;
156+ nwrite += piovc->iov_len ;
157+ if ((ret = write ((char *)piovc->iov_base , (int )piovc->iov_len )) != ERROR_SUCCESS) {
158+ return ret;
159+ }
160+ }
161+
162+ if (pnwrite) {
163+ *pnwrite = nwrite;
164+ }
165+
166+ return ret;
167+ }
168+
169+ // ignore NULL content.
170+ if (iovcnt <= 0 ) {
171+ return ret;
172+ }
173+
174+ // send in chunked encoding.
175+ int nb_iovss = iovcnt * 4 ;
176+ iovec* iovss = new iovec[nb_iovss];
177+ SrsAutoFree (iovec, iovss);
178+
179+ char * pheader_cache = header_cache;
180+ for (int i = 0 ; i < iovcnt; i++) {
181+ int left = SRS_HTTP_HEADER_CACHE_SIZE - (int )(pheader_cache - header_cache);
182+ srs_assert (left > 0 );
183+
184+ iovec* data_iov = iov + i;
185+ int nb_size = snprintf (pheader_cache, left, " %x" , (int )data_iov->iov_len );
186+
187+ iovec* iovs = iovss + (i * 4 );
188+ iovs[0 ].iov_base = (char *)pheader_cache;
189+ iovs[0 ].iov_len = (int )nb_size;
190+ iovs[1 ].iov_base = (char *)SRS_HTTP_CRLF;
191+ iovs[1 ].iov_len = 2 ;
192+ iovs[2 ].iov_base = (char *)data_iov->iov_base ;
193+ iovs[2 ].iov_len = (int )data_iov->iov_len ;
194+ iovs[3 ].iov_base = (char *)SRS_HTTP_CRLF;
195+ iovs[3 ].iov_len = 2 ;
196+
197+ pheader_cache += nb_size;
198+ }
199+
200+ ssize_t nwrite;
201+ if ((ret = skt->writev (iovss, nb_iovss, &nwrite)) != ERROR_SUCCESS) {
202+ return ret;
203+ }
204+
205+ if (pnwrite) {
206+ *pnwrite = nwrite;
207+ }
208+
209+ return ret;
210+ }
211+
146212void SrsHttpResponseWriter::write_header (int code)
147213{
148214 if (header_wrote) {
@@ -1513,6 +1579,11 @@ int SrsStreamWriter::write(void* buf, size_t count, ssize_t* pnwrite)
15131579 return writer->write ((char *)buf, (int )count);
15141580}
15151581
1582+ int SrsStreamWriter::writev (iovec* iov, int iovcnt, ssize_t * pnwrite)
1583+ {
1584+ return writer->writev (iov, iovcnt, pnwrite);
1585+ }
1586+
15161587SrsLiveStream::SrsLiveStream (SrsSource* s, SrsRequest* r, SrsStreamCache* c)
15171588{
15181589 source = s;
0 commit comments