/* http_transaction/3 must be rewritten to use the Quintus tcp and socketio libraries. * * http_transaction(+Host, +Port, +Request, +Timeout, -Response) Sends an HTTP * Request to an HTTP server (Host:Port) and returns the resultant message in Response. */ :- use_module(library(tcp)). :- use_module(library(socketio)). :- use_module(library(date), [now/1]). http_transaction( Host, Port, Request, Timeout, Response ) :- connect( Host, Port, Socket ), Socket >= 0, % Fail if connect error socket_io_open_output( Socket, Ocode ), stream_code( OStream, Ocode ), write_string( OStream, Request ), close( OStream ), socket_io_open_input( Socket, Icode ), stream_code( IStream, Icode ), now( Now ), http_transaction1( Now, Socket, IStream, Timeout, Response ), close( IStream ), tcp_shutdown( Socket, _Status ), Response \== timeout. http_transaction1( Now, Socket, IStream, Timeout, Response ) :- tcp_select( 0, Timeout, FD, Status ), http_transaction2( Status, Now, Socket, FD, IStream, Timeout, Response ). http_transaction2( 1, Then, Socket, FD, IStream, Timeout, Response ) :- ( Socket == FD -> read_to_close( IStream, Response ) ; otherwise -> now( Now ), Elapsed is Now - Then, ( Elapsed < Timeout -> Timeout1 is Timeout - Elapsed, http_transaction1( Now, Socket, IStream, Timeout1, Response ) ; otherwise -> Response = timeout ) ). http_transaction2( 0, _Then, _Socket, _FD, _IStream, _Timeout, timeout ). http_transaction2( -1, _Then, Socket, _FD, IStream, Timeout, _Response ) :- raise_exception( socket_error(Socket, IStream, Timeout) ). foreign(tcp_connect,c,connect(+string,+integer,[-integer])). foreign(tcp_select, c, tcp_select(+integer, +double, -integer, [-integer])). foreign(tcp_shutdown,c,tcp_shutdown(+integer,[-integer])). foreign_file(library(system(tcp_p)),[ tcp_connect, tcp_select, tcp_shutdown ]). :- load_foreign_executable(library(system(tcp_p))), abolish(foreign_file, 2), abolish(foreign, 3). /* A number of ISO Prolog predicates are used. These can be mapped to equivalent * Quintus built-in predicates: */ flush_output :- ttyflush. atom_codes( Atom, Codes ) :- atom_chars( Atom, Codes ). catch( Goal, Error, Action ) :- on_exception( Error, Goal, Action ). get_code( Code ) :- get0( Code ). get_code( Stream, Code ) :- get0( Stream, Code ). include( File ) :- ensure_loaded( File ). number_codes( Number, Codes ) :- number_chars( Number, Codes ). put_code( Code ) :- put( Code ). /* Similarly, some library predicates are not defined/defined differently in * Quintus: */ atom_concat( A, B, AB ) :- name( A, AS ), name( B, BS ), append( AS, BS, ABS ), atom_chars( AB, ABS ). getenv( Var, QueryString ) :- environ( Var, QueryString ). :- use_module( library(environ), [environ/2] ).