Skip to content

Commit 8a46647

Browse files
Implementation of #24 (missing functions of CoroutineServerResponse and CoroutineHeadersBuilder).
1 parent 886ffbd commit 8a46647

File tree

1 file changed

+92
-5
lines changed

1 file changed

+92
-5
lines changed

spring-webflux-kotlin-coroutine/src/main/kotlin/org/springframework/web/coroutine/function/server/CoroutineServerResponse.kt

Lines changed: 92 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,39 +20,86 @@ import kotlinx.coroutines.experimental.Unconfined
2020
import kotlinx.coroutines.experimental.channels.ReceiveChannel
2121
import kotlinx.coroutines.experimental.reactive.asPublisher
2222
import kotlinx.coroutines.experimental.reactive.awaitFirst
23+
import org.springframework.http.CacheControl
24+
import org.springframework.http.HttpHeaders
25+
import org.springframework.http.HttpMethod
2326
import org.springframework.kotlin.experimental.coroutine.web.awaitFirstOrNull
2427
import org.springframework.http.HttpStatus
2528
import org.springframework.http.MediaType
29+
import org.springframework.http.ResponseCookie
2630
import org.springframework.http.server.CoroutineServerHttpResponse
2731
import org.springframework.http.server.reactive.ServerHttpResponse
32+
import org.springframework.util.MultiValueMap
2833
import org.springframework.web.coroutine.function.CoroutineBodyInserter
2934
import org.springframework.web.reactive.function.BodyInserter
3035
import org.springframework.web.reactive.function.server.RenderingResponse
3136
import org.springframework.web.reactive.function.server.ServerResponse
3237
import reactor.core.publisher.Mono
3338
import java.net.URI
39+
import java.time.ZonedDateTime
3440

3541
interface CoroutineServerResponse {
3642
fun extractServerResponse(): ServerResponse
3743

3844
companion object {
3945
operator fun invoke(resp: ServerResponse): CoroutineServerResponse = DefaultCoroutineServerResponse(resp)
4046

41-
fun created(location: URI): CoroutineBodyBuilder = CoroutineBodyBuilder(ServerResponse.created(location))
47+
fun accepted(): CoroutineBodyBuilder = ServerResponse.accepted().asCoroutineBodyBuilder()
4248

43-
fun ok(): CoroutineBodyBuilder = status(HttpStatus.OK)
49+
fun badRequest(): CoroutineBodyBuilder = ServerResponse.badRequest().asCoroutineBodyBuilder()
4450

45-
fun permanentRedirect(location: URI): CoroutineBodyBuilder = ServerResponse.permanentRedirect(location).asCoroutineBodyBuilder()
51+
fun created(location: URI): CoroutineBodyBuilder = ServerResponse.created(location).asCoroutineBodyBuilder()
4652

47-
fun seeOther(location: URI): CoroutineBodyBuilder =
48-
ServerResponse.seeOther(location).asCoroutineBodyBuilder()
53+
fun from(other: CoroutineServerResponse): CoroutineBodyBuilder =
54+
ServerResponse.from(other.extractServerResponse()).asCoroutineBodyBuilder()
55+
56+
fun noContent(): CoroutineHeadersBuilder =
57+
(ServerResponse.noContent() as ServerResponse.BodyBuilder).asCoroutineBodyBuilder()
58+
59+
fun notFound(): CoroutineHeadersBuilder =
60+
(ServerResponse.notFound() as ServerResponse.BodyBuilder).asCoroutineBodyBuilder()
61+
62+
fun ok(): CoroutineBodyBuilder = ServerResponse.ok().asCoroutineBodyBuilder()
63+
64+
fun permanentRedirect(location: URI): CoroutineBodyBuilder =
65+
ServerResponse.permanentRedirect(location).asCoroutineBodyBuilder()
66+
67+
fun seeOther(location: URI): CoroutineBodyBuilder = ServerResponse.seeOther(location).asCoroutineBodyBuilder()
68+
69+
fun status(status: Int): CoroutineBodyBuilder = ServerResponse.status(status).asCoroutineBodyBuilder()
4970

5071
fun status(status: HttpStatus): CoroutineBodyBuilder = ServerResponse.status(status).asCoroutineBodyBuilder()
72+
73+
fun temporaryRedirect(location: URI): CoroutineBodyBuilder =
74+
ServerResponse.temporaryRedirect(location).asCoroutineBodyBuilder()
75+
76+
fun unprocessableEntity(): CoroutineBodyBuilder =
77+
ServerResponse.unprocessableEntity().asCoroutineBodyBuilder()
5178
}
5279
}
5380

5481
interface CoroutineHeadersBuilder {
82+
fun allow(vararg allowedMethods: HttpMethod): CoroutineHeadersBuilder
83+
84+
fun allow(allowedMethods: Set<HttpMethod>): CoroutineHeadersBuilder
85+
86+
fun cacheControl(cacheControl: CacheControl): CoroutineHeadersBuilder
87+
88+
fun cookie(cookie: ResponseCookie): CoroutineHeadersBuilder
89+
90+
fun cookies(cookiesConsumer: (MultiValueMap<String, ResponseCookie>) -> Unit): CoroutineHeadersBuilder
91+
92+
fun eTag(eTag: String): CoroutineHeadersBuilder
93+
94+
fun header(headerName: String, vararg headerValues: String): CoroutineHeadersBuilder
95+
96+
fun headers(headersConsumer: (HttpHeaders) -> Unit): CoroutineHeadersBuilder
97+
98+
fun lastModified(lastModified: ZonedDateTime): CoroutineHeadersBuilder
99+
55100
fun location(location: URI): CoroutineHeadersBuilder
101+
102+
fun varyBy(vararg requestHeaders: String): CoroutineHeadersBuilder
56103
}
57104

58105
interface CoroutineBodyBuilder: CoroutineHeadersBuilder {
@@ -82,9 +129,49 @@ internal open class DefaultCoroutineServerResponse(val resp: ServerResponse): Co
82129
}
83130

84131
internal open class DefaultCoroutineHeadersBuilder<T: ServerResponse.HeadersBuilder<T>>(var builder: T): CoroutineHeadersBuilder {
132+
override fun allow(vararg allowedMethods: HttpMethod): CoroutineHeadersBuilder = apply {
133+
builder.allow(*allowedMethods)
134+
}
135+
136+
override fun allow(allowedMethods: Set<HttpMethod>): CoroutineHeadersBuilder = apply {
137+
builder.allow(allowedMethods)
138+
}
139+
140+
override fun cacheControl(cacheControl: CacheControl): CoroutineHeadersBuilder = apply {
141+
builder.cacheControl(cacheControl)
142+
}
143+
144+
override fun cookie(cookie: ResponseCookie): CoroutineHeadersBuilder = apply {
145+
builder.cookie(cookie)
146+
}
147+
148+
override fun cookies(cookiesConsumer: (MultiValueMap<String, ResponseCookie>) -> Unit): CoroutineHeadersBuilder = apply {
149+
builder.cookies(cookiesConsumer)
150+
}
151+
152+
override fun eTag(eTag: String): CoroutineHeadersBuilder = apply {
153+
builder.eTag(eTag)
154+
}
155+
156+
override fun header(headerName: String, vararg headerValues: String): CoroutineHeadersBuilder = apply {
157+
builder.header(headerName, *headerValues)
158+
}
159+
160+
override fun headers(headersConsumer: (HttpHeaders) -> Unit): CoroutineHeadersBuilder = apply {
161+
builder.headers(headersConsumer)
162+
}
163+
164+
override fun lastModified(lastModified: ZonedDateTime): CoroutineHeadersBuilder = apply {
165+
builder.lastModified(lastModified)
166+
}
167+
85168
override fun location(location: URI): CoroutineHeadersBuilder = apply {
86169
builder.location(location)
87170
}
171+
172+
override fun varyBy(vararg requestHeaders: String): CoroutineHeadersBuilder = apply {
173+
builder.varyBy(*requestHeaders)
174+
}
88175
}
89176

90177
internal open class DefaultCoroutineBodyBuilder(builder: ServerResponse.BodyBuilder): DefaultCoroutineHeadersBuilder<ServerResponse.BodyBuilder>(builder), CoroutineBodyBuilder {

0 commit comments

Comments
 (0)