thrift-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Richard Boolman (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (THRIFT-4466) TEvhttpServer don't work with javascript
Date Mon, 22 Jan 2018 12:45:00 GMT

     [ https://issues.apache.org/jira/browse/THRIFT-4466?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Richard Boolman updated THRIFT-4466:
------------------------------------
    Description: 
TEvhttpServer don't work with javascript client.

With c++ client or php client or other client, will work.

Example:

test1.thrift
{code:java}
namespace cpp test1

service test1 {
i32 add_val( 1 : i32 a, 2 : i32 b );
}
{code}
 
{code:java}
thrift -r --gen cpp:cob_style test1.thrift
thrift -r --gen php test1.thrift
thrift -r --gen js test1.thrift{code}
 

evhtp_thrift_server.cpp:
{code:java}
#include "../gen-cpp/test1.h"

#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/protocol/TJSONProtocol.h>
#include <thrift/async/TAsyncProtocolProcessor.h>
#include <thrift/async/TEvhttpServer.h>
#include <thrift/server/TThreadedServer.h>
#include <thrift/transport/THttpServer.h>
#include <thrift/transport/TServerSocket.h>

using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;
using namespace ::apache::thrift::async;

using boost::shared_ptr;

using namespace  ::test1;

class test1Handler : virtual public test1If {
public:
    int32_t add_val(const int32_t a, const int32_t b) {
        return a + b;
    }
};

class test1AsyncHandler : public test1CobSvIf {
public:
    test1AsyncHandler() {
        syncHandler_ = std::auto_ptr<test1Handler>( new test1Handler );
    }

    void add_val(stdcxx::function <void(int32_t const& _ret)>cob, const int32_t
a, const int32_t b ) {
        int32_t _ret = 0;

        _ret = syncHandler_->add_val(a, b);

        return cob(_ret);
    }

protected:
    std::auto_ptr<test1Handler> syncHandler_;
};

int main(int argc, char ** argv) {

    shared_ptr<test1AsyncHandler>     handler(new test1AsyncHandler());
    shared_ptr<TAsyncProcessor>       proc(new test1AsyncProcessor(handler));
    shared_ptr<TProtocolFactory>      pfact(new TJSONProtocolFactory());
    shared_ptr<TAsyncBufferProcessor> bufproc(new TAsyncProtocolProcessor(proc, pfact));
    shared_ptr<TEvhttpServer>         server(new TEvhttpServer(bufproc, 9090));

/*        IF USE TThreadedServer WILL ALL WORK

    shared_ptr<test1Handler>        test1( new test1Handler() );
    shared_ptr<TProcessor>          processor( new test1Processor(test1) );
    shared_ptr<TTransportFactory>   transportFactory( new THttpServerTransportFactory()
);
    shared_ptr<TProtocolFactory>    protocolFactory( new TJSONProtocolFactory() );
    shared_ptr<TServerTransport>    serverTransport( new TServerSocket( 9090 ) );

    shared_ptr<TThreadedServer>     server( new TThreadedServer( processor, serverTransport,
transportFactory, protocolFactory ) );
*/

    server->serve();

    return 0;
}
{code}
 

test1_client.cpp: (WORK)
{code:java}
#include <../gen-cpp/test1.h>

#include <iostream>

#include <thrift/transport/THttpClient.h>
#include <thrift/transport/TSocket.h>
#include <thrift/transport/TBufferTransports.h>
#include <thrift/protocol/TJSONProtocol.h>

using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;

int main(int argc, char ** argv) {

    boost::shared_ptr<TTransport> transport(new THttpClient("127.0.0.1", 9090, "/"));
    boost::shared_ptr<TProtocol>  protocol(new TJSONProtocol(transport));

    test1::test1Client client(protocol);
    transport->open();

    std::cout << client.add_val( 5, 10 ) << std::endl;

    transport->close();

    return 0;
}
{code}
 

test1_client.php (WORK)
{code:java}
<?
error_reporting( E_ALL );

$GLOBALS['THRIFT_ROOT'] = '/usr/lib/php';

require_once $GLOBALS['THRIFT_ROOT'].'/Thrift/ClassLoader/ThriftClassLoader.php';

use Thrift\ClassLoader\ThriftClassLoader;

$loader = new ThriftClassLoader();
$loader->registerNamespace( 'Thrift', $GLOBALS['THRIFT_ROOT'] );
$loader->register();

use Thrift\Protocol\TJSONProtocol;
use Thrift\Transport\TSocket;
use Thrift\Transport\THttpClient;
use Thrift\Transport\TBufferedTransport;
use Thrift\Transport\TFramedTransport;
use Thrift\Exception\TException;

$GEN_DIR = 'gen-php';
require_once $GEN_DIR.'/test1.php';
require_once $GEN_DIR.'/Types.php';

try {
$socket = new THttpClient( '127.0.0.1', 9090 );
$transport = new TBufferedTransport( $socket, 1024, 1024 );
$protocol = new TJSONProtocol( $transport );
$client = new test1Client( $protocol );

$transport->open();

echo $client->add_val( 5, 10 );

$transport->close();

} catch ( TException $tx ) {
print 'TException: '.$tx->getMessage()."\n";
}
?>
{code}
 

test1_client.html (DON'T WORK)
{code:java}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Test Thrift</title>
</head>
<body>
<input type="button" id="get_msg" value="Get Message" >
<div id="output"></div>

<script src="thrift.js"></script>
<script src="gen-js/test1.js"></script>
<script src="gen-js/test1_types.js"></script>

<script>
(function() {
var transport = new Thrift.TXHRTransport( "http://127.0.0.1:9090" );
var protocol = new Thrift.TJSONProtocol( transport );
var client = new test1Client( protocol );

var outputElement = document.getElementById("output");
document.getElementById("get_msg").addEventListener("click", function(){

outputElement.innerHTML = client.add_val( 5, 10 );
});
})();
</script>
</body>
</html>
{code}
 
 *Help please.*

 

  was:
TEvhttpServer don't work with javascript client.

With c++ client or php client or other client, will work.

Example:

test1.thrift
{code:java}
namespace cpp test1

service test1 {
i32 add_val( 1 : i32 a, 2 : i32 b );
}
{code}
 
{code:java}
thrift -r --gen cpp:cob_style test1.thrift
thrift -r --gen php test1.thrift
thrift -r --gen js test1.thrift{code}
 

evhtp_thrift_server.cpp:
{code:java}
#include "../gen-cpp/test1.h"

#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/protocol/TJSONProtocol.h>
#include <thrift/async/TAsyncProtocolProcessor.h>
#include <thrift/async/TEvhttpServer.h>
#include <thrift/server/TThreadedServer.h>
#include <thrift/transport/THttpServer.h>
#include <thrift/transport/TServerSocket.h>

using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;
using namespace ::apache::thrift::async;

using boost::shared_ptr;

using namespace  ::test1;

class test1Handler : virtual public test1If {
public:
    int32_t add_val(const int32_t a, const int32_t b) {
        return a + b;
    }
};

class test1AsyncHandler : public test1CobSvIf {
public:
    test1AsyncHandler() {
        syncHandler_ = std::auto_ptr<test1Handler>( new test1Handler );
    }

    void add_val(stdcxx::function <void(int32_t const& _ret)>cob, const int32_t
a, const int32_t b ) {
        int32_t _ret = 0;

        _ret = syncHandler_->add_val(a, b);

        return cob(_ret);
    }

protected:
    std::auto_ptr<test1Handler> syncHandler_;
};

int main(int argc, char ** argv) {

    shared_ptr<test1AsyncHandler>     handler(new test1AsyncHandler());
    shared_ptr<TAsyncProcessor>       proc(new test1AsyncProcessor(handler));
    shared_ptr<TProtocolFactory>      pfact(new TJSONProtocolFactory());
    shared_ptr<TAsyncBufferProcessor> bufproc(new TAsyncProtocolProcessor(proc, pfact));
    shared_ptr<TEvhttpServer>         server(new TEvhttpServer(bufproc, 9090));

/*        IF USE TThreadedServer WILL ALL WORK

    shared_ptr<test1Handler> test1 = shared_ptr<test1Handler>( new test1Handler()
);
    shared_ptr<TProcessor> processor = shared_ptr<TProcessor>( new test1Processor(test1)
);
    shared_ptr<TTransportFactory>transportFactory = shared_ptr<TTransportFactory>(
new THttpServerTransportFactory() );
    shared_ptr<TProtocolFactory>protocolFactory = shared_ptr<TProtocolFactory>(
new TJSONProtocolFactory() );
    shared_ptr<TServerTransport>serverTransport = shared_ptr<TServerTransport>(
new TServerSocket( 9090 ) );

    shared_ptr<TThreadedServer> server = shared_ptr<TThreadedServer>( new TThreadedServer(
processor,
        serverTransport, transportFactory, protocolFactory ) );
*/
    server->serve();

    return 0;
}
{code}
 

test1_client.cpp: (WORK)
{code:java}
#include <../gen-cpp/test1.h>

#include <iostream>

#include <thrift/transport/THttpClient.h>
#include <thrift/transport/TSocket.h>
#include <thrift/transport/TBufferTransports.h>
#include <thrift/protocol/TJSONProtocol.h>

using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;

int main(int argc, char ** argv) {

    boost::shared_ptr<TTransport> transport(new THttpClient("127.0.0.1", 9090, "/"));
    boost::shared_ptr<TProtocol>  protocol(new TJSONProtocol(transport));

    test1::test1Client client(protocol);
    transport->open();

    std::cout << client.add_val( 5, 10 ) << std::endl;

    transport->close();

    return 0;
}
{code}
 

test1_client.php (WORK)
{code:java}
<?
error_reporting( E_ALL );

$GLOBALS['THRIFT_ROOT'] = '/usr/lib/php';

require_once $GLOBALS['THRIFT_ROOT'].'/Thrift/ClassLoader/ThriftClassLoader.php';

use Thrift\ClassLoader\ThriftClassLoader;

$loader = new ThriftClassLoader();
$loader->registerNamespace( 'Thrift', $GLOBALS['THRIFT_ROOT'] );
$loader->register();

use Thrift\Protocol\TJSONProtocol;
use Thrift\Transport\TSocket;
use Thrift\Transport\THttpClient;
use Thrift\Transport\TBufferedTransport;
use Thrift\Transport\TFramedTransport;
use Thrift\Exception\TException;

$GEN_DIR = 'gen-php';
require_once $GEN_DIR.'/test1.php';
require_once $GEN_DIR.'/Types.php';

try {
$socket = new THttpClient( '127.0.0.1', 9090 );
$transport = new TBufferedTransport( $socket, 1024, 1024 );
$protocol = new TJSONProtocol( $transport );
$client = new test1Client( $protocol );

$transport->open();

echo $client->add_val( 5, 10 );

$transport->close();

} catch ( TException $tx ) {
print 'TException: '.$tx->getMessage()."\n";
}
?>
{code}
 

test1_client.html (DON'T WORK)
{code:java}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Test Thrift</title>
</head>
<body>
<input type="button" id="get_msg" value="Get Message" >
<div id="output"></div>

<script src="thrift.js"></script>
<script src="gen-js/test1.js"></script>
<script src="gen-js/test1_types.js"></script>

<script>
(function() {
var transport = new Thrift.TXHRTransport( "http://127.0.0.1:9090" );
var protocol = new Thrift.TJSONProtocol( transport );
var client = new test1Client( protocol );

var outputElement = document.getElementById("output");
document.getElementById("get_msg").addEventListener("click", function(){

outputElement.innerHTML = client.add_val( 5, 10 );
});
})();
</script>
</body>
</html>
{code}
 
 *Help please.*

 


> TEvhttpServer don't work with javascript
> ----------------------------------------
>
>                 Key: THRIFT-4466
>                 URL: https://issues.apache.org/jira/browse/THRIFT-4466
>             Project: Thrift
>          Issue Type: Bug
>          Components: C++ - Library, JavaScript - Library
>    Affects Versions: 0.11.0
>            Reporter: Richard Boolman
>            Priority: Major
>              Labels: async, javascript, libevent
>
> TEvhttpServer don't work with javascript client.
> With c++ client or php client or other client, will work.
> Example:
> test1.thrift
> {code:java}
> namespace cpp test1
> service test1 {
> i32 add_val( 1 : i32 a, 2 : i32 b );
> }
> {code}
>  
> {code:java}
> thrift -r --gen cpp:cob_style test1.thrift
> thrift -r --gen php test1.thrift
> thrift -r --gen js test1.thrift{code}
>  
> evhtp_thrift_server.cpp:
> {code:java}
> #include "../gen-cpp/test1.h"
> #include <thrift/protocol/TBinaryProtocol.h>
> #include <thrift/protocol/TJSONProtocol.h>
> #include <thrift/async/TAsyncProtocolProcessor.h>
> #include <thrift/async/TEvhttpServer.h>
> #include <thrift/server/TThreadedServer.h>
> #include <thrift/transport/THttpServer.h>
> #include <thrift/transport/TServerSocket.h>
> using namespace ::apache::thrift;
> using namespace ::apache::thrift::protocol;
> using namespace ::apache::thrift::transport;
> using namespace ::apache::thrift::server;
> using namespace ::apache::thrift::async;
> using boost::shared_ptr;
> using namespace  ::test1;
> class test1Handler : virtual public test1If {
> public:
>     int32_t add_val(const int32_t a, const int32_t b) {
>         return a + b;
>     }
> };
> class test1AsyncHandler : public test1CobSvIf {
> public:
>     test1AsyncHandler() {
>         syncHandler_ = std::auto_ptr<test1Handler>( new test1Handler );
>     }
>     void add_val(stdcxx::function <void(int32_t const& _ret)>cob, const int32_t
a, const int32_t b ) {
>         int32_t _ret = 0;
>         _ret = syncHandler_->add_val(a, b);
>         return cob(_ret);
>     }
> protected:
>     std::auto_ptr<test1Handler> syncHandler_;
> };
> int main(int argc, char ** argv) {
>     shared_ptr<test1AsyncHandler>     handler(new test1AsyncHandler());
>     shared_ptr<TAsyncProcessor>       proc(new test1AsyncProcessor(handler));
>     shared_ptr<TProtocolFactory>      pfact(new TJSONProtocolFactory());
>     shared_ptr<TAsyncBufferProcessor> bufproc(new TAsyncProtocolProcessor(proc,
pfact));
>     shared_ptr<TEvhttpServer>         server(new TEvhttpServer(bufproc, 9090));
> /*        IF USE TThreadedServer WILL ALL WORK
>     shared_ptr<test1Handler>        test1( new test1Handler() );
>     shared_ptr<TProcessor>          processor( new test1Processor(test1) );
>     shared_ptr<TTransportFactory>   transportFactory( new THttpServerTransportFactory()
);
>     shared_ptr<TProtocolFactory>    protocolFactory( new TJSONProtocolFactory()
);
>     shared_ptr<TServerTransport>    serverTransport( new TServerSocket( 9090 )
);
>     shared_ptr<TThreadedServer>     server( new TThreadedServer( processor, serverTransport,
transportFactory, protocolFactory ) );
> */
>     server->serve();
>     return 0;
> }
> {code}
>  
> test1_client.cpp: (WORK)
> {code:java}
> #include <../gen-cpp/test1.h>
> #include <iostream>
> #include <thrift/transport/THttpClient.h>
> #include <thrift/transport/TSocket.h>
> #include <thrift/transport/TBufferTransports.h>
> #include <thrift/protocol/TJSONProtocol.h>
> using namespace apache::thrift;
> using namespace apache::thrift::protocol;
> using namespace apache::thrift::transport;
> int main(int argc, char ** argv) {
>     boost::shared_ptr<TTransport> transport(new THttpClient("127.0.0.1", 9090,
"/"));
>     boost::shared_ptr<TProtocol>  protocol(new TJSONProtocol(transport));
>     test1::test1Client client(protocol);
>     transport->open();
>     std::cout << client.add_val( 5, 10 ) << std::endl;
>     transport->close();
>     return 0;
> }
> {code}
>  
> test1_client.php (WORK)
> {code:java}
> <?
> error_reporting( E_ALL );
> $GLOBALS['THRIFT_ROOT'] = '/usr/lib/php';
> require_once $GLOBALS['THRIFT_ROOT'].'/Thrift/ClassLoader/ThriftClassLoader.php';
> use Thrift\ClassLoader\ThriftClassLoader;
> $loader = new ThriftClassLoader();
> $loader->registerNamespace( 'Thrift', $GLOBALS['THRIFT_ROOT'] );
> $loader->register();
> use Thrift\Protocol\TJSONProtocol;
> use Thrift\Transport\TSocket;
> use Thrift\Transport\THttpClient;
> use Thrift\Transport\TBufferedTransport;
> use Thrift\Transport\TFramedTransport;
> use Thrift\Exception\TException;
> $GEN_DIR = 'gen-php';
> require_once $GEN_DIR.'/test1.php';
> require_once $GEN_DIR.'/Types.php';
> try {
> $socket = new THttpClient( '127.0.0.1', 9090 );
> $transport = new TBufferedTransport( $socket, 1024, 1024 );
> $protocol = new TJSONProtocol( $transport );
> $client = new test1Client( $protocol );
> $transport->open();
> echo $client->add_val( 5, 10 );
> $transport->close();
> } catch ( TException $tx ) {
> print 'TException: '.$tx->getMessage()."\n";
> }
> ?>
> {code}
>  
> test1_client.html (DON'T WORK)
> {code:java}
> <!DOCTYPE html>
> <html lang="en">
> <head>
> <meta charset="utf-8">
> <title>Test Thrift</title>
> </head>
> <body>
> <input type="button" id="get_msg" value="Get Message" >
> <div id="output"></div>
> <script src="thrift.js"></script>
> <script src="gen-js/test1.js"></script>
> <script src="gen-js/test1_types.js"></script>
> <script>
> (function() {
> var transport = new Thrift.TXHRTransport( "http://127.0.0.1:9090" );
> var protocol = new Thrift.TJSONProtocol( transport );
> var client = new test1Client( protocol );
> var outputElement = document.getElementById("output");
> document.getElementById("get_msg").addEventListener("click", function(){
> outputElement.innerHTML = client.add_val( 5, 10 );
> });
> })();
> </script>
> </body>
> </html>
> {code}
>  
>  *Help please.*
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message