TestTLS.Mod 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. MODULE TestTLS;
  2. (* Timothée Martiel 2014: test TLS server and client functionalities*)
  3. IMPORT KernelLog, TLS, Commands, IP, TCP, Streams, WebHTTP, DNS, TFLog, Strings;
  4. CONST
  5. ErrIllegalURL* = -1;
  6. ErrNotConnected* = -2;
  7. ErrIllegalResponse* = -3;
  8. VAR
  9. server, client: TLS.Connection;
  10. log:TFLog.Log;
  11. PROCEDURE StartServer*(context: Commands.Context);
  12. VAR
  13. res: LONGINT;
  14. BEGIN
  15. server := TLS.GetConnection();
  16. server.Open(123, IP.NilAdr, TCP.NilPort, res)
  17. END StartServer;
  18. PROCEDURE StopServer*(context: Commands.Context);
  19. BEGIN
  20. server.Close
  21. END StopServer;
  22. PROCEDURE OpenClient*(lport:LONGINT; fadr:IP.Adr; fport:LONGINT; VAR res:LONGINT);
  23. BEGIN
  24. client := TLS.GetConnection();
  25. client.Open(lport, fadr, fport, res);
  26. client.AwaitStateNotEqual(TLS.ClientHandshake);
  27. IF client.State() = TCP.Established THEN
  28. KernelLog.String("TLS Client Connection Opened"); KernelLog.Ln;
  29. END
  30. END OpenClient;
  31. PROCEDURE StartClient*(context: Commands.Context);
  32. VAR res:LONGINT;
  33. BEGIN
  34. OpenClient(TCP.NilPort, IP.StrToAdr("127.0.0.1"), 443, res);
  35. END StartClient;
  36. PROCEDURE StopClient*;
  37. BEGIN
  38. IF client#NIL THEN
  39. client.Close;
  40. client:=NIL;
  41. END;
  42. END StopClient;
  43. PROCEDURE Get*(context:Commands.Context);
  44. VAR
  45. requestHeader: WebHTTP.RequestHeader;
  46. responseHeader: WebHTTP.ResponseHeader;
  47. w : Streams.Writer; r : Streams.Reader;
  48. x : WebHTTP.AdditionalField;
  49. host : ARRAY 128 OF CHAR;
  50. url, path : ARRAY 2048 OF CHAR;
  51. port : LONGINT;
  52. fadr: IP.Adr;
  53. dechunk: WebHTTP.ChunkedInStream;
  54. lin : WebHTTP.LimitedInStream;
  55. success:BOOLEAN;
  56. res:LONGINT;
  57. out:Streams.Reader;
  58. ch:CHAR;
  59. BEGIN
  60. requestHeader.referer := "";
  61. requestHeader.useragent := "A2 https client";
  62. requestHeader.maj := 1;
  63. requestHeader.min := 1;
  64. success:=context.arg.GetString(url);
  65. StopClient;
  66. IF WebHTTP.SplitHTTPAdr(url, host, path, port) THEN
  67. DNS.HostByName(host, fadr, res);
  68. IF res = DNS.Ok THEN
  69. OpenClient(TCP.NilPort, fadr, port, res);
  70. IF res#0 THEN context.out.String("connection failed"); context.out.Ln; context.out.Update; RETURN END;
  71. Streams.OpenWriter(w, client.Send); Streams.OpenReader(r, client.Receive);
  72. IF path="" THEN path:="/" END;
  73. WebHTTP.WriteRequestLine(w, requestHeader.maj, requestHeader.min, WebHTTP.GetM, path, host);
  74. WebHTTP.WriteRequestLine(context.out, requestHeader.maj, requestHeader.min, WebHTTP.GetM, path, host);
  75. IF requestHeader.referer # "" THEN w.String("Referer: "); w.String(requestHeader.referer); w.Ln() END;
  76. IF requestHeader.useragent # "" THEN w.String("User-Agent: "); w.String(requestHeader.useragent); w.Ln() END;
  77. IF requestHeader.accept # "" THEN w.String("Accept: "); w.String(requestHeader.accept); w.Ln() END;
  78. x := requestHeader.additionalFields;
  79. WHILE x # NIL DO
  80. w.String(x.key); w.Char(" "); w.String(x.value);w.Ln();
  81. x := x.next
  82. END;
  83. w.Ln(); w.Update();
  84. WebHTTP.ParseReply(r, responseHeader, res, log);
  85. WebHTTP.LogResponseHeader(log,responseHeader);
  86. IF (Strings.Pos("hunked", responseHeader.transferencoding) > 0) THEN NEW(dechunk, r, out)
  87. ELSIF responseHeader.contentlength >= 0 THEN NEW(lin, r, out, responseHeader.contentlength)
  88. ELSE out := r
  89. END;
  90. res := 0;
  91. x := responseHeader.additionalFields;
  92. WHILE x # NIL DO
  93. x := x.next
  94. END;
  95. context.out.String("Response:"); context.out.Ln;
  96. LOOP
  97. ch:=out.Get();
  98. IF out.res#Streams.Ok THEN EXIT END;
  99. context.out.Char(ch);
  100. END;
  101. context.out.Ln;
  102. context.out.String("TestTLS.Get done");
  103. END;
  104. ELSE
  105. res := ErrIllegalURL
  106. END;
  107. context.out.Update;
  108. END Get;
  109. BEGIN
  110. NEW(log,"https client:"); log.SetLogToOut(TRUE);
  111. END TestTLS.
  112. Compiler.Compile
  113. ASN1.Mod
  114. X509.Mod
  115. PKCS1.Mod
  116. TLS.Mod
  117. ~
  118. TestTLS.StartServer ~
  119. TestTLS.StopServer ~
  120. WebHTTPServerTools.Start \r:httproot \l:HTTP.Log \s:on ~ (* start HTTPS server*)
  121. WebHTTPServerTools.Stop ~
  122. TestTLS.Get https://127.0.0.1/index.html ~ (* access the local server via loopback*)
  123. TestTLS.Get http://127.0.0.1:80/index.html ~ (* access the local server via loopback*)
  124. TestTLS.Get https://www.google.com/ ~
  125. TestTLS.Get https://discognosis.highdim.com/index.html ~
  126. TestTLS.Get https://discognosis.highdim.com/ ~
  127. TestTLS.Get http://discognosis.highdim.com/ ~
  128. TestTLS.Get https://startpage.com ~
  129. TestTLS.Get https://www.archlinux.org ~
  130. TestTLS.Get https://www.ethz.ch/de.html ~
  131. TestTLS.Get https://www.duckduckgo.com ~
  132. TestTLS.Get https://127.0.0.1:4433/
  133. TestTLS.StartClient ~
  134. TestTLS.StopClient ~
  135. SystemTools.FreeDownTo TCP ~
  136. WebHTTPServerTools.ListHosts ~