ssl.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 288 行
ERL
288 行
%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %% $Id$%%%%% Purpose : Main API module for SSL.-module(ssl).-export([start/0, stop/0, accept/1, accept/2, transport_accept/1, transport_accept/2, ssl_accept/1, ssl_accept/2, ciphers/0, close/1, connect/3, connect/4, connection_info/1, controlling_process/2, listen/2, pid/1, port/1, peername/1, recv/2, recv/3, send/2, getopts/2, setopts/2, seed/1, sockname/1, peercert/1, peercert/2, version/0, format_error/1]).-include("ssl_int.hrl").start() -> application:start(ssl).stop() -> application:stop(ssl).%% accept(ListenSocket) -> {ok, Socket}.%% accept(ListenSocket, Timeout) -> {ok, Socket}.%%accept(ListenSocket) -> accept(ListenSocket, infinity).accept(ListenSocket, Timeout) when record(ListenSocket, sslsocket) -> case transport_accept(ListenSocket, Timeout) of {ok, NewSocket} -> case ssl_accept(NewSocket, Timeout) of ok -> {ok, NewSocket}; Error -> Error end; Error -> Error end.%% transport_accept(ListenSocket) -> {ok, Socket}.%% transport_accept(ListenSocket, Timeout) -> {ok, Socket}.%%transport_accept(ListenSocket) -> transport_accept(ListenSocket, infinity).transport_accept(ListenSocket, Timeout) when record(ListenSocket, sslsocket) -> {ok, Pid} = ssl_broker:start_broker(acceptor), ssl_broker:transport_accept(Pid, ListenSocket, Timeout).%% ssl_accept(ListenSocket) -> {ok, Socket}.%% ssl_accept(ListenSocket, Timeout) -> {ok, Socket}.%%ssl_accept(Socket) -> ssl_accept(Socket, infinity).ssl_accept(Socket, Timeout) when record(Socket, sslsocket) -> ssl_broker:ssl_accept(Socket, Timeout).ciphers() -> case (catch ssl_server:ciphers()) of {'EXIT', _} -> {error, enotstarted}; Res = {ok, _} -> Res end. %% close(Socket) -> ok%%close(Socket) when record(Socket, sslsocket) -> ssl_broker:close(Socket).%% connect(Address, Port, Options) -> {ok, Socket}%% connect(Address, Port, Options, Timeout) -> {ok, Socket}%%connect(Address, Port, Options) -> connect(Address, Port, Options, infinity).connect(Address, Port, Options, Timeout) -> {ok, Pid} = ssl_broker:start_broker(connector), ssl_broker:connect(Pid, Address, Port, Options, Timeout).%% connection_info(Socket) -> {ok, {Protocol, Cipher}} | {error, Reason}%%%% connection_info(Socket) when record(Socket, sslsocket) -> ssl_broker:connection_info(Socket).%% controlling_process(Socket, NewOwner) -> ok | {error, Reason}%%controlling_process(Socket, NewOwner) when pid(NewOwner) -> ssl_broker:controlling_process(Socket, NewOwner).%% listen(Port, Options) -> {ok, ListenSock} | {error, Reason}%%listen(_Port, []) -> {error, enooptions};listen(Port, Options) -> {ok, Pid} = ssl_broker:start_broker(listener), ssl_broker:listen(Pid, Port, Options).%% peercert(Socket) -> {ok, Cert} | {error, Reason}%% peercert(Socket, Opts) -> {ok, Cert} | {error, Reason}%% peercert(Socket) -> peercert(Socket, []).peercert(Socket, Opts) when record(Socket, sslsocket) -> case ssl_broker:peercert(Socket) of {ok, Bin} -> ssl_pkix:decode_cert(Bin, Opts); {error, Reason} -> {error, Reason} end.%% peername(Socket) -> {ok, {Address, Port}} | {error, Reason}%%%% peername(Socket) when record(Socket, sslsocket) -> ssl_broker:peername(Socket).%% pid(Socket) -> pid()%%%% pid(Socket) when record(Socket, sslsocket) -> Socket#sslsocket.pid.%% port(Socket) -> {ok, Port} | {error, Reason}%%%% Deprecated. Use sockname/1 instead.port(Socket) when record(Socket, sslsocket) -> case sockname(Socket) of {ok, {_, Port}} -> {ok, Port}; {error, Reason} -> {error, Reason} end.%%%% recv(Socket, Length) -> {ok, Data} | {error, reason}%% recv(Socket, Length, Timeout) -> {ok, Data} | {error, reason}%%recv(Socket, Length) -> recv(Socket, Length, infinity).recv(Socket, Length, Timeout) when record(Socket, sslsocket) -> ssl_broker:recv(Socket, Length, Timeout).%% seed(Data) -> ok | {error, edata}%%seed(Data) -> ssl_server:seed(Data).%% send(Socket, Data) -> ok%%send(Socket, Data) when record(Socket, sslsocket) -> ssl_broker:send(Socket, Data).%% getopts(Socket, OptTags) -> {ok, Options} | {error, Reason}%%%% getopts(Socket, Options) when record(Socket, sslsocket) -> ssl_broker:getopts(Socket, Options).%% setopts(Socket, Options) -> ok | {error, Reason}%%%% setopts(Socket, Options) when record(Socket, sslsocket) -> ssl_broker:setopts(Socket, Options).%% sockname(Socket) -> {ok, {Address, Port}} | {error, Reason}%%%% sockname(Socket) when record(Socket, sslsocket) -> ssl_broker:sockname(Socket).version() -> SSLVsn = ?VSN, {CompVsn, LibVsn} = case (catch ssl_server:version()) of {'EXIT', _} -> {"", ""}; {ok, Vsns} -> Vsns end, {ok, {SSLVsn, CompVsn, LibVsn}}. %% format_error(Term) -> string()%% %%format_error({error, Reason}) -> format_error(Reason);format_error(closed) -> "Connection closed for the operation in question.";format_error(ebadsocket) -> "Connection not found (internal error).";format_error(ebadstate) -> "Connection not in connect state (internal error).";format_error(ebrokertype) -> "Wrong broker type (internal error).";format_error(ecacertfile) -> "Own CA certificate file is invalid.";format_error(ecertfile) -> "Own certificate file is invalid.";format_error(echaintoolong) -> "The chain of certificates provided by peer is too long.";format_error(ecipher) -> "Own list of specified ciphers is invalid.";format_error(ekeyfile) -> "Own private key file is invalid.";format_error(ekeymismatch) -> "Own private key does not match own certificate.";format_error(enoissuercert) -> "Cannot find certificate of issuer of certificate provided by peer.";format_error(enoservercert) -> "Attempt to do accept without having set own certificate.";format_error(enotlistener) -> "Attempt to accept on a non-listening socket.";format_error(enoproxysocket) -> "No proxy socket found (internal error or max number of file " "descriptors exceeded).";format_error(enooptions) -> "List of options is empty.";format_error(enotstarted) -> "The SSL application has not been started.";format_error(eoptions) -> "Invalid list of options.";format_error(epeercert) -> "Certificate provided by peer is in error.";format_error(epeercertexpired) -> "Certificate provided by peer has expired.";format_error(epeercertinvalid) -> "Certificate provided by peer is invalid.";format_error(eselfsignedcert) -> "Certificate provided by peer is self signed.";format_error(esslaccept) -> "Server SSL handshake procedure between client and server failed.";format_error(esslconnect) -> "Client SSL handshake procedure between client and server failed.";format_error(esslerrssl) -> "SSL protocol failure. Typically because of a fatal alert from peer.";format_error(ewantconnect) -> "Protocol wants to connect, which is not supported in this " "version of the SSL application.";format_error(ex509lookup) -> "Protocol wants X.509 lookup, which is not supported in this " "version of the SSL application.";format_error({badcall, _Call}) -> "Call not recognized for current mode (active or passive) and state " "of socket.";format_error({badcast, _Cast}) -> "Call not recognized for current mode (active or passive) and state " "of socket."; format_error({badinfo, _Info}) -> "Call not recognized for current mode (active or passive) and state " "of socket.";format_error(Error) -> case (catch inet:format_error(Error)) of "unkknown POSIX" ++ _ -> no_format(Error); {'EXIT', _} -> no_format(Error); Other -> Other end.no_format(Error) -> io_lib:format("No format string for error: \"~p\" available.", [Error]).
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?