On Wed, 2010-06-23 at 20:07 -0700, alanchb wrote: > I download the CMS source code,and modified the TcpSocket::connect function > in TcpSocket.cpp in order to tunnel http proxy.Below is the code I modified > or added: > > void TcpSocket::connect(const char* host, int port, int timeout) throw ( > SocketException ) { > > try{ > > if( isConnected() ) { > throw SocketException( __FILE__, __LINE__, > "Socket::connect - Socket already connected. host: %s, > port: %d", host, port ); > } > > // Create the Address data > checkResult( apr_sockaddr_info_get( > &socketAddress, HTTP_PROXY_IP, APR_INET, HTTP_PROXY_PORT, 0, > apr_pool.getAprPool() ) ); > > > // Create the actual socket. > checkResult( apr_socket_create( > &socketHandle, socketAddress->family, SOCK_STREAM, > APR_PROTO_TCP, apr_pool.getAprPool() ) ); > > // To make blocking-with-timeout sockets, we have to set it to > // 'APR_SO_NONBLOCK==1(on) and timeout>0'. On Unix, we have no > // problem to specify 'APR_SO_NONBLOCK==0(off) and timeout>0'. > // Unfortunately, we have a problem on Windows. Setting the > // mode to 'APR_SO_NONBLOCK==0(off) and timeout>0' causes > // blocking-with-system-timeout sockets on Windows. > // > // > http://dev.ariel-networks.com/apr/apr-tutorial/html/apr-tutorial-13.html > > // If we have a connection timeout specified, temporarily set the > socket to > // non-blocking so that we can timeout the connect operation. We'll > restore > // to blocking mode right after we connect. > apr_socket_opt_set( socketHandle, APR_SO_NONBLOCK, (timeout>0)?1:0 > ); > apr_socket_timeout_set( socketHandle, timeout ); > > // try to Connect to the provided address. > checkResult(apr_socket_connect( socketHandle, socketAddress )); > > // Now that we are connected, we want to go back to blocking. > apr_socket_opt_set( socketHandle, APR_SO_NONBLOCK, 0 ); > apr_socket_timeout_set( socketHandle, -1 ); > > char sHeader[256]; > sprintf(sHeader,"CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n\r\n", > host,port,host,port); > apr_size_t size = strlen(sHeader)+1; > apr_socket_send(socketHandle, sHeader, &size); > > char buf[256]; > size = 256; > apr_socket_recv(socketHandle, buf, &size); > > printf("Connect result:%s",buf); > //the data received:HTTP/1.0 200 Connection > established > > std::string strBuf = strupr(buf); > if (!strBuf.substr(0, 4).compare("http") && strBuf.find("200") > > 0 ) > { > //connect remote server via http proxy > successfully! > } > > // Create an input/output stream for this socket. > inputStream = new SocketInputStream( socketHandle ); > outputStream = new SocketOutputStream( socketHandle ); > > } catch( SocketException& ex ) { > ex.setMark( __FILE__, __LINE__); > try{ close(); } catch( lang::Exception& cx){ /* Absorb */ } > throw ex; > } catch( ... ) { > try{ close(); } catch( lang::Exception& cx){ /* Absorb */ } > throw SocketException( > __FILE__, __LINE__, > "TcpSocket::connect() - caught unknown exception" ); > } > } > > printf("Connect result:%s",buf); shows this: > Connect result:HTTP/1.0 200 Connection established which means TCP socket > connect remote server via http proxy successfully. > > Unfortunately some exception was throwed: > CMSException:OpenWireFormatNegotiator::oneway Wire format negotiation > timeout: peer did not send his wire format. > FILE: > ..\src\main\activemq\wireformat\openwire\OpenWireFormatNegotiator.cpp, LINE: > 71 > FILE: > ..\src\main\activemq\wireformat\openwire\OpenWireFormatNegotiator.cpp, LINE: > 80 > FILE: ..\src\main\activemq\transport\correlator\ResponseCorrelator.cpp, > LINE: 131 > FILE: ..\src\main\activemq\core\ActiveMQConnection.cpp, LINE: 629 > FILE: ..\src\main\activemq\core\ActiveMQConnection.cpp, LINE: 326 > FILE: ..\src\main\activemq\core\ActiveMQConnectionFactory.cpp, LINE: 151 > > It seems like that the data sent via http proxy is not the right format(open > wire format). > > My questions are: > 1. Is it the right way(the code I modified) to link remote MQ server via > HTTP proxy? > 2. If the way is right,how to resolve the data format problem? > > Any help will be appreciated!
Um, no, that won't work. You should take some time to understand the difference between a straight TCP/IP connected client and a request / response based HTTP client. You can see how the AMQ HTTP transport works by downloading the source from SVN. Regards -- Tim Bish Open Source Integration: http://fusesource.com ActiveMQ in Action: http://www.manning.com/snyder/ Follow me on Twitter: http://twitter.com/tabish121 My Blog: http://timbish.blogspot.com/