@@ -20,39 +20,86 @@ import kotlinx.coroutines.experimental.Unconfined
20
20
import kotlinx.coroutines.experimental.channels.ReceiveChannel
21
21
import kotlinx.coroutines.experimental.reactive.asPublisher
22
22
import kotlinx.coroutines.experimental.reactive.awaitFirst
23
+ import org.springframework.http.CacheControl
24
+ import org.springframework.http.HttpHeaders
25
+ import org.springframework.http.HttpMethod
23
26
import org.springframework.kotlin.experimental.coroutine.web.awaitFirstOrNull
24
27
import org.springframework.http.HttpStatus
25
28
import org.springframework.http.MediaType
29
+ import org.springframework.http.ResponseCookie
26
30
import org.springframework.http.server.CoroutineServerHttpResponse
27
31
import org.springframework.http.server.reactive.ServerHttpResponse
32
+ import org.springframework.util.MultiValueMap
28
33
import org.springframework.web.coroutine.function.CoroutineBodyInserter
29
34
import org.springframework.web.reactive.function.BodyInserter
30
35
import org.springframework.web.reactive.function.server.RenderingResponse
31
36
import org.springframework.web.reactive.function.server.ServerResponse
32
37
import reactor.core.publisher.Mono
33
38
import java.net.URI
39
+ import java.time.ZonedDateTime
34
40
35
41
interface CoroutineServerResponse {
36
42
fun extractServerResponse (): ServerResponse
37
43
38
44
companion object {
39
45
operator fun invoke (resp : ServerResponse ): CoroutineServerResponse = DefaultCoroutineServerResponse (resp)
40
46
41
- fun created ( location : URI ): CoroutineBodyBuilder = CoroutineBodyBuilder ( ServerResponse .created(location) )
47
+ fun accepted ( ): CoroutineBodyBuilder = ServerResponse .accepted().asCoroutineBodyBuilder( )
42
48
43
- fun ok (): CoroutineBodyBuilder = status( HttpStatus . OK )
49
+ fun badRequest (): CoroutineBodyBuilder = ServerResponse .badRequest().asCoroutineBodyBuilder( )
44
50
45
- fun permanentRedirect (location : URI ): CoroutineBodyBuilder = ServerResponse .permanentRedirect (location).asCoroutineBodyBuilder()
51
+ fun created (location : URI ): CoroutineBodyBuilder = ServerResponse .created (location).asCoroutineBodyBuilder()
46
52
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()
49
70
50
71
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()
51
78
}
52
79
}
53
80
54
81
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
+
55
100
fun location (location : URI ): CoroutineHeadersBuilder
101
+
102
+ fun varyBy (vararg requestHeaders : String ): CoroutineHeadersBuilder
56
103
}
57
104
58
105
interface CoroutineBodyBuilder : CoroutineHeadersBuilder {
@@ -82,9 +129,49 @@ internal open class DefaultCoroutineServerResponse(val resp: ServerResponse): Co
82
129
}
83
130
84
131
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
+
85
168
override fun location (location : URI ): CoroutineHeadersBuilder = apply {
86
169
builder.location(location)
87
170
}
171
+
172
+ override fun varyBy (vararg requestHeaders : String ): CoroutineHeadersBuilder = apply {
173
+ builder.varyBy(* requestHeaders)
174
+ }
88
175
}
89
176
90
177
internal open class DefaultCoroutineBodyBuilder (builder : ServerResponse .BodyBuilder ): DefaultCoroutineHeadersBuilder<ServerResponse.BodyBuilder>(builder), CoroutineBodyBuilder {
0 commit comments