Beispiel #1
0
int NetworkFunctions::translateReceivedEvents(Packet * serverEvents)
{
	while (serverEvents->getReceiveBufferSize() > 0) {
		DataBuffer * tempBuffer = new DataBuffer(MAX_PACKET_SIZE);

		int charCount = 0;
		int functionIndex = -1;
		int bufferLength = -1;
		for (int i = 0; i < serverEvents->getReceiveBufferSize(); i++) {
			tempBuffer->copy(tempBuffer->getSize(), serverEvents->getReceiveBuffer() + i, 1);

			if (charCount == 3) {
				memcpy(&functionIndex, tempBuffer->getData(), 4);
				if (functionIndex < 0 || functionIndex >= FUNCTION_COUNT || functionIndex == 10) {
					while ((serverEvents->getReceiveBuffer()[i]) != '\n') i++;
					tempBuffer->clear();
					continue;
				}
				else {
					bufferLength = bufferSizes[functionIndex];
				}
			}

			if (charCount == 7 && functionIndex == EVENT_UPDATE_GAME_OBJECT) {
				unsigned long netID = 0;
				memcpy(&netID, tempBuffer->getData() + 4, 4);
				GameObject * tempObject = gameObjects->getValue(netID);
				if (tempObject == NULL) {
					while ((serverEvents->getReceiveBuffer()[i]) != '\n') i++;
					tempBuffer->clear();
					continue;
				}
				/*int objectIndex = -1;
				memcpy(&objectIndex, tempBuffer->getData() + 4, 4);
				if (objectIndex < 0 || objectIndex >= gameObjects->size()) {
					while ((serverEvents->getReceiveBuffer()[i]) != '\n') i++;
					tempBuffer->clear();
					continue;
				}*/
				else {
					bufferLength = tempObject->getSerializedSize();
				}
			}

			if (charCount == bufferLength-1) {
				if (tempBuffer->getSize() == 0) {
					tempBuffer->clear();
					continue;
				}

				executeIndexedFunction(tempBuffer);
				tempBuffer->clear();
				charCount = 0;
				continue;
			}

			/*if (serverEvents->getReceiveBuffer()[i] == '\n') {
				if (tempBuffer->getSize() == 0) {
					tempBuffer->clear();
					continue;
				}

				executeIndexedFunction(tempBuffer);

				tempBuffer->clear();
			}*/
			charCount++;
		}
		delete tempBuffer;
		serverEvents->refillReceiveBuffer();
	}
	return 0;
}
void HttpRequestAndResponsePacketTF::testDecodeAndEncode() {
    HttpRequestPacket *request = new HttpRequestPacket;
    HttpResponsePacket *response;
    DataBuffer output;
    DataBuffer input;
    PacketHeader header;

    // http_load -r 1 -f 2 url
    char s1[] = "GET /  HTTP/1.0\r\n"
                "Host: localhost\r\n"
                "User-Agent: http_load 12mar2006\r\n\r\n";
    header._dataLen = sizeof(s1)-1;
    input.writeBytes(s1, sizeof(s1) - 1);
    CPPUNIT_ASSERT(request->decode(&input, &header));
    CPPUNIT_ASSERT_EQUAL(1, request->_method);
    CPPUNIT_ASSERT_EQUAL(1, request->_version);
    CPPUNIT_ASSERT_EQUAL(false, request->isKeepAlive());
    CPPUNIT_ASSERT(strcmp("localhost", request->findHeader("Host")) == 0);
    CPPUNIT_ASSERT(request->findHeader("User-Agent"));
    CPPUNIT_ASSERT(strcmp("http_load 12mar2006", request->findHeader("User-Agent")) == 0);

    response = doReply(request);
    response->encode(&output);
    char r1[] = "HTTP/1.1 200 OK\r\n"
                "Connection: close\r\n"
                "Content-Type: text/html\r\n"
                "Content-Length: 1\r\n\r\n/";
    CPPUNIT_ASSERT(strncmp(r1, output.getData(), sizeof(r1) - 1) == 0);
    output.clear();
    delete response;
    request->free();

    request = new HttpRequestPacket;
    //fbench -q url -c 0  -n 15 -k -s 10 localhost 12345
    request->_isKeepAlive = true;
    char s2[] = "GET http://localhost:12345?name=huang&jj=yy HTTP/1.1\r\n"
                "Host: localhost\r\n"
                "User-Agent: fbench/0.9\r\n\r\n";
    header._dataLen = sizeof(s2)-1;
    input.writeBytes(s2, sizeof(s2) - 1);
    CPPUNIT_ASSERT(request->decode(&input, &header));
    CPPUNIT_ASSERT_EQUAL(1, request->_method);
    CPPUNIT_ASSERT_EQUAL(2, request->_version);
    CPPUNIT_ASSERT_EQUAL(true, request->isKeepAlive());
    CPPUNIT_ASSERT(strcmp("localhost", request->findHeader("Host")) == 0);
    CPPUNIT_ASSERT(strcmp("fbench/0.9", request->findHeader("User-Agent")) == 0);
    CPPUNIT_ASSERT(strcmp(request->getQuery(), "http://localhost:12345?name=huang&jj=yy") == 0);

    response = doReply(request);
    response->encode(&output);
    char r2[] = "HTTP/1.1 200 OK\r\n"
                "Connection: Keep-Alive\r\n"
                "Keep-Alive: timeout=10, max=10\r\n"
                "Content-Type: text/html\r\n"
                "Content-Length: 39\r\n\r\n"
                "http://localhost:12345?name=huang&jj=yy";
    CPPUNIT_ASSERT(strncmp(r2, output.getData(), sizeof(r2) - 1) == 0);
    output.clear();
    delete response;
    request->free();

    request = new HttpRequestPacket;
    //fbench -q url -c 0  -n 15 -s 10 localhost 12345
    char s3[] = "GET http://localhost:12345?name=huang&jj=yy HTTP/1.1\r\n"
                "Host: localhost\r\n"
                "Connection: close\r\n"
                "User-Agent: fbench/0.9\r\n\r\n";
    header._dataLen = sizeof(s3)-1;
    input.writeBytes(s3, sizeof(s3) - 1);
    CPPUNIT_ASSERT(request->decode(&input, &header));
    CPPUNIT_ASSERT_EQUAL(1, request->_method);
    CPPUNIT_ASSERT_EQUAL(2, request->_version);
    CPPUNIT_ASSERT_EQUAL(false, request->isKeepAlive());
    CPPUNIT_ASSERT(strcmp("localhost", request->findHeader("Host")) == 0);
    CPPUNIT_ASSERT(strcmp("fbench/0.9", request->findHeader("User-Agent")) == 0);
    CPPUNIT_ASSERT(strcmp(request->getQuery(), "http://localhost:12345?name=huang&jj=yy") == 0);

    response = doReply(request);
    response->encode(&output);
    char r3[] = "HTTP/1.1 200 OK\r\n"
                "Connection: close\r\n"
                "Content-Type: text/html\r\n"
                "Content-Length: 39\r\n\r\n"
                "http://localhost:12345?name=huang&jj=yytp://localhost:12345?name=huang&jj=yy";
    CPPUNIT_ASSERT(strncmp(r3, output.getData(), sizeof(r3) - 1) == 0);
    output.clear();
    delete response;
    request->free();

    request = new HttpRequestPacket;
    //firefox
    request->_isKeepAlive = true;
    char s4[] ="GET /?name=huang&jj=yy HTTP/1.0\r\n"
               "Host: localhost:12345\r\n"
               "User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9b5) Gecko/2008042803 Red Hat/3.0b5-0.beta5.6.el5 Firefox/3.0b5\r\n"
               "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
               "Accept-Language: en-us,en;q=0.5\r\n"
               "Accept-Encoding: gzip,deflate\r\n"
               "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
               "Keep-Alive: 300\r\n"
               "Connection: keep-alive\r\n\r\n";
    header._dataLen = sizeof(s4)-1;
    input.writeBytes(s4, sizeof(s4) - 1);
    CPPUNIT_ASSERT(request->decode(&input, &header));
    CPPUNIT_ASSERT_EQUAL(1, request->_method);
    CPPUNIT_ASSERT_EQUAL(1, request->_version);
    CPPUNIT_ASSERT_EQUAL(true, request->isKeepAlive());
    CPPUNIT_ASSERT(strcmp("localhost:12345", request->findHeader("Host")) == 0);
    CPPUNIT_ASSERT(strcmp("Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9b5) Gecko/2008042803 Red Hat/3.0b5-0.beta5.6.el5 Firefox/3.0b5",
                          request->findHeader("User-Agent")) == 0);
    CPPUNIT_ASSERT(strcmp(request->getQuery(), "/?name=huang&jj=yy") == 0);

    response = doReply(request);
    response->encode(&output);
    char r4[] = "HTTP/1.1 200 OK\r\n"
                "Connection: Keep-Alive\r\n"
                "Keep-Alive: timeout=10, max=10\r\n"
                "Content-Type: text/html\r\n"
                "Content-Length: 18\r\n\r\n"
                "/?name=huang&jj=yy2345?name=huang&jj=yy";
    CPPUNIT_ASSERT(strncmp(r4, output.getData(), sizeof(r4) - 1) == 0);
    output.clear();
    delete response;
    request->free();

    request = new HttpRequestPacket;
    // http_load -r 1 -f 2 url keep-alive:true 
    request->_isKeepAlive = true;
    char s5[] = "GET / HTTP/1.0\r\n"
                "Host: localhost\r\n"
                "Connection: keep-alive\r\n"
                "User-Agent: http_load 12mar2006\r\n\r\n";
    header._dataLen = sizeof(s5)-1;
    input.writeBytes(s5, sizeof(s5) - 1);
    CPPUNIT_ASSERT(request->decode(&input, &header));
    CPPUNIT_ASSERT_EQUAL(1, request->_method);
    CPPUNIT_ASSERT_EQUAL(1, request->_version);
    CPPUNIT_ASSERT_EQUAL(true, request->isKeepAlive());
    CPPUNIT_ASSERT(strcmp("localhost", request->findHeader("Host")) == 0);
    CPPUNIT_ASSERT(request->findHeader("User-Agent"));
    CPPUNIT_ASSERT(strcmp("http_load 12mar2006", request->findHeader("User-Agent")) == 0);

    response = doReply(request);
    response->encode(&output);
    cout<<output.getData();
    char r5[] = "HTTP/1.1 200 OK\r\n"
                "Connection: Keep-Alive\r\n"
                "Keep-Alive: timeout=10, max=10\r\n"
                "Content-Type: text/html\r\n"
                "Content-Length: 1\r\n\r\n"
                "//?name=huang&jj=yy2345?name=huang&jj=yy";
    CPPUNIT_ASSERT(strncmp(r5, output.getData(), sizeof(r5) - 1) == 0);
    output.clear();
    delete response;
    request->free();

    request = new HttpRequestPacket;
    //wrong query 
    request->_isKeepAlive = true;
    char s6[] = "GET  HTTP/1.0\r\n"
                "Host: localhost\r\n"
                "Connection: keep-alive\r\n";
    header._dataLen = sizeof(s6)-1;
    input.writeBytes(s6, sizeof(s6) - 1);
    CPPUNIT_ASSERT(!request->decode(&input, &header));
    request->free();
}   
Beispiel #3
0
  void TCPCONNECTIONTF::testReadData() {
    ANET_LOG(DEBUG, "BEGIN testReadData()");
    Socket *client = new Socket;
    client->setAddress("localhost", 12345);
    client->connect();
    Socket *accept = _server->accept();
    CPPUNIT_ASSERT(accept);

    //    ConnPacketFactory *factory = new ConnPacketFactory;
    //    DefaultPacketStreamer *streamer = new DefaultPacketStreamer(factory);
    
    //tricket 47
    TCPConnection *tmpConn = new TCPConnection(accept, _streamer, NULL);
    DataBuffer buffer;
    buffer.writeInt32(ANET_PACKET_FLAG + 1);
    buffer.writeInt32(111);
    buffer.writeInt32(222);
    const char *data = "just for test";
    buffer.writeInt32(strlen(data) - 1);
    buffer.writeBytes(data, strlen(data));
    ANET_LOG(DEBUG, "buffer(%p) length:(%d)",&buffer, buffer.getDataLen());
    client->write(buffer.getData(), buffer.getDataLen());
    CPPUNIT_ASSERT(!tmpConn->readData());

    buffer.clear();
    buffer.writeInt32(ANET_PACKET_FLAG);
    buffer.writeInt32(111);
    buffer.writeInt32(222);
    buffer.writeInt32(-1);
    buffer.writeBytes(data, strlen(data));
    client->write(buffer.getData(), buffer.getDataLen());
    CPPUNIT_ASSERT(!tmpConn->readData());

    buffer.clear();
    buffer.writeInt32(ANET_PACKET_FLAG);
    buffer.writeInt32(111);
    buffer.writeInt32(222);
    buffer.writeInt32(strlen(data)/2);
    buffer.writeBytes(data, strlen(data));
    client->write(buffer.getData(), buffer.getDataLen());
    CPPUNIT_ASSERT(!tmpConn->readData());
    delete tmpConn;
    delete accept;
    client->close();
    delete client;

    //    TCPConnection *conn = new TCPConnection(_client, NULL, NULL);
    
    _conn->setServer(false);
    _conn->postPacket(new ConnPacket(11), _handler, NULL);
    _conn->postPacket(new ConnPacket(21), _handler, NULL);
    _conn->postPacket(new ConnPacket(31), _handler, NULL);
    _conn->writeData();

    // flag(0x416e457) chid pcode datalen 
    //DataBuffer *input = &_conn->_input;
    TCPServerAdapter *adapter = new TCPServerAdapter;
    TCPConnection *connAcc = 
      new TCPConnection(_accept, _streamer, adapter);
    connAcc->setServer(true);
    connAcc->_streamer = _streamer;
    connAcc->_iocomponent = 
      new TCPComponent(_transport, _accept);
    //connAcc->_streamer, NULL);
    CPPUNIT_ASSERT(connAcc->readData());
    CPPUNIT_ASSERT_EQUAL(3, adapter->handNum);

    //test error packet
    adapter->reset(); //set the hand packet num to zero
    _conn->postPacket(new ConnPacket(20, 11), _handler, NULL);
    _conn->postPacket(new ConnPacket(20, 30), _handler, NULL);
    CPPUNIT_ASSERT(_conn->writeData());
    CPPUNIT_ASSERT(connAcc->readData());
    CPPUNIT_ASSERT_EQUAL(2, adapter->handNum);

    ANET_LOG(SPAM, "connAcc(%p), ioc (%p)", connAcc, connAcc->_iocomponent);
    delete connAcc->_iocomponent;
    delete connAcc;
    _accept = NULL;
    delete adapter;
    ANET_LOG(DEBUG,"END testReadData()");
  }