summaryrefslogtreecommitdiff
path: root/src/main/kotlin/Connection.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/Connection.kt')
-rw-r--r--src/main/kotlin/Connection.kt26
1 files changed, 16 insertions, 10 deletions
diff --git a/src/main/kotlin/Connection.kt b/src/main/kotlin/Connection.kt
index 3f920e7..6233407 100644
--- a/src/main/kotlin/Connection.kt
+++ b/src/main/kotlin/Connection.kt
@@ -51,7 +51,7 @@ class Connection(transLay: TransportLayer) : ProtocolTranslator {
}
override fun version(msize: UInt, version: String): String? {
- val msg = Message(NinePMessageType.TVERSION, this.NOTAG, listOf("msize", "version"),
+ val omsg = OutMessage(NinePMessageType.TVERSION, this.NOTAG, listOf("msize", "version"),
mapOf(
"msize" to BigInteger(msize.toString())
),
@@ -60,16 +60,22 @@ class Connection(transLay: TransportLayer) : ProtocolTranslator {
),
this.maxSize
)
- val error = responseError(msg)
- if (error != null) {
- return error
+ val imsg: InMessage
+ try {
+ imsg = InMessage(this.tl, msize, omsg.tag)
+ } catch (ime: InvalidMessageException) {
+ return ime.message
+ }
+ imsg.applySchema(listOf(
+ InMessage.Field("msize", InMessage.Field.Type.INTEGER, 4u),
+ InMessage.Field("version", InMessage.Field.Type.STRING, 0u)
+ ))
+ val remoteMaxSize = imsg.fieldsInt["msize"]!!.toInt().toUInt()
+ if (remoteMaxSize > this.maxSize) {
+ return "Invalid remote msize value (too big)."
}
- waitForTag(msg.tag)
- val rmsize = readInteger(4u).toInt().toUInt()
- val rversion = readString()
- // this check should not be necessary, but you never know
- this.maxSize = ( if (rmsize < msize) msize else rmsize )
- if (rversion == "unknown") {
+ this.maxSize = remoteMaxSize
+ if (imsg.fieldsStr["version"] == "unknown") {
return "Unknown version."
}
return null