59 lines
2.3 KiB
OCaml
59 lines
2.3 KiB
OCaml
(*
|
|
Licensed to the Apache Software Foundation (ASF) under one
|
|
or more contributor license agreements. See the NOTICE file
|
|
distributed with this work for additional information
|
|
regarding copyright ownership. The ASF licenses this file
|
|
to you under the Apache License, Version 2.0 (the
|
|
"License"); you may not use this file except in compliance
|
|
with the License. You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing,
|
|
software distributed under the License is distributed on an
|
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
KIND, either express or implied. See the License for the
|
|
specific language governing permissions and limitations
|
|
under the License.
|
|
*)
|
|
|
|
open Thrift
|
|
|
|
module T = Transport
|
|
|
|
class t host port=
|
|
object (self)
|
|
inherit T.t
|
|
val mutable chans = None
|
|
method isOpen = chans != None
|
|
method opn =
|
|
try
|
|
let addr = (let {Unix.h_addr_list=x} = Unix.gethostbyname host in x.(0)) in
|
|
chans <- Some(Unix.open_connection (Unix.ADDR_INET (addr,port)))
|
|
with
|
|
Unix.Unix_error (e,fn,_) -> raise (T.E (T.NOT_OPEN, ("TSocket: Could not connect to "^host^":"^(string_of_int port)^" because: "^fn^":"^(Unix.error_message e))))
|
|
| _ -> raise (T.E (T.NOT_OPEN, ("TSocket: Could not connect to "^host^":"^(string_of_int port))))
|
|
|
|
method close =
|
|
match chans with
|
|
None -> ()
|
|
| Some(inc,out) -> (Unix.shutdown_connection inc;
|
|
close_in inc;
|
|
chans <- None)
|
|
method read buf off len = match chans with
|
|
None -> raise (T.E (T.NOT_OPEN, "TSocket: Socket not open"))
|
|
| Some(i,o) ->
|
|
try
|
|
really_input i buf off len; len
|
|
with
|
|
Unix.Unix_error (e,fn,_) -> raise (T.E (T.UNKNOWN, ("TSocket: Could not read "^(string_of_int len)^" from "^host^":"^(string_of_int port)^" because: "^fn^":"^(Unix.error_message e))))
|
|
| _ -> raise (T.E (T.UNKNOWN, ("TSocket: Could not read "^(string_of_int len)^" from "^host^":"^(string_of_int port))))
|
|
method write buf off len = match chans with
|
|
None -> raise (T.E (T.NOT_OPEN, "TSocket: Socket not open"))
|
|
| Some(i,o) -> output o buf off len
|
|
method flush = match chans with
|
|
None -> raise (T.E (T.NOT_OPEN, "TSocket: Socket not open"))
|
|
| Some(i,o) -> flush o
|
|
end
|
|
|
|
|