正在显示
3 个修改的文件
包含
335 行增加
和
39 行删除
| @@ -236,7 +236,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -236,7 +236,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 236 | #define ERROR_REQUEST_DATA 3066 | 236 | #define ERROR_REQUEST_DATA 3066 |
| 237 | 237 | ||
| 238 | /////////////////////////////////////////////////////// | 238 | /////////////////////////////////////////////////////// |
| 239 | -// HTTP/StreamCaster protocol error. | 239 | +// HTTP/StreamCaster/KAFKA protocol error. |
| 240 | /////////////////////////////////////////////////////// | 240 | /////////////////////////////////////////////////////// |
| 241 | #define ERROR_HTTP_PATTERN_EMPTY 4000 | 241 | #define ERROR_HTTP_PATTERN_EMPTY 4000 |
| 242 | #define ERROR_HTTP_PATTERN_DUPLICATED 4001 | 242 | #define ERROR_HTTP_PATTERN_DUPLICATED 4001 |
| @@ -268,6 +268,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -268,6 +268,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 268 | #define ERROR_AVC_NALU_UEV 4027 | 268 | #define ERROR_AVC_NALU_UEV 4027 |
| 269 | #define ERROR_AAC_BYTES_INVALID 4028 | 269 | #define ERROR_AAC_BYTES_INVALID 4028 |
| 270 | #define ERROR_HTTP_REQUEST_EOF 4029 | 270 | #define ERROR_HTTP_REQUEST_EOF 4029 |
| 271 | +#define ERROR_KAFKA_CODEC_STRING 4030 | ||
| 272 | +#define ERROR_KAFKA_CODEC_BYTES 4031 | ||
| 273 | +#define ERROR_KAFKA_CODEC_REQUEST 4032 | ||
| 274 | +#define ERROR_KAFKA_CODEC_RESPONSE 4033 | ||
| 271 | 275 | ||
| 272 | /////////////////////////////////////////////////////// | 276 | /////////////////////////////////////////////////////// |
| 273 | // HTTP API error. | 277 | // HTTP API error. |
| @@ -29,22 +29,23 @@ using namespace std; | @@ -29,22 +29,23 @@ using namespace std; | ||
| 29 | #include <srs_kernel_error.hpp> | 29 | #include <srs_kernel_error.hpp> |
| 30 | #include <srs_core_autofree.hpp> | 30 | #include <srs_core_autofree.hpp> |
| 31 | #include <srs_kernel_log.hpp> | 31 | #include <srs_kernel_log.hpp> |
| 32 | +#include <srs_protocol_io.hpp> | ||
| 32 | 33 | ||
| 33 | #ifdef SRS_AUTO_KAFKA | 34 | #ifdef SRS_AUTO_KAFKA |
| 34 | 35 | ||
| 35 | SrsKafkaString::SrsKafkaString() | 36 | SrsKafkaString::SrsKafkaString() |
| 36 | { | 37 | { |
| 37 | - size = -1; | 38 | + _size = -1; |
| 38 | data = NULL; | 39 | data = NULL; |
| 39 | } | 40 | } |
| 40 | 41 | ||
| 41 | SrsKafkaString::SrsKafkaString(string v) | 42 | SrsKafkaString::SrsKafkaString(string v) |
| 42 | { | 43 | { |
| 43 | - size = (int16_t)v.length(); | 44 | + _size = (int16_t)v.length(); |
| 44 | 45 | ||
| 45 | - srs_assert(size > 0); | ||
| 46 | - data = new char[size]; | ||
| 47 | - memcpy(data, v.data(), size); | 46 | + srs_assert(_size > 0); |
| 47 | + data = new char[_size]; | ||
| 48 | + memcpy(data, v.data(), _size); | ||
| 48 | } | 49 | } |
| 49 | 50 | ||
| 50 | SrsKafkaString::~SrsKafkaString() | 51 | SrsKafkaString::~SrsKafkaString() |
| @@ -54,32 +55,92 @@ SrsKafkaString::~SrsKafkaString() | @@ -54,32 +55,92 @@ SrsKafkaString::~SrsKafkaString() | ||
| 54 | 55 | ||
| 55 | bool SrsKafkaString::null() | 56 | bool SrsKafkaString::null() |
| 56 | { | 57 | { |
| 57 | - return size == -1; | 58 | + return _size == -1; |
| 58 | } | 59 | } |
| 59 | 60 | ||
| 60 | bool SrsKafkaString::empty() | 61 | bool SrsKafkaString::empty() |
| 61 | { | 62 | { |
| 62 | - return size <= 0; | 63 | + return _size <= 0; |
| 63 | } | 64 | } |
| 64 | 65 | ||
| 65 | -int SrsKafkaString::total_size() | 66 | +int SrsKafkaString::size() |
| 66 | { | 67 | { |
| 67 | - return 2 + (size == -1? 0 : size); | 68 | + return _size == -1? 2 : 2 + _size; |
| 69 | +} | ||
| 70 | + | ||
| 71 | +int SrsKafkaString::encode(SrsBuffer* buf) | ||
| 72 | +{ | ||
| 73 | + int ret = ERROR_SUCCESS; | ||
| 74 | + | ||
| 75 | + if (!buf->require(2)) { | ||
| 76 | + ret = ERROR_KAFKA_CODEC_STRING; | ||
| 77 | + srs_error("kafka encode string failed. ret=%d", ret); | ||
| 78 | + return ret; | ||
| 79 | + } | ||
| 80 | + buf->write_2bytes(_size); | ||
| 81 | + | ||
| 82 | + if (_size <= 0) { | ||
| 83 | + return ret; | ||
| 84 | + } | ||
| 85 | + | ||
| 86 | + if (!buf->require(_size)) { | ||
| 87 | + ret = ERROR_KAFKA_CODEC_STRING; | ||
| 88 | + srs_error("kafka encode string data failed. ret=%d", ret); | ||
| 89 | + return ret; | ||
| 90 | + } | ||
| 91 | + buf->write_bytes(data, _size); | ||
| 92 | + | ||
| 93 | + return ret; | ||
| 94 | +} | ||
| 95 | + | ||
| 96 | +int SrsKafkaString::decode(SrsBuffer* buf) | ||
| 97 | +{ | ||
| 98 | + int ret = ERROR_SUCCESS; | ||
| 99 | + | ||
| 100 | + if (!buf->require(2)) { | ||
| 101 | + ret = ERROR_KAFKA_CODEC_STRING; | ||
| 102 | + srs_error("kafka decode string failed. ret=%d", ret); | ||
| 103 | + return ret; | ||
| 104 | + } | ||
| 105 | + _size = buf->read_2bytes(); | ||
| 106 | + | ||
| 107 | + if (_size != -1 && _size < 0) { | ||
| 108 | + ret = ERROR_KAFKA_CODEC_STRING; | ||
| 109 | + srs_error("kafka string must be -1 or >=0, actual is %d. ret=%d", _size, ret); | ||
| 110 | + return ret; | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + if (_size <= 0) { | ||
| 114 | + return ret; | ||
| 115 | + } | ||
| 116 | + | ||
| 117 | + if (!buf->require(_size)) { | ||
| 118 | + ret = ERROR_KAFKA_CODEC_STRING; | ||
| 119 | + srs_error("kafka decode string data failed. ret=%d", ret); | ||
| 120 | + return ret; | ||
| 121 | + } | ||
| 122 | + | ||
| 123 | + srs_freep(data); | ||
| 124 | + data = new char[_size]; | ||
| 125 | + | ||
| 126 | + buf->read_bytes(data, _size); | ||
| 127 | + | ||
| 128 | + return ret; | ||
| 68 | } | 129 | } |
| 69 | 130 | ||
| 70 | SrsKafkaBytes::SrsKafkaBytes() | 131 | SrsKafkaBytes::SrsKafkaBytes() |
| 71 | { | 132 | { |
| 72 | - size = -1; | 133 | + _size = -1; |
| 73 | data = NULL; | 134 | data = NULL; |
| 74 | } | 135 | } |
| 75 | 136 | ||
| 76 | SrsKafkaBytes::SrsKafkaBytes(const char* v, int nb_v) | 137 | SrsKafkaBytes::SrsKafkaBytes(const char* v, int nb_v) |
| 77 | { | 138 | { |
| 78 | - size = (int16_t)nb_v; | 139 | + _size = (int16_t)nb_v; |
| 79 | 140 | ||
| 80 | - srs_assert(size > 0); | ||
| 81 | - data = new char[size]; | ||
| 82 | - memcpy(data, v, size); | 141 | + srs_assert(_size > 0); |
| 142 | + data = new char[_size]; | ||
| 143 | + memcpy(data, v, _size); | ||
| 83 | } | 144 | } |
| 84 | 145 | ||
| 85 | SrsKafkaBytes::~SrsKafkaBytes() | 146 | SrsKafkaBytes::~SrsKafkaBytes() |
| @@ -89,17 +150,72 @@ SrsKafkaBytes::~SrsKafkaBytes() | @@ -89,17 +150,72 @@ SrsKafkaBytes::~SrsKafkaBytes() | ||
| 89 | 150 | ||
| 90 | bool SrsKafkaBytes::null() | 151 | bool SrsKafkaBytes::null() |
| 91 | { | 152 | { |
| 92 | - return size == -1; | 153 | + return _size == -1; |
| 93 | } | 154 | } |
| 94 | 155 | ||
| 95 | bool SrsKafkaBytes::empty() | 156 | bool SrsKafkaBytes::empty() |
| 96 | { | 157 | { |
| 97 | - return size <= 0; | 158 | + return _size <= 0; |
| 98 | } | 159 | } |
| 99 | 160 | ||
| 100 | -int SrsKafkaBytes::total_size() | 161 | +int SrsKafkaBytes::size() |
| 101 | { | 162 | { |
| 102 | - return 4 + (size == -1? 0 : size); | 163 | + return 4 + (_size == -1? 0 : _size); |
| 164 | +} | ||
| 165 | + | ||
| 166 | +int SrsKafkaBytes::encode(SrsBuffer* buf) | ||
| 167 | +{ | ||
| 168 | + int ret = ERROR_SUCCESS; | ||
| 169 | + | ||
| 170 | + if (!buf->require(4)) { | ||
| 171 | + ret = ERROR_KAFKA_CODEC_BYTES; | ||
| 172 | + srs_error("kafka encode bytes failed. ret=%d", ret); | ||
| 173 | + return ret; | ||
| 174 | + } | ||
| 175 | + buf->write_4bytes(_size); | ||
| 176 | + | ||
| 177 | + if (_size <= 0) { | ||
| 178 | + return ret; | ||
| 179 | + } | ||
| 180 | + | ||
| 181 | + if (!buf->require(_size)) { | ||
| 182 | + ret = ERROR_KAFKA_CODEC_BYTES; | ||
| 183 | + srs_error("kafka encode bytes data failed. ret=%d", ret); | ||
| 184 | + return ret; | ||
| 185 | + } | ||
| 186 | + buf->write_bytes(data, _size); | ||
| 187 | + | ||
| 188 | + return ret; | ||
| 189 | +} | ||
| 190 | + | ||
| 191 | +int SrsKafkaBytes::decode(SrsBuffer* buf) | ||
| 192 | +{ | ||
| 193 | + int ret = ERROR_SUCCESS; | ||
| 194 | + | ||
| 195 | + if (!buf->require(4)) { | ||
| 196 | + ret = ERROR_KAFKA_CODEC_BYTES; | ||
| 197 | + srs_error("kafka decode bytes failed. ret=%d", ret); | ||
| 198 | + return ret; | ||
| 199 | + } | ||
| 200 | + _size = buf->read_4bytes(); | ||
| 201 | + | ||
| 202 | + if (_size != -1 && _size < 0) { | ||
| 203 | + ret = ERROR_KAFKA_CODEC_BYTES; | ||
| 204 | + srs_error("kafka bytes must be -1 or >=0, actual is %d. ret=%d", _size, ret); | ||
| 205 | + return ret; | ||
| 206 | + } | ||
| 207 | + | ||
| 208 | + if (!buf->require(_size)) { | ||
| 209 | + ret = ERROR_KAFKA_CODEC_BYTES; | ||
| 210 | + srs_error("kafka decode bytes data failed. ret=%d", ret); | ||
| 211 | + return ret; | ||
| 212 | + } | ||
| 213 | + | ||
| 214 | + srs_freep(data); | ||
| 215 | + data = new char[_size]; | ||
| 216 | + buf->read_bytes(data, _size); | ||
| 217 | + | ||
| 218 | + return ret; | ||
| 103 | } | 219 | } |
| 104 | 220 | ||
| 105 | SrsKafkaRequestHeader::SrsKafkaRequestHeader() | 221 | SrsKafkaRequestHeader::SrsKafkaRequestHeader() |
| @@ -117,7 +233,7 @@ SrsKafkaRequestHeader::~SrsKafkaRequestHeader() | @@ -117,7 +233,7 @@ SrsKafkaRequestHeader::~SrsKafkaRequestHeader() | ||
| 117 | 233 | ||
| 118 | int SrsKafkaRequestHeader::header_size() | 234 | int SrsKafkaRequestHeader::header_size() |
| 119 | { | 235 | { |
| 120 | - return 2 + 2 + 4 + client_id->total_size(); | 236 | + return 2 + 2 + 4 + client_id->size(); |
| 121 | } | 237 | } |
| 122 | 238 | ||
| 123 | int SrsKafkaRequestHeader::message_size() | 239 | int SrsKafkaRequestHeader::message_size() |
| @@ -178,14 +294,56 @@ int SrsKafkaRequestHeader::size() | @@ -178,14 +294,56 @@ int SrsKafkaRequestHeader::size() | ||
| 178 | int SrsKafkaRequestHeader::encode(SrsBuffer* buf) | 294 | int SrsKafkaRequestHeader::encode(SrsBuffer* buf) |
| 179 | { | 295 | { |
| 180 | int ret = ERROR_SUCCESS; | 296 | int ret = ERROR_SUCCESS; |
| 181 | - // TODO: FIXME: implements it. | 297 | + |
| 298 | + if (!buf->require(4 + _size)) { | ||
| 299 | + ret = ERROR_KAFKA_CODEC_REQUEST; | ||
| 300 | + srs_error("kafka encode request failed. ret=%d", ret); | ||
| 301 | + return ret; | ||
| 302 | + } | ||
| 303 | + | ||
| 304 | + buf->write_4bytes(_size); | ||
| 305 | + buf->write_2bytes(api_key); | ||
| 306 | + buf->write_2bytes(api_version); | ||
| 307 | + buf->write_4bytes(correlation_id); | ||
| 308 | + | ||
| 309 | + if ((ret = client_id->encode(buf)) != ERROR_SUCCESS) { | ||
| 310 | + srs_error("kafka encode request client_id failed. ret=%d", ret); | ||
| 311 | + return ret; | ||
| 312 | + } | ||
| 313 | + | ||
| 182 | return ret; | 314 | return ret; |
| 183 | } | 315 | } |
| 184 | 316 | ||
| 185 | int SrsKafkaRequestHeader::decode(SrsBuffer* buf) | 317 | int SrsKafkaRequestHeader::decode(SrsBuffer* buf) |
| 186 | { | 318 | { |
| 187 | int ret = ERROR_SUCCESS; | 319 | int ret = ERROR_SUCCESS; |
| 188 | - // TODO: FIXME: implements it. | 320 | + |
| 321 | + if (!buf->require(4)) { | ||
| 322 | + ret = ERROR_KAFKA_CODEC_REQUEST; | ||
| 323 | + srs_error("kafka decode request size failed. ret=%d", ret); | ||
| 324 | + return ret; | ||
| 325 | + } | ||
| 326 | + _size = buf->read_4bytes(); | ||
| 327 | + | ||
| 328 | + if (_size <= 0) { | ||
| 329 | + srs_warn("kafka got empty request"); | ||
| 330 | + return ret; | ||
| 331 | + } | ||
| 332 | + | ||
| 333 | + if (!buf->require(_size)) { | ||
| 334 | + ret = ERROR_KAFKA_CODEC_REQUEST; | ||
| 335 | + srs_error("kafka decode request message failed. ret=%d", ret); | ||
| 336 | + return ret; | ||
| 337 | + } | ||
| 338 | + api_key = buf->read_2bytes(); | ||
| 339 | + api_version = buf->read_2bytes(); | ||
| 340 | + correlation_id = buf->read_4bytes(); | ||
| 341 | + | ||
| 342 | + if ((ret = client_id->decode(buf)) != ERROR_SUCCESS) { | ||
| 343 | + srs_error("kafka decode request client_id failed. ret=%d", ret); | ||
| 344 | + return ret; | ||
| 345 | + } | ||
| 346 | + | ||
| 189 | return ret; | 347 | return ret; |
| 190 | } | 348 | } |
| 191 | 349 | ||
| @@ -222,14 +380,42 @@ int SrsKafkaResponseHeader::size() | @@ -222,14 +380,42 @@ int SrsKafkaResponseHeader::size() | ||
| 222 | int SrsKafkaResponseHeader::encode(SrsBuffer* buf) | 380 | int SrsKafkaResponseHeader::encode(SrsBuffer* buf) |
| 223 | { | 381 | { |
| 224 | int ret = ERROR_SUCCESS; | 382 | int ret = ERROR_SUCCESS; |
| 225 | - // TODO: FIXME: implements it. | 383 | + |
| 384 | + if (!buf->require(4 + _size)) { | ||
| 385 | + ret = ERROR_KAFKA_CODEC_RESPONSE; | ||
| 386 | + srs_error("kafka encode response failed. ret=%d", ret); | ||
| 387 | + return ret; | ||
| 388 | + } | ||
| 389 | + | ||
| 390 | + buf->write_4bytes(_size); | ||
| 391 | + buf->write_4bytes(correlation_id); | ||
| 392 | + | ||
| 226 | return ret; | 393 | return ret; |
| 227 | } | 394 | } |
| 228 | 395 | ||
| 229 | int SrsKafkaResponseHeader::decode(SrsBuffer* buf) | 396 | int SrsKafkaResponseHeader::decode(SrsBuffer* buf) |
| 230 | { | 397 | { |
| 231 | int ret = ERROR_SUCCESS; | 398 | int ret = ERROR_SUCCESS; |
| 232 | - // TODO: FIXME: implements it. | 399 | + |
| 400 | + if (!buf->require(4)) { | ||
| 401 | + ret = ERROR_KAFKA_CODEC_RESPONSE; | ||
| 402 | + srs_error("kafka decode response size failed. ret=%d", ret); | ||
| 403 | + return ret; | ||
| 404 | + } | ||
| 405 | + _size = buf->read_4bytes(); | ||
| 406 | + | ||
| 407 | + if (_size <= 0) { | ||
| 408 | + srs_warn("kafka got empty response"); | ||
| 409 | + return ret; | ||
| 410 | + } | ||
| 411 | + | ||
| 412 | + if (!buf->require(_size)) { | ||
| 413 | + ret = ERROR_KAFKA_CODEC_RESPONSE; | ||
| 414 | + srs_error("kafka decode response message failed. ret=%d", ret); | ||
| 415 | + return ret; | ||
| 416 | + } | ||
| 417 | + correlation_id = buf->read_4bytes(); | ||
| 418 | + | ||
| 233 | return ret; | 419 | return ret; |
| 234 | } | 420 | } |
| 235 | 421 | ||
| @@ -326,22 +512,40 @@ void SrsKafkaTopicMetadataRequest::add_topic(string topic) | @@ -326,22 +512,40 @@ void SrsKafkaTopicMetadataRequest::add_topic(string topic) | ||
| 326 | 512 | ||
| 327 | int SrsKafkaTopicMetadataRequest::size() | 513 | int SrsKafkaTopicMetadataRequest::size() |
| 328 | { | 514 | { |
| 329 | - int ret = ERROR_SUCCESS; | ||
| 330 | - // TODO: FIXME: implements it. | ||
| 331 | - return ret; | 515 | + return SrsKafkaRequest::size() + topics.size(); |
| 332 | } | 516 | } |
| 333 | 517 | ||
| 334 | int SrsKafkaTopicMetadataRequest::encode(SrsBuffer* buf) | 518 | int SrsKafkaTopicMetadataRequest::encode(SrsBuffer* buf) |
| 335 | { | 519 | { |
| 336 | int ret = ERROR_SUCCESS; | 520 | int ret = ERROR_SUCCESS; |
| 337 | - // TODO: FIXME: implements it. | 521 | + |
| 522 | + if ((ret = SrsKafkaRequest::encode(buf)) != ERROR_SUCCESS) { | ||
| 523 | + srs_error("kafka encode metadata request failed. ret=%d", ret); | ||
| 524 | + return ret; | ||
| 525 | + } | ||
| 526 | + | ||
| 527 | + if ((ret = topics.encode(buf)) != ERROR_SUCCESS) { | ||
| 528 | + srs_error("kafka encode metadata topics failed. ret=%d", ret); | ||
| 529 | + return ret; | ||
| 530 | + } | ||
| 531 | + | ||
| 338 | return ret; | 532 | return ret; |
| 339 | } | 533 | } |
| 340 | 534 | ||
| 341 | int SrsKafkaTopicMetadataRequest::decode(SrsBuffer* buf) | 535 | int SrsKafkaTopicMetadataRequest::decode(SrsBuffer* buf) |
| 342 | { | 536 | { |
| 343 | int ret = ERROR_SUCCESS; | 537 | int ret = ERROR_SUCCESS; |
| 344 | - // TODO: FIXME: implements it. | 538 | + |
| 539 | + if ((ret = SrsKafkaRequest::decode(buf)) != ERROR_SUCCESS) { | ||
| 540 | + srs_error("kafka decode metadata request failed. ret=%d", ret); | ||
| 541 | + return ret; | ||
| 542 | + } | ||
| 543 | + | ||
| 544 | + if ((ret = topics.decode(buf)) != ERROR_SUCCESS) { | ||
| 545 | + srs_error("kafka decode metadata topics failed. ret=%d", ret); | ||
| 546 | + return ret; | ||
| 547 | + } | ||
| 548 | + | ||
| 345 | return ret; | 549 | return ret; |
| 346 | } | 550 | } |
| 347 | 551 | ||
| @@ -355,14 +559,19 @@ SrsKafkaTopicMetadataResponse::~SrsKafkaTopicMetadataResponse() | @@ -355,14 +559,19 @@ SrsKafkaTopicMetadataResponse::~SrsKafkaTopicMetadataResponse() | ||
| 355 | 559 | ||
| 356 | int SrsKafkaTopicMetadataResponse::size() | 560 | int SrsKafkaTopicMetadataResponse::size() |
| 357 | { | 561 | { |
| 358 | - int ret = ERROR_SUCCESS; | ||
| 359 | // TODO: FIXME: implements it. | 562 | // TODO: FIXME: implements it. |
| 360 | - return ret; | 563 | + return SrsKafkaResponse::size(); |
| 361 | } | 564 | } |
| 362 | 565 | ||
| 363 | int SrsKafkaTopicMetadataResponse::encode(SrsBuffer* buf) | 566 | int SrsKafkaTopicMetadataResponse::encode(SrsBuffer* buf) |
| 364 | { | 567 | { |
| 365 | int ret = ERROR_SUCCESS; | 568 | int ret = ERROR_SUCCESS; |
| 569 | + | ||
| 570 | + if ((ret = SrsKafkaResponse::encode(buf)) != ERROR_SUCCESS) { | ||
| 571 | + srs_error("kafka encode metadata response failed. ret=%d", ret); | ||
| 572 | + return ret; | ||
| 573 | + } | ||
| 574 | + | ||
| 366 | // TODO: FIXME: implements it. | 575 | // TODO: FIXME: implements it. |
| 367 | return ret; | 576 | return ret; |
| 368 | } | 577 | } |
| @@ -370,6 +579,12 @@ int SrsKafkaTopicMetadataResponse::encode(SrsBuffer* buf) | @@ -370,6 +579,12 @@ int SrsKafkaTopicMetadataResponse::encode(SrsBuffer* buf) | ||
| 370 | int SrsKafkaTopicMetadataResponse::decode(SrsBuffer* buf) | 579 | int SrsKafkaTopicMetadataResponse::decode(SrsBuffer* buf) |
| 371 | { | 580 | { |
| 372 | int ret = ERROR_SUCCESS; | 581 | int ret = ERROR_SUCCESS; |
| 582 | + | ||
| 583 | + if ((ret = SrsKafkaResponse::decode(buf)) != ERROR_SUCCESS) { | ||
| 584 | + srs_error("kafka decode metadata response failed. ret=%d", ret); | ||
| 585 | + return ret; | ||
| 586 | + } | ||
| 587 | + | ||
| 373 | // TODO: FIXME: implements it. | 588 | // TODO: FIXME: implements it. |
| 374 | return ret; | 589 | return ret; |
| 375 | } | 590 | } |
| @@ -387,7 +602,36 @@ int SrsKafkaProtocol::send_and_free_message(SrsKafkaRequest* msg) | @@ -387,7 +602,36 @@ int SrsKafkaProtocol::send_and_free_message(SrsKafkaRequest* msg) | ||
| 387 | { | 602 | { |
| 388 | int ret = ERROR_SUCCESS; | 603 | int ret = ERROR_SUCCESS; |
| 389 | 604 | ||
| 390 | - // TODO: FIXME: implements it. | 605 | + // TODO: FIXME: refine for performance issue. |
| 606 | + SrsAutoFree(SrsKafkaRequest, msg); | ||
| 607 | + | ||
| 608 | + int size = msg->size(); | ||
| 609 | + if (size <= 0) { | ||
| 610 | + return ret; | ||
| 611 | + } | ||
| 612 | + | ||
| 613 | + // TODO: FIXME: refine for performance issue. | ||
| 614 | + char* bytes = new char[size]; | ||
| 615 | + SrsAutoFree(char, bytes); | ||
| 616 | + | ||
| 617 | + // TODO: FIXME: refine for performance issue. | ||
| 618 | + SrsBuffer* buf = new SrsBuffer(); | ||
| 619 | + SrsAutoFree(SrsBuffer, buf); | ||
| 620 | + | ||
| 621 | + if ((ret = buf->initialize(bytes, size)) != ERROR_SUCCESS) { | ||
| 622 | + srs_error("kafka create buffer failed. ret=%d", ret); | ||
| 623 | + return ret; | ||
| 624 | + } | ||
| 625 | + | ||
| 626 | + if ((ret = msg->encode(buf)) != ERROR_SUCCESS) { | ||
| 627 | + srs_error("kafka encode message failed. ret=%d", ret); | ||
| 628 | + return ret; | ||
| 629 | + } | ||
| 630 | + | ||
| 631 | + if ((ret = skt->write(bytes, size, NULL)) != ERROR_SUCCESS) { | ||
| 632 | + srs_error("kafka send message failed. ret=%d", ret); | ||
| 633 | + return ret; | ||
| 634 | + } | ||
| 391 | 635 | ||
| 392 | return ret; | 636 | return ret; |
| 393 | } | 637 | } |
| @@ -33,6 +33,7 @@ | @@ -33,6 +33,7 @@ | ||
| 33 | #include <string> | 33 | #include <string> |
| 34 | 34 | ||
| 35 | #include <srs_kernel_buffer.hpp> | 35 | #include <srs_kernel_buffer.hpp> |
| 36 | +#include <srs_kernel_error.hpp> | ||
| 36 | 37 | ||
| 37 | class ISrsProtocolReaderWriter; | 38 | class ISrsProtocolReaderWriter; |
| 38 | 39 | ||
| @@ -59,10 +60,10 @@ enum SrsKafkaApiKey | @@ -59,10 +60,10 @@ enum SrsKafkaApiKey | ||
| 59 | * A length of -1 indicates null. string uses an int16 for its size, and bytes uses an int32. | 60 | * A length of -1 indicates null. string uses an int16 for its size, and bytes uses an int32. |
| 60 | * @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-ProtocolPrimitiveTypes | 61 | * @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-ProtocolPrimitiveTypes |
| 61 | */ | 62 | */ |
| 62 | -class SrsKafkaString | 63 | +class SrsKafkaString : public ISrsCodec |
| 63 | { | 64 | { |
| 64 | private: | 65 | private: |
| 65 | - int16_t size; | 66 | + int16_t _size; |
| 66 | char* data; | 67 | char* data; |
| 67 | public: | 68 | public: |
| 68 | SrsKafkaString(); | 69 | SrsKafkaString(); |
| @@ -71,7 +72,11 @@ public: | @@ -71,7 +72,11 @@ public: | ||
| 71 | public: | 72 | public: |
| 72 | virtual bool null(); | 73 | virtual bool null(); |
| 73 | virtual bool empty(); | 74 | virtual bool empty(); |
| 74 | - virtual int total_size(); | 75 | +// interface ISrsCodec |
| 76 | +public: | ||
| 77 | + virtual int size(); | ||
| 78 | + virtual int encode(SrsBuffer* buf); | ||
| 79 | + virtual int decode(SrsBuffer* buf); | ||
| 75 | }; | 80 | }; |
| 76 | 81 | ||
| 77 | /** | 82 | /** |
| @@ -79,10 +84,10 @@ public: | @@ -79,10 +84,10 @@ public: | ||
| 79 | * A length of -1 indicates null. string uses an int16 for its size, and bytes uses an int32. | 84 | * A length of -1 indicates null. string uses an int16 for its size, and bytes uses an int32. |
| 80 | * @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-ProtocolPrimitiveTypes | 85 | * @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-ProtocolPrimitiveTypes |
| 81 | */ | 86 | */ |
| 82 | -class SrsKafkaBytes | 87 | +class SrsKafkaBytes : public ISrsCodec |
| 83 | { | 88 | { |
| 84 | private: | 89 | private: |
| 85 | - int32_t size; | 90 | + int32_t _size; |
| 86 | char* data; | 91 | char* data; |
| 87 | public: | 92 | public: |
| 88 | SrsKafkaBytes(); | 93 | SrsKafkaBytes(); |
| @@ -91,7 +96,11 @@ public: | @@ -91,7 +96,11 @@ public: | ||
| 91 | public: | 96 | public: |
| 92 | virtual bool null(); | 97 | virtual bool null(); |
| 93 | virtual bool empty(); | 98 | virtual bool empty(); |
| 94 | - virtual int total_size(); | 99 | +// interface ISrsCodec |
| 100 | +public: | ||
| 101 | + virtual int size(); | ||
| 102 | + virtual int encode(SrsBuffer* buf); | ||
| 103 | + virtual int decode(SrsBuffer* buf); | ||
| 95 | }; | 104 | }; |
| 96 | 105 | ||
| 97 | /** | 106 | /** |
| @@ -107,7 +116,7 @@ public: | @@ -107,7 +116,7 @@ public: | ||
| 107 | * @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-Requests | 116 | * @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-Requests |
| 108 | */ | 117 | */ |
| 109 | template<typename T> | 118 | template<typename T> |
| 110 | -class SrsKafkaArray | 119 | +class SrsKafkaArray : public ISrsCodec |
| 111 | { | 120 | { |
| 112 | private: | 121 | private: |
| 113 | int length; | 122 | int length; |
| @@ -132,6 +141,45 @@ public: | @@ -132,6 +141,45 @@ public: | ||
| 132 | length++; | 141 | length++; |
| 133 | elems.push_back(elem); | 142 | elems.push_back(elem); |
| 134 | } | 143 | } |
| 144 | +// interface ISrsCodec | ||
| 145 | +public: | ||
| 146 | + virtual int size() | ||
| 147 | + { | ||
| 148 | + int s = 0; | ||
| 149 | + | ||
| 150 | + for (SrsIterator it = elems.begin(); it != elems.end(); ++it) { | ||
| 151 | + T elem = *it; | ||
| 152 | + s += elem->size(); | ||
| 153 | + } | ||
| 154 | + | ||
| 155 | + return s; | ||
| 156 | + } | ||
| 157 | + virtual int encode(SrsBuffer* buf) | ||
| 158 | + { | ||
| 159 | + int ret = ERROR_SUCCESS; | ||
| 160 | + | ||
| 161 | + for (SrsIterator it = elems.begin(); it != elems.end(); ++it) { | ||
| 162 | + T elem = *it; | ||
| 163 | + if ((ret = elem->encode(buf)) != ERROR_SUCCESS) { | ||
| 164 | + return ret; | ||
| 165 | + } | ||
| 166 | + } | ||
| 167 | + | ||
| 168 | + return ret; | ||
| 169 | + } | ||
| 170 | + virtual int decode(SrsBuffer* buf) | ||
| 171 | + { | ||
| 172 | + int ret = ERROR_SUCCESS; | ||
| 173 | + | ||
| 174 | + for (SrsIterator it = elems.begin(); it != elems.end(); ++it) { | ||
| 175 | + T elem = *it; | ||
| 176 | + if ((ret = elem->decode(buf)) != ERROR_SUCCESS) { | ||
| 177 | + return ret; | ||
| 178 | + } | ||
| 179 | + } | ||
| 180 | + | ||
| 181 | + return ret; | ||
| 182 | + } | ||
| 135 | }; | 183 | }; |
| 136 | 184 | ||
| 137 | /** | 185 | /** |
-
请 注册 或 登录 后发表评论