Migrating 0.9.2 → 1.0.0-beta-3

预计阅读时间:23分钟

目录:

1.0.0-beta-3

这是Ktor的第三个Beta. 以及使用Kotlin 1.3.0和kotlinx.coroutines 1.0.0最终版本的Ktor的第一个版本!

2018年10月29日发布

版本颠簸:

  • Kotlin: 1.3.0-rc-146 -> 1.3.0
  • Kotlinx IO: 0.1.0-alpha-25-rc13 -> 0.1.0-beta-1
  • Kotlinx Coroutines: 1.0.0-RC1 -> 1.0.0
  • Kotlinx Serialization: 0.8.2-rc13 -> 0.9.0
  • AtomicFU: 0.11.11 -> 0.11.12

Improvements:

  • 在kotlinx.serialization功能中添加js支持( commit )(关闭#666
  • 避免阻塞PRNG( commit
  • 改进OAuth2诊断以获取令牌获取失败( #550
  • 使用.serializer( commit )查找序列化程序
  • 添加了一堆KDocs并澄清了旧的

Fixes:

  • 修复处理身份验证错误( #676

Minor:

  • 从ApacheHttpRequest中删除冗余标志( commit

How to try

您需要使用Kotlin 1.3.0或更高版本. 该版本应该在Maven Central和jcenter上可用:

buildscript {
    ext.kotlin_version = '1.3.0'
}

您还需要在IntelliJ IDEA中使用Kotlin 1.3.

1.0.0-beta-2

这是Ktor的第二个Beta.

2018年10月24日发布

版本颠簸:

  • Kotlin: 1.3.0-rc-131 -> 1.3.0-rc-146
  • Kotlinx IO: 0.1.0-alpha-19-rc13 -> 0.1.0-alpha-25-rc13
  • Kotlinx Coroutines: 0.30.2-eap13 -> 1.0.0-RC1
  • AtomicFU: 0.11.10-eap13 -> 0.11.11

主要变化:

标记为实验性:

  • 将Locations API标记为实验性( commit
  • 介绍stopServerOnCancellation而不是取消帮助器( commit

Deprecations:

  • 将nextNonce重命名为generateNonce( commit

Added:

  • 介绍应用程序协程范围( commit
  • 介绍为嵌入式服务器指定协程范围的能力( commit
  • ktor-client:将HttpsURLConnection配置添加到AndroidEngineConfig( commit
  • ktor-client:将代理添加到AndroidEngineConfig( commit
  • 使用显式的KSerializer( commit )添加KotlinxSerializer.register()
  • 将默认的序列化器添加到KotlinxSerializer( commit
  • 添加KotlinxSerializer register()以使用通用化的泛型来设置mapper( commit
  • 为位置功能引入href扩展功能( #597

小改动:

  • 限制位置注释目标,允许使用类型别名( #539
  • 删除端口80( #670 )上的默认连接器
  • 不要禁用Kotlin本机去虚拟化( commit

Improvements:

  • 改善JWT诊断( #664
  • 改进OAuth2诊断以获取令牌获取失败( #550
  • 替换Unconfined阻止servlet的实现( commit
  • 提高nextNonce强度(现在称为generateNonce)( 提交
  • 改善KotlinxSerializer( commit )的错误处理

Fixes:

  • 修复Windows上的多部分处理( commit
  • 修复Jetty上的Websocket IDLE超时( commit
  • 修复导致通道过早关闭的破碎压缩( commit
  • 在JS引擎中正确构造请求标头( #665
  • 修复引擎的套件套接字连接超时( commit
  • 修复嵌入式tomcat引擎停止( commit
  • 消除了使用Unconfined读取文件的问题(修复了选择器无限循环)( commit
  • 修复StatusPages以处理子作业失败( #646

Removed:

  • 修正基准测试中的实验性注释( commit

How to try

您需要包括kotlin-eap存储库并使用Kotlin 1.3.0-rc-146或更高版本:

buildscript {
    ext.kotlin_version = '1.3.0-rc-146'

    repositories {
        // ...
        maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' }
    }
}

repositories {
    // ...
    maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' }
    maven { url 'https://dl.bintray.com/kotlin/kotlinx' }
    maven { url 'https://dl.bintray.com/kotlin/ktor' }
    jcenter()
}

您还需要在IntelliJ IDEA中使用Early Access Preview 1.3.

为此,在Tools -> Kotlin -> Configure Kotlin Updates ,将其作为更新通道,选择Early Access Preview 1.3并安装该插件版本.

DevelopmentEngine to EngineMain

我们已将DevelopmentEngine类重命名为EngineMain ,并且您将必须更新application.conf配置文件.

DevelopmentEngine类用作Ktor应用程序的入口点. 除了创建嵌入式服务器并加载指定的模块之外,它还加载了application.conf和已解析的CLI参数.

DevelopmentEngine的问题在于它令人困惑,因为有人认为Development而不是Production .

新名称反映了它充当应用程序的入口点,并且独立于适用于开发和生产的环境.

1.0.0-beta-1

这是Ktor的第一个Beta版! 该页面包括对alpha-2,alpha-3和beta-1的更改.

2018年10月15日发布

版本颠簸:

  • Kotlinx IO: 0.1.0-alpha-17-rc13 -> 0.1.0-alpha-19-rc13

Additions:

  • 添加js客户端引擎( commit
  • 介绍客户端发送功能. 迁移HttpRedirect( commit
  • 介绍ExpectSuccess功能( commit

Improvements:

  • 现在,URLBuilder可以区分未指定的端口和回退到协议的defaultPort的位置( #561
  • 在客户端响应配置( commit )中使用UTF-8编码作为后备
  • 默认情况下,在客户端构建器中使用默认端口(端口0现在表示协议的默认端口)
  • 提供用户定义的功能来配置Netty的HttpServerCodec( #629 )修复#580
  • 添加缺少的HttpClient构造函数( commit
  • 添加MockEngine内容测试( commit
  • 向WebSockets API添加便捷方法( commit
  • 准备迁移到协程1.0.0-RC( #642
  • 使用引擎响应中的客户端状态消息( commit

Fixes:

  • 修复TLS解密器循环错误并减少垃圾( commit
  • 修复escapeHTML实用程序功能( commit
  • 修复客户端HttpSend循环,如果呼叫已更改( commit )不退出
  • 修复损坏的normalizeAndRelativize,添加文档( commit
  • 修复cookie区分大小写( commit
  • 修复cookie和参数重复( commit

性能改进:

  • 改进内部实用程序ByteBuffer.moveTo( commit

Documentation:

  • 改进文档,清理API,引入实验性注释( commit

次要和清理:

  • 消除CoroutineScope接收器的暂停功能( commit
  • 在拼写检查器字典中添加更多单词( commit
  • 消除无法访问的代码警告( commit
  • 修复客户端中的测试数据包( commit
  • 删除Apache URIBuilder( commit
  • 修复测试名称( 提交
  • 修复.editorconfig以追加尾随换行符( commit

How to try

您需要包括kotlin-eap存储库并使用Kotlin 1.3.0-rc-131或更高版本:

buildscript {
    ext.kotlin_version = '1.3.0-rc-131'

    repositories {
        // ...
        maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' }
    }
}

repositories {
    // ...
    maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' }
    maven { url 'https://dl.bintray.com/kotlin/kotlinx' }
    maven { url 'https://dl.bintray.com/kotlin/ktor' }
    jcenter()
}

您还需要在IntelliJ IDEA中使用Early Access Preview 1.3.

为此,在Tools -> Kotlin -> Configure Kotlin Updates ,将其作为更新通道,选择Early Access Preview 1.3并安装该插件版本.

1.0.0-alpha-1

Ktor 1.0.0-alpha-1是在1.0之前发布的初始预发行版本. 该版本是使用Kotlin 1.3.0-rc-131的第一个版本,并将kotlinx.coroutines版本提高到0.30.2-eap13 . 作为一个重要的更改,Ktor现在使用了来自kotlinx.coroutines结构化并发 . 另外它增加了

2018年10月9日发布

版本凹凸:

  • Kotlin: 1.2.70 -> 1.3.0-rc-131
  • Kotlinx IO: 0.1.0-alpha-4 -> 0.1.0-alpha-17-rc13
  • Kotlinx Coroutines: 0.25.0 -> 0.30.2-eap13
  • Atomic FU: 0.11.3 -> 0.11.10-eap13

主要变化:

弃用,重命名和API更改:

  • 将一些旧的弃用增加到DeprecationLevel.ERROR
  • Deprecated ByteBufferBuilder
  • Renamed RoutingException -> LocationRoutingException
  • HttpMessageBuilder.contentLength()HttpMessage.contentLength()现在返回Long
  • 删除一些已弃用并更改为实验性内部API. (例如WebSocketInternalAPI
  • AndroidClientEngine现在为@UseExperimental(InternalAPI::class)
  • 适用于Apache引擎的ApacheBackend别名

Fixes:

  • 设置默认的呼叫管道丢弃请求主体内容(修复#609#574
  • Fixes url path encoding
  • 发布后修复服务器响应日志记录
  • 使Cookie.matches忽略域中的前导点

Additions:

Improvements:

  • 统一模仿模式+使用Kotlin 1.3 stdlib中的随机
  • 在MacOS上测试Kotlin / Native

小改动:

  • 一些API文档
  • 为外部编辑器添加editorconfig
  • Use kotlin.code.style=official

New coroutines

从1.0.0-alpha-1开始,Ktor使用的是最新的kotlinx.coroutines版本,该版本使用结构化并发. 现在,每个请求都有自己的CoroutineScope ,您也可以使用GlobalScope .

有关更多信息: https : //github.com/Kotlin/kotlinx.coroutines/blob/master/docs/basics.md#structured-concurrency

0.9.5

Ktor 0.9.5是次要更新,修复了一些错误,增加了一些版本并添加了一些次要内容.

发表2018年9月19日

版本凹凸:

  • Kotlin: 1.2.61 -> 1.2.70

较小的潜在突破性变化:

  • 客户端的CookiesStorage.getCookiesStorage.addCookieHttpCookies.get现在接受requestUrl而不是主机. 现在,get返回一个cookie列表.
  • 制作了HTTP客户端扩展方法HttpRequest.takeFrom(builder: HttpRequestBuilder): HttpRequestBuilder . 现在,还可以从builder设置类型化的调用属性. 成为成员方法. 使用star import *时,不应该是源兼容性问题,因为它在同一软件包中.

Fixes:

  • HttpClient.config没有保留基本配置( #559
  • 修复了路径和查询转义,并使其与URLBuilder#577 )保持一致.
  • 修复了针对非文本内容类型的设置字符集编码

Additions:

  • Introduced CallId feature
  • Added MDC support to CallLogging feature

API改进:

  • HEADOPTIONSPATCHDELETE方法添加了速记客户端功能( #562
  • HTTP客户端:添加了List<Cookie>.get(name: String): Cookie? 捷径.
  • HTTP客户端:向FORM DSL添加了fun FormBuilder.append(key: String, filename: String, block: BytePacketBuilder.() -> Unit) .
  • URLBuilder的解析器得到了改进( #553#567
  • 添加了respondOutputStream { }响应函数
  • Infrastructure阶段分为MonitoringFeatures阶段

Internal:

  • 使AcceptAllCookiesStorage对于所有实现都相同.
  • 改进了客户的cookie匹配和处理

New http method shorcuts for the HTTP client

在0.9.5之前,如果使用HTTP客户端并要发出HEADOPTIONSPATCHDELETE请求,则必须使用HttpClient.requestHttpClient.call .

对于0.9.5,除了HttpClient.getHttpClient.post之外,现在还有四个便捷方法HttpClient.headHttpClient.optionsHttpClient.patchHttpClient.delete HTTP动词.

Split Infrastructure phase into Monitoring and Features phases

在大多数情况下,应该使用" Features阶段而不是" Infrastructure阶段:

intercept(ApplicationCallPipeline.Infrastructure) {
    // ...
}

会成为:

intercept(ApplicationCallPipeline.Features) {
    // ...
}

CallId and MDC support in CallLogging

已更新CallLogging功能,以允许指定MDC(映射的诊断上下文)键+提供程序以与特定的呼叫/请求相关联,而与ThreadScheduler无关. 该功能是使用kotlinx.coroutines ThreadContextElement实现的,因此它是透明的,并且可以与slf4j配合使用.

0.9.5包括一项新的CallId功能,该功能允许从ID识别呼叫. 它允许提供几种用于接收或生成该呼叫标识符的方法,还可以选择将ID包含在响应中,例如作为标头. CallId也与呼叫的MDC关联,因此可以识别特定呼叫的日志并将其分组在一起.

0.9.4

Ktor 0.9.4修复了一些错误,增加了一些版本,移动了几个类,提高了服务器的整体性能. 此版本弃用了某些API,引入了新的API,并包括一个新的多平台HTTP客户端(最初支持JVM,iOS和Android).

除了不推荐使用的API,该版本预计将主要与0.9.3源代码兼容.

https://github.com/ktorio/ktor/compare/0.9.3...0.9.4

2018年8月29日发布

版本凹凸:

  • Kotlin: 1.2.50 -> 1.2.61
  • kotlin-native -> 0.8.2
  • jetty_alpn_boot_version: 8.1.11.v20170118 -> 8.1.12.v20180117
  • coroutines_version: 0.23.3 -> 0.25.0
  • atomic_fu_version: -> 0.11.3
  • kotlinx_io_version: -> 0.1.0-alpha-4

Deprecations:

较小的潜在重大更改:

  • URL构建:更改协议时也设置默认端口
  • 禁止将不安全的标头附加到请求标头
  • 客户端: io.ktor:ktor-client-json工件已重命名为io.ktor:io.ktor:ktor-client-gson (以支持新的JacksonSerializer)
  • 现在,所有与JSON相关的Client客户端( ktor-client-jsonktor-client-gsonktor-client-jackson )工件都需要kotlinx.serialization ,因此需要maven { url "https://kotlin.bintray.com/kotlinx" }回购将包括在内
  • Changed Date to GMTDate in some specific internal places
  • Internal Client HttpRequest, HttpResponse and HttpRequestData changes
  • io.ktor.content移至io.ktor.http.content
  • 顶级encodeURLQueryComponent方法现在是String fun String.encodeURLQueryComponent()的扩展方法.
  • PartData.FileItem现在需要带有Input的lambda,而不是InputStream
  • 现在, PartData具有新元素PartData.BinaryItem ,因此在表达式中使用时可能需要附加分支或else穷举

Fixes:

  • Netty:修复写管道以免过早断开连接. 大型响应未完全通过"连接:关闭"( #534 )发送
  • 修复了CharBufferBuilder问题:标头中包含2048个以上字符的CIO响应会导致IndexOutOfBoundsException#419
  • 使用Netty和HTTP / 2修复推送承诺标头顺序
  • 消除了Netty和HTTP / 2的发送传输编码发送
  • 修复了TestApplicationRequest.setBody二进制数据的编码问题
  • 修复本地泄气机泄漏( #489
  • 修复resourceResource以检查常规文件,以防止以后因文件夹失败( #490
  • 在静态资源解析中修复StringIndexOutOfBoundsException#493
  • 修复:通过-config=<filename>传递配置时,无法解析环境变量( #374
  • 修复流水线中客户端关闭的问题
  • TLS:修复预期通道关闭时的异常
  • 修复Jetty客户端引擎响应取消
  • 压缩:使用预定义的身份编码修复消息
  • 修复HTTP 417状态消息
  • 修复JWT错误处理,用于丢失keyId或令牌破损
  • CIO:修复重复的内容长度标头处理
  • 修复CIO管道以不中断写入管道. 这导致管道被取消,丢失了400个错误的请求响应
  • 修复WriteChannelContent的封闭字节通道错误处理
  • 修复CIO客户加入
  • 修复导致Netty空响应的种族响应字节与问题#350相关的问题
  • 避免在出现错误的情况下关闭ServletOutputStream
  • AsyncContext已完成的AsyncContext错误
  • 在Jetty客户端引擎中处理响应取消
  • 使SessionTransportTransformerEncrypt失败时返回null
  • 修复客户端属性评估

Optimizations:

  • 在Netty中使用无垃圾标头API
  • 避免在Pipeline#merge中进行不必要的分配
  • 在ApplicationEngineEnvironmentReloading中改进最佳功能选择
  • 不要在每个HttpClient实例上扫描类路径,请提供更好的错误消息

现有API的改进:

  • JWK:使用可选发行者添加验证配置
  • 网址和URLBuilder的改进
  • 将TypeInfo设置为数据类( #459 )( #471
  • 测试:添加高级测试异常日志记录

  • Add client form data and multipart support (#500)
  • 为RFC 2518(WebDAV)中定义的状态代码添加HttpStatusCode常量

  • 添加Jetty服务器引擎失败的回调处理程序(http2)
  • Wrap Jetty通道失败进入ChannelIOException
  • 从响应管道使用request和typeInfo包装客户端异常

  • 添加实用程序以附加标头值(例如内容类型)

  • 改善HTTP / 2案例的网络响应管道
  • 从提供的系统设置默认随机算法

新的功能:

  • 新的多平台HTTP客户端:
  • 添加初始webjars功能( #498
  • 添加EngineAPI标记注释
  • JacksonSerializer添加到HTTP客户端
  • 客户端:添加HttpResponse.receive方法
  • 客户端:添加默认请求配置器
  • 客户端:配置或重新配置HttpClient引擎的新方法

内部变更:

  • 内部:更新模块布局

New multiplatform HTTP Client

从Ktor 0.9.4开始,Ktor附带了一个MPP HTTP客户端.

在0.9.4中,为JVM,Android和iOS实现了客户端.

我们在ktor-samples回购中提供了此功能的样本: ktor-samples / client-mpp

您可以在" 多平台HTTP客户端"页面中了解有关此功能的更多信息.

Reconfiguring the HttpClientEngineConfig

在0.9.4之前,您必须通过以下方式配置HttpClient引擎:

HttpClient(MyEngine.config {
    // ... config ...
}) {
    install {
    }
}

从0.9.4开始, HttpClientConfig提供了一种重新配置或配置HttpClientEngineConfigengine方法:

HttpClient(MyEngine) {
    engine {
        // ... config ... 
    }
    install {
    }
}

UnsafeHeaderException

从0.9.4开始,经过一段时间的弃用,Ktor开始完全禁止直接设置contentTypecontentLength标头. 这是因为它们绑定到OutgoingContent实例,该实例是描述响应主体的对象.

respondTextrespondBytes等方法,让你设置Content-Type为可选参数. 并且当使用OutgoingContent任何子类型时,您可以在那里设置contentType .

有关此主题的更多信息,请检查" 生成HTTP响应"页面.

GMTDate

在某些地方(例如Client HttpResponse ),我们使用的是Java的Date类. 现在,我们改为使用GMTDate .

Client HttpRequest, HttpResponse and HttpRequestData changes

以前的HttpRequestData拥有一个attribute方法,可以从另一个方法构建Attributes实例. 现在,它是一个属性. Attributes().apply { data.attributes(this) }将成为data.attributes .

例如,在实现HttpRequest时,此更改会产生影响:

override val attributes: Attributes = Attributes().apply { data.attributes(this) }
// -->
//override val attributes: Attributes = data.attributes

然后HttpResponse将其requestTimeresponseTime从Java的Date更改为io.ktor.util.date.GMTDate .

0.9.3

Ktor 0.9.3修复了一些错误,增加了一些版本,提高了服务器的整体性能,并引入了一些新的API和更改.

除了与kotlinx.coroutines和Ktor Raw套接字相关的高级用例外,该版本预计将主要与0.9.2源代码兼容.

https://github.com/ktorio/ktor/compare/0.9.2...0.9.3

2018年6月26日发布

  • 改进的WebSocket API
  • Websocket标头Sec-WebSocket-Key现在是可选的
  • 修复了客户端cookie呈现以避免x-enc的问题
  • 修复了纯文本客户端阅读器( #392
  • 在CIO TLS中添加了EC支持( #394 :ECDHE_RSA_AES256_SHA384,ECDHE_RSA_AES128_SHA256)
  • 修复客户端证书验证
  • 引入了可选身份验证
  • Added ApplicationCall as receiver for auth validate functions
  • 引入了call.respondBytes( #395
  • 改进的JWT支持:多种方案,可为空的颁发者
  • 转换服务枚举类型诊断得到改善( #403
  • 避免在HTML转义中使用apos实体,因为IE不支持它( #400
  • 转换器对Java大数的支持
  • 能够快速向现有功能添加身份验证方法
  • 改进的auth标头方案和内容验证( #415
  • 现在,BasicAuth的默认字符集为UTF-8( #420
  • 添加了ByteArrayContent.contentLength( #421
  • 修复headersOf不区分大小写的问题( #426
  • 通过使用类型令牌改进了客户端反序列化
  • 能够禁用客户端默认转换器
  • 客户端请求中的明确接受标头
  • 在客户端websocket中打开屏蔽( #423
  • 修复了反向的PartialContent.Configuration.maxRangeCount检查( #440
  • 修复了来自receiveOrNull()的未捕获UnsupportedMediaTypeException( #442
  • 修复多部分边界标头解析
  • 升级的jwks / jwt,如果未指定,则默认应用RSA256( #434#435
  • 将kotlinx.coroutines升级到0.23.3
  • 将Jetty版本升级到9.4.11.v20180605
  • 添加客户端模拟引擎以进行测试
  • HttpClient允许使用默认的可用引擎(如果未提供的话)
  • 将Kotlin升级到1.2.50
  • 将ktor-samples移动到单独的存储库中( #340 ). https://github.com/ktorio/ktor-samples
  • 添加了客户端重定向功能*

Client

WebSocket improvements

现在, webSocketSessionwebSocketRawSession返回DefaultClientWebSocketSessionwebSocketwswss方法也接收DefaultClientWebSocketSession ,其他方法返回ClientWebSocketSession .

这样可以避免强制转换以从客户端会话访问某些属性:

var DefaultWebSocketSession.pingInterval: Duration?
var DefaultWebSocketSession.timeout: Duration
val DefaultWebSocketSession.closeReason: Deferred<CloseReason?>
var DefaultClientWebSocketSession.masking: Boolean

HttpClient MockEngine

我们内部有一个MockEngine可用于我们的测试,以创建HttpClient,该HttpClient能够以编程方式响应我们的代码而无需实际执行任何请求.

现在,我们在io.ktor:ktor-client-mock工件中公开了它.

例如:

val mockEngine = MockEngine { call -> // suspend HttpRequest.(call: HttpClientCall) -> MockHttpResponse
    assertEquals("*/*", headers[HttpHeaders.Accept])

    MockHttpResponse(call, HttpStatusCode.OK, writer(ioCoroutineDispatcher) { channel.writeStringUtf8("HELLO") }.channel, headersOf(
        "X-Custom-Header" to listOf("value")
    ))
}

val client = HttpClient(mockEngine)

MockEngine块中,您可以从请求中声明内容,或决定如何基于请求生成响应.

HttpClient default Engine

现在,您可以仅通过HttpClient()实例化HttpClient,而无需提供引擎. 在这种情况下,它将使用ServiceLoader根据您包含的工件找到合适的实现.

HttpClient HttpRedirect feature

现在,您可以使用新的客户端HttpRedirect功能来遵循基于HTTP Location的重定向. 阅读文档以获取更多信息.

HttpClient bug fixes

现在HttpClient以一种标准的方式发送cookie,一个单独的标头将cookie分隔为; .

使用Httpclient( HttpClient.get<String> )读取一个空字符串为String导致未No transformation found: class io.ktor.client.engine.apache.ApacheHttpResponse -> class kotlin.String异常.

HttpClientEngine changes

HttpClientEngine现在具有一个config字段. 因此,如果您有自定义引擎,则必须提供它.

HttpClient changes

现在,HttpClient发送一个Accept标头. 如果您有测试检查所有标题,则需要更新它们.

Sockets

TLS improvements

Ktor使用CIO实现安全套接字,并且TLS在0.9.3缺少某些密码套件和加密方法之前可用. 我们已经更新了它以支持更多必需的东西.

现在可能会遇到的一些错误可能已修复:

  • Exception in thread "io-thread-1" io.ktor.network.tls.TLSException: Received alert during handshake. Level: FATAL, code: HandshakeFailure
  • Exception in thread "io-thread-2" io.ktor.network.tls.TLSException: Unsupported TLS handshake type CertificateRequest

aSocket breaking change

现在, aSocket需要提供SelectorManager.

例如:

aSocket(ActorSelectorManager(ioCoroutineDispatcher))

当然,您可以重用SelectorManager:

val mySocketSelector = ActorSelectorManager(ioCoroutineDispatcher)
val socket = aSocket(mySocketSelector).tcp()

Server

WebSocket improvements

在0.9.3之前,如果在没有Sec-WebSocket-Key标头的情况下发出WS请求,则会IllegalArgumentException . 现在它是可选的.

Optional Authentication

现在可以定义一组可以提供身份验证的路由,但是它是可选的:

authenticate("method", optional = true) {
    // routes
}
 

验证行为:

  • 未提供身份验证:
    • optional=false :执行挑战
    • optional=true :使用Principal = null执行路由处理程序
  • 凭据错误:未经授权
  • 有效凭证:使用从身份验证方法生成的主体执行路由处理程序

Missing call.respondBytes

在0.9.3之前,我们有call.respondText但是错过了call.respondBytes . 我们已经解决了这个问题.

Version bumps

Ktor现在使用Kotlin 1.2.50kotlinx.coroutines 0.23.3 .

kotlinx.coroutines对于高级用例有一些重大更改 .

generateCertificate

我们已将用于生成自签名证书的generateCertificate函数移至ktor-network-tls工件: compile("io.ktor:ktor-network-tls:$ktor_version")

New ktor-samples repository

在0.9.3之前,我们有几个示例项目直接集成在ktor存储库中. 它们已经成长,我们已经将它们移至自己的存储库: https : //github.com/ktorio/ktor-samples

0.9.2

Ktor 0.9.2修复了一些错误,提高了服务器的整体性能,部分开始支持JVM 9,并引入了一些新的API和更改.

在本节中,我们将讨论如何将现有代码从0.9.1转换为0.9.2.

  • 新的身份验证DSL,更多可挂起的功能(例如验证/验证)
  • 用于对路由解析过程进行自省的RoutingResolveTrace
  • HTTP客户端改进和错误修正(DSL,重新连接,重定向,cookie,websocket等)
  • CIO http客户端流水线支持,分块等等
  • CIO initial TLS support
  • 会话认证提供者
  • OAuth2:引入了生成和验证状态字段的功能
  • OAuth:修正范围参数以符合RFC( #329
  • OAuth2:使用双重范围编码( #370 )修复了错误
  • OAuth2:添加了拦截重定向URL的功能
  • CORS:引入了allowSameOrigin选项
  • 身份验证:提供应用程序调用作为验证功能的接收者( #375及相关功能)
  • 重新编写测试主机,handleRequest读取正文并正确重定向异常
  • Servlet:固定inputStream采集,固定错误处理
  • Java 9 compatibility improved (no modules yet)
  • 摘要身份验证修复( #380
  • 记录正在运行的连接器详细信息,以获得更好的开发体验( #318
  • Last-Modified header and related functionality to work in proper GMT time zone (#344)
  • IncomingContent已弃用
  • URLBuilder修复和改进
  • 文档改进
  • 性能优化(Netty,CIO服务器后端)
  • CIO服务器提高了稳定性
  • 加密的会话支持(SessionTransportTransformerEncrypt)
  • Freemarker( #291 )的空(空)模型
  • ContentNegotiation缺少接受标头支持( #317

Authentication

自0.9.1以来,此版本最大的更改是身份验证. 已重新设计:

在以前的版本中,您必须在应用程序内部或路由块中定义一个authentication块,然后将该身份验证应用于与该块匹配的所有子路由.

这迫使您重新定义几个身份验证提供程序,或者在某些情况下将迫使您将身份验证包括在意外的路由中.

authentication {
    basicAuthentication("ktor") { credentials ->
        if (credentials.password == "${credentials.name}123") UserIdPrincipal(credentials.name) else null
    }
}

在0.9.2中,所有身份验证机制都在应用程序级别定义,并具有与之关联的可选名称. 同样,用于定义不同机制的方法名称也已更改. 现在,身份验证机制的新名称已成为函数调用的一部分,并且其所有旧参数都改为使用DSL定义.

例如,要定义基本身份验证myauth1 ,应将此代码添加到应用程序配置中:

install(Authentication) {
    basic(name = "myauth1") {
        realm = "Ktor Server"
        validate { credentials ->
            if (credentials.password == "${credentials.name}123") UserIdPrincipal(credentials.name) else null
        }
    }
}

现在,您可以创建一个Route节点,以使用authenticate方法将定义的身份验证应用于多个路由:

routing {
    authenticate("myauth1") {
        get("/authenticated/route1") {
            // ...
        }    
        get("/other/route2") {
            // ...
        }    
    }
    get("/") {
        // ...
    }
}

身份验证方法名称更改:

  • basicAuthenticationbasic
  • formAuthenticationform
  • digestAuthenticationdigest
  • jwtAuthenticationjwt
  • oauthAuthenticationoauth

您可以阅读新的身份验证页面以详细了解如何使用新方法.

Test host reworked, handleRequest reads the body and redirects the exceptions correctly

来自TestApplicationRequest构建器的body属性已更改为暂setBody方法:

handleRequest(HttpMethod.Post, "/") {
    addHeader("Accept", "text/plain")
    addHeader("Content-Type", "application/json")
    //body = """{"id":1,"title":"Hello, World!"}"""
    setBody("""{"id":1,"title":"Hello, World!"}""")
}.response.let { response ->
    // ...
}

在0.9.2之前,如果请求没有同步生成响应主体,则awaitCompletion在响应中调用方法awaitCompletion . 在0.9.2中, awaitCompletion方法不存在,它会在返回响应之前自动等待完成.

IncomingContent deprecation

如果您使用的是call.request.receiveContent().readChannel()call.request.receiveContent().multiPartData()call.request.receiveContent().inputStream() ,则应考虑将其更改为call.receive<ByteReadChannel>()call.receive<MultiPartData>()和/或call.receive<InputStream>()因为它已被弃用,并将在以后的Ktor版本中删除.

另外,请记住InputStream是同步API,因此,如果可能,应避免使用它.

WebSockets

为了在客户端支持WebSocket,我们更改了一些传递依赖关系并移动了一些类:现在有一个称为ktor-http-cio的传递依赖关系,其中包括通用的WebSockets代码以及ktor-websockets服务器功能取决于. 但是由于它是传递依赖,因此对您应该透明.

WebSocketSessionFrame类的类已从io.ktor.websocket包移至io.ktor.http.cio.websocket包.

import io.ktor.websocket.*

import io.ktor.http.cio.websocket.*

HttpClient

在构建新的CIO HttpClient时,在配置端点时(它已从endpointConfig重命名为endpoint ,现在该属性是不可变的,因此您必须更改其内容):

在0.9.2之前:

val client = HttpClient(CIO.config { 
    endpointConfig = EndpointConfig().apply {    
    }
})

在0.9.2之后:

val client = HttpClient(CIO.config { 
    endpoint.apply {
        // ...    
    }
})

by  ICOPY.SITE