1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

kafka refine array, to decode and create object.

This commit is contained in:
winlin 2015-10-19 13:55:53 +08:00
parent c4862878d1
commit 493d282255
3 changed files with 81 additions and 13 deletions

View file

@ -272,6 +272,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define ERROR_KAFKA_CODEC_BYTES 4031 #define ERROR_KAFKA_CODEC_BYTES 4031
#define ERROR_KAFKA_CODEC_REQUEST 4032 #define ERROR_KAFKA_CODEC_REQUEST 4032
#define ERROR_KAFKA_CODEC_RESPONSE 4033 #define ERROR_KAFKA_CODEC_RESPONSE 4033
#define ERROR_KAFKA_CODEC_ARRAY 4034
/////////////////////////////////////////////////////// ///////////////////////////////////////////////////////
// HTTP API error. // HTTP API error.

View file

@ -30,6 +30,7 @@ using namespace std;
#include <srs_core_autofree.hpp> #include <srs_core_autofree.hpp>
#include <srs_kernel_log.hpp> #include <srs_kernel_log.hpp>
#include <srs_protocol_io.hpp> #include <srs_protocol_io.hpp>
#include <srs_protocol_stream.hpp>
#ifdef SRS_AUTO_KAFKA #ifdef SRS_AUTO_KAFKA
@ -682,10 +683,12 @@ SrsKafkaApiKey SrsKafkaCorrelationPool::get(int32_t correlation_id)
SrsKafkaProtocol::SrsKafkaProtocol(ISrsProtocolReaderWriter* io) SrsKafkaProtocol::SrsKafkaProtocol(ISrsProtocolReaderWriter* io)
{ {
skt = io; skt = io;
reader = new SrsFastStream();
} }
SrsKafkaProtocol::~SrsKafkaProtocol() SrsKafkaProtocol::~SrsKafkaProtocol()
{ {
srs_freep(reader);
} }
int SrsKafkaProtocol::send_and_free_message(SrsKafkaRequest* msg) int SrsKafkaProtocol::send_and_free_message(SrsKafkaRequest* msg)
@ -733,6 +736,36 @@ int SrsKafkaProtocol::send_and_free_message(SrsKafkaRequest* msg)
return ret; return ret;
} }
int SrsKafkaProtocol::recv_message(SrsKafkaResponse** pmsg)
{
*pmsg = NULL;
int ret = ERROR_SUCCESS;
SrsKafkaResponseHeader header;
while (reader->size() < header.size()) {
if ((ret = reader->grow(skt, header.size())) != ERROR_SUCCESS) {
srs_error("kafka recv message failed. ret=%d", ret);
return ret;
}
}
SrsBuffer buffer;
if ((ret = buffer.initialize(reader->bytes(), reader->size())) != ERROR_SUCCESS) {
return ret;
}
SrsBuffer* buf = &buffer;
if ((ret = header.decode(buf)) != ERROR_SUCCESS) {
srs_error("kafka decode response header failed. ret=%d", ret);
return ret;
}
// TODO: FIXME: decode message.
return ret;
}
SrsKafkaClient::SrsKafkaClient(ISrsProtocolReaderWriter* io) SrsKafkaClient::SrsKafkaClient(ISrsProtocolReaderWriter* io)
{ {
protocol = new SrsKafkaProtocol(io); protocol = new SrsKafkaProtocol(io);
@ -756,6 +789,13 @@ int SrsKafkaClient::fetch_metadata(string topic)
return ret; return ret;
} }
SrsKafkaResponse* res = NULL;
if ((ret = protocol->recv_message(&res)) != ERROR_SUCCESS) {
srs_error("kafka recv response failed. ret=%d", ret);
return ret;
}
SrsAutoFree(SrsKafkaResponse, res);
// TODO: FIXME: implements it. // TODO: FIXME: implements it.
return ret; return ret;

View file

@ -35,7 +35,9 @@
#include <srs_kernel_buffer.hpp> #include <srs_kernel_buffer.hpp>
#include <srs_kernel_error.hpp> #include <srs_kernel_error.hpp>
#include <srs_kernel_log.hpp>
class SrsFastStream;
class ISrsProtocolReaderWriter; class ISrsProtocolReaderWriter;
#ifdef SRS_AUTO_KAFKA #ifdef SRS_AUTO_KAFKA
@ -113,9 +115,9 @@ public:
* array of a structure foo as [foo]. * array of a structure foo as [foo].
* *
* Usage: * Usage:
* SrsKafkaArray<SrsKafkaBytes*> body; * SrsKafkaArray<SrsKafkaBytes> body;
* body.append(new SrsKafkaBytes()); * body.append(new SrsKafkaBytes());
* @remark the typename T must be a ISrsCodec* * @remark array elem is the T*, which must be ISrsCodec*
* *
* @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-Requests * @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-Requests
*/ */
@ -123,9 +125,9 @@ template<typename T>
class SrsKafkaArray : public ISrsCodec class SrsKafkaArray : public ISrsCodec
{ {
private: private:
int length; int32_t length;
std::vector<T> elems; std::vector<T*> elems;
typedef typename std::vector<T>::iterator SrsIterator; typedef typename std::vector<T*>::iterator SrsIterator;
public: public:
SrsKafkaArray() SrsKafkaArray()
{ {
@ -134,13 +136,13 @@ public:
virtual ~SrsKafkaArray() virtual ~SrsKafkaArray()
{ {
for (SrsIterator it = elems.begin(); it != elems.end(); ++it) { for (SrsIterator it = elems.begin(); it != elems.end(); ++it) {
T elem = *it; T* elem = *it;
srs_freep(elem); srs_freep(elem);
} }
elems.clear(); elems.clear();
} }
public: public:
virtual void append(T elem) virtual void append(T* elem)
{ {
length++; length++;
elems.push_back(elem); elems.push_back(elem);
@ -149,10 +151,10 @@ public:
public: public:
virtual int size() virtual int size()
{ {
int s = 0; int s = 4;
for (SrsIterator it = elems.begin(); it != elems.end(); ++it) { for (SrsIterator it = elems.begin(); it != elems.end(); ++it) {
T elem = *it; T* elem = *it;
s += elem->size(); s += elem->size();
} }
@ -162,9 +164,17 @@ public:
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
if (!buf->require(4)) {
ret = ERROR_KAFKA_CODEC_ARRAY;
srs_error("kafka encode array failed. ret=%d", ret);
return ret;
}
buf->write_4bytes(length);
for (SrsIterator it = elems.begin(); it != elems.end(); ++it) { for (SrsIterator it = elems.begin(); it != elems.end(); ++it) {
T elem = *it; T* elem = *it;
if ((ret = elem->encode(buf)) != ERROR_SUCCESS) { if ((ret = elem->encode(buf)) != ERROR_SUCCESS) {
srs_error("kafka encode array elem failed. ret=%d", ret);
return ret; return ret;
} }
} }
@ -175,11 +185,22 @@ public:
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
for (SrsIterator it = elems.begin(); it != elems.end(); ++it) { if (!buf->require(4)) {
T elem = *it; ret = ERROR_KAFKA_CODEC_ARRAY;
srs_error("kafka decode array failed. ret=%d", ret);
return ret;
}
length = buf->read_2bytes();
for (int i = 0; i < length; i++) {
T* elem = new T();
if ((ret = elem->decode(buf)) != ERROR_SUCCESS) { if ((ret = elem->decode(buf)) != ERROR_SUCCESS) {
srs_error("kafka decode array elem failed. ret=%d", ret);
srs_freep(elem);
return ret; return ret;
} }
elems.push_back(elem);
} }
return ret; return ret;
@ -493,7 +514,7 @@ public:
class SrsKafkaTopicMetadataRequest : public SrsKafkaRequest class SrsKafkaTopicMetadataRequest : public SrsKafkaRequest
{ {
private: private:
SrsKafkaArray<SrsKafkaString*> topics; SrsKafkaArray<SrsKafkaString> topics;
public: public:
SrsKafkaTopicMetadataRequest(); SrsKafkaTopicMetadataRequest();
virtual ~SrsKafkaTopicMetadataRequest(); virtual ~SrsKafkaTopicMetadataRequest();
@ -559,6 +580,7 @@ class SrsKafkaProtocol
{ {
private: private:
ISrsProtocolReaderWriter* skt; ISrsProtocolReaderWriter* skt;
SrsFastStream* reader;
public: public:
SrsKafkaProtocol(ISrsProtocolReaderWriter* io); SrsKafkaProtocol(ISrsProtocolReaderWriter* io);
virtual ~SrsKafkaProtocol(); virtual ~SrsKafkaProtocol();
@ -568,6 +590,11 @@ public:
* @param msg the msg to send. user must not free it again. * @param msg the msg to send. user must not free it again.
*/ */
virtual int send_and_free_message(SrsKafkaRequest* msg); virtual int send_and_free_message(SrsKafkaRequest* msg);
/**
* read the message from kafka server.
* @param pmsg output the received message. user must free it.
*/
virtual int recv_message(SrsKafkaResponse** pmsg);
}; };
/** /**