From: hyc Date: Tue, 29 Dec 2009 22:48:28 +0000 (+0000) Subject: Change chunksize as needed, don't talk to HTTP server if we already have cached hash, X-Git-Tag: v2.4~365 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=923c4fe30fb3e89a06f69f8c38243dddf93f845a;p=rtmpdump Change chunksize as needed, don't talk to HTTP server if we already have cached hash, other packet processing fixes git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@134 400ebc74-4327-4243-bc38-086b20814532 --- diff --git a/rtmpsuck.c b/rtmpsuck.c index f9dd187..52cd59f 100644 --- a/rtmpsuck.c +++ b/rtmpsuck.c @@ -47,7 +47,7 @@ #ifdef CRYPTO #define HASHLEN 32 -extern int SWFVerify(const char *url, unsigned int *size, unsigned char *hash); +extern int SWFVerify(const char *url, unsigned int *size, unsigned char *hash, int ask); #endif #define RTMPDUMP_PROXY_VERSION "v2.0" @@ -261,7 +261,7 @@ ServeInvoke(STREAMING_SERVER *server, RTMPPacket *pack, const char *body) { unsigned char hash[HASHLEN]; server->rc.Link.swfUrl = pval; - if (SWFVerify(pval.av_val, &server->rc.Link.SWFSize, hash) == 0) + if (SWFVerify(pval.av_val, &server->rc.Link.SWFSize, hash, 0) == 0) { server->rc.Link.SWFHash.av_val = malloc(HASHLEN); memcpy(server->rc.Link.SWFHash.av_val, hash, HASHLEN); @@ -692,7 +692,7 @@ void doServe(STREAMING_SERVER * server, // server socket and state (our listenin unsigned int buflen = 131072; // timeout for http requests - fd_set rfds, wfds; + fd_set rfds; struct timeval tv; server->state = STREAMING_IN_PROGRESS; @@ -743,8 +743,6 @@ void doServe(STREAMING_SERVER * server, // server socket and state (our listenin if (cr || sr) { - FD_SET(server->rc.m_socket, &wfds); - FD_SET(server->rs.m_socket, &wfds); } else { @@ -752,21 +750,15 @@ void doServe(STREAMING_SERVER * server, // server socket and state (our listenin if (server->rc.m_socket > n) n = server->rc.m_socket; FD_ZERO(&rfds); - FD_ZERO(&wfds); if (RTMP_IsConnected(&server->rs)) FD_SET(sockfd, &rfds); if (RTMP_IsConnected(&server->rc)) FD_SET(server->rc.m_socket, &rfds); - if (server->rs_pkt[0]) - FD_SET(server->rc.m_socket, &wfds); - if (server->rc_pkt[0]) - FD_SET(server->rs.m_socket, &wfds); - - tv.tv_sec = 5; + tv.tv_sec = 30; tv.tv_usec = 0; - if (select(n + 1, &rfds, &wfds, NULL, &tv) <= 0) + if (select(n + 1, &rfds, NULL, NULL, &tv) <= 0) { Log(LOGERROR, "Request timeout/select failed, ignoring request"); goto cleanup; @@ -781,7 +773,21 @@ void doServe(STREAMING_SERVER * server, // server socket and state (our listenin while (RTMP_ReadPacket(&server->rs, &ps)) if (RTMPPacket_IsReady(&ps)) { - QueuePkt(server->rs_pkt, &ps); + /* change chunk size */ + if (ps.m_packetType == 0x01) + { + if (ps.m_nBodySize >= 4) + { + server->rs.m_inChunkSize = AMF_DecodeInt32(ps.m_body); + Log(LOGDEBUG, "%s, client: chunk size change to %d", __FUNCTION__, + server->rs.m_inChunkSize); + server->rc.m_outChunkSize = server->rs.m_inChunkSize; + } + } + else if (!server->out && (ps.m_packetType == 0x11 || ps.m_packetType == 0x14)) + ServePacket(server, &ps); + RTMP_SendPacket(&server->rc, &ps, false); + RTMPPacket_Free(&ps); break; } } @@ -790,62 +796,69 @@ void doServe(STREAMING_SERVER * server, // server socket and state (our listenin while (RTMP_ReadPacket(&server->rc, &pc)) if (RTMPPacket_IsReady(&pc)) { - QueuePkt(server->rc_pkt, &pc); + int sendit = 1; + /* change chunk size */ + if (pc.m_packetType == 0x01) + { + if (pc.m_nBodySize >= 4) + { + server->rc.m_inChunkSize = AMF_DecodeInt32(pc.m_body); + Log(LOGDEBUG, "%s, server: chunk size change to %d", __FUNCTION__, + server->rc.m_inChunkSize); + server->rs.m_outChunkSize = server->rc.m_inChunkSize; + } + } + else if (pc.m_packetType == 0x04) + { + short nType = AMF_DecodeInt16(pc.m_body); + /* SWFverification */ + if (nType == 0x1a && server->rc.Link.SWFHash.av_len) + { + RTMP_SendCtrl(&server->rc, 0x1b, 0, 0); + sendit = 0; + } + } + else if (server->out && ( + pc.m_packetType == 0x08 || + pc.m_packetType == 0x09 || + pc.m_packetType == 0x12 || + pc.m_packetType == 0x16)) + { + int len = WriteStream(&buf, &buflen, &server->stamp, &pc); + if (len > 0 && fwrite(buf, 1, len, server->out) != len) + goto cleanup; + } + if (sendit && RTMP_IsConnected(&server->rs)) + RTMP_SendPacket(&server->rs, &pc, false); + RTMPPacket_Free(&pc); break; } } - if (server->rs_pkt[0] && FD_ISSET(server->rc.m_socket, &wfds)) - { - DequeuePkt(server->rs_pkt, &ps); - if (!server->out && (ps.m_packetType == 0x11 || ps.m_packetType == 0x14)) - ServePacket(server, &ps); - RTMP_SendPacket(&server->rc, &ps, false); - RTMPPacket_Free(&ps); - } - if (server->rc_pkt[0] && FD_ISSET(server->rs.m_socket, &wfds)) - { - int sendit = 1; - DequeuePkt(server->rc_pkt, &pc); - if (pc.m_packetType == 0x04) - { - short nType = AMF_DecodeInt16(pc.m_body); - /* SWFverification */ - if (nType == 0x1a && server->rc.Link.SWFHash.av_len) - { - RTMP_SendCtrl(&server->rc, 0x1b, 0, 0); - sendit = 0; - } - } - else if (server->out && ( - pc.m_packetType == 0x08 || - pc.m_packetType == 0x09 || - pc.m_packetType == 0x12 || - pc.m_packetType == 0x16)) - { - int len = WriteStream(&buf, &buflen, &server->stamp, &pc); - if (len > 0 && fwrite(buf, 1, len, server->out) != len) - goto cleanup; - pc.m_headerType = 1; - } - if (sendit && RTMP_IsConnected(&server->rs)) - RTMP_SendPacket(&server->rs, &pc, false); - RTMPPacket_Free(&pc); - } } cleanup: LogPrintf("Closing connection... "); RTMP_Close(&server->rs); if (server->out) - fclose(server->out); + { + fclose(server->out); + server->out = NULL; + } /* Should probably be done by RTMP_Close() ... */ free((void *)server->rc.Link.hostname); + server->rc.Link.hostname = NULL; free(server->rc.Link.tcUrl.av_val); + server->rc.Link.tcUrl.av_val = NULL; free(server->rc.Link.swfUrl.av_val); + server->rc.Link.swfUrl.av_val = NULL; free(server->rc.Link.pageUrl.av_val); + server->rc.Link.pageUrl.av_val = NULL; free(server->rc.Link.app.av_val); + server->rc.Link.app.av_val = NULL; free(server->rc.Link.auth.av_val); + server->rc.Link.auth.av_val = NULL; free(server->rc.Link.flashVer.av_val); + server->rc.Link.flashVer.av_val = NULL; LogPrintf("done!\n\n"); quit: