というお話
同じようにしようと思ったんですね、Scala で
scala> import javax.net.ssl.SSLSocketFactoryjava.net.Socket には startHandshake なんて無いと
import javax.net.ssl.SSLSocketFactory
scala> val fc = SSLSocketFactory.getDefault
fc: javax.net.SocketFactory = com.sun.net.ssl.internal.ssl.SSLSocketFactoryImpl@10c6406
scala> val sock = fc.createSocket("www.google.com", 443)
sock: java.net.Socket = 17aa961[SSL_NULL_WITH_NULL_NULL: Socket[addr=www.google.com/66.249.89.99,port=443,localport=57185]]
scala> sock.startHandshake
<console>:8: error: value startHandshake is not a member of java.net.Socket
sock.startHandshake
^
scala>
あれー、と思って調べてみたら
Java の場合は Socket 作るときにキャストしてたんです
なんで調べてみましたところ
型キャスト - うなの日記
.asInstanceOf でキャストするらしい
とわけで仕切り直し
scala> import javax.net.ssl.SSLSocket取れた!!
import javax.net.ssl.SSLSocket
scala> val ssl_sock = fc.createSocket("www.google.com", 443).asInstanceOf[javax.net.ssl.SSLSocket]
ssl_sock: javax.net.ssl.SSLSocket = 5b55a9[SSL_NULL_WITH_NULL_NULL: Socket[addr=www.google.com/66.249.89.104,port=443,localport=51395]]
scala> ssl_sock.startHandshake
scala> val session = ssl_sock.getSession
session: javax.net.ssl.SSLSession = [Session-1, SSL_RSA_WITH_RC4_128_SHA]
scala> session.getPeerCertificates
res3: Array[java.security.cert.Certificate] =
Array([
[
Version: V3
Subject: CN=www.google.com, O=Google Inc, L=Mountain View, ST=California, C=US
Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
Key: Sun RSA public key, 1024 bits
modulus: 16360039926653679142684174795487342200966220249542631283272411000230225514996552443305086682233800494025854567816692732625...
scala>
Scala の方が Java に対して素直なんですかね
何故 Jython でキャストが不要なのか良く分からず
どのくらい手を加えているのかっつーことなんでしょうか
0 件のコメント:
コメントを投稿