File tree Expand file tree Collapse file tree 4 files changed +45
-35
lines changed
library/src/main/kotlin/com/connectrpc Expand file tree Collapse file tree 4 files changed +45
-35
lines changed Original file line number Diff line number Diff line change @@ -37,15 +37,15 @@ interface CompressionPool {
37
37
38
38
/* *
39
39
* Compress an outbound request message.
40
- * @param buffer : The uncompressed request message.
40
+ * @param input : The uncompressed request message.
41
41
* @return The compressed request message.
42
42
*/
43
- fun compress (buffer : Buffer ): Buffer
43
+ fun compress (input : Buffer ): Buffer
44
44
45
45
/* *
46
46
* Decompress an inbound response message.
47
- * @param buffer : The compressed response message.
47
+ * @param input : The compressed response message.
48
48
* @return The uncompressed response message.
49
49
*/
50
- fun decompress (buffer : Buffer ): Buffer
50
+ fun decompress (input : Buffer ): Buffer
51
51
}
Original file line number Diff line number Diff line change @@ -28,20 +28,23 @@ object GzipCompressionPool : CompressionPool {
28
28
return " gzip"
29
29
}
30
30
31
- override fun compress (buffer : Buffer ): Buffer {
32
- val gzippedSink = Buffer ()
33
- GzipSink (gzippedSink ).use { source ->
34
- source .write(buffer, buffer .size)
31
+ override fun compress (input : Buffer ): Buffer {
32
+ val result = Buffer ()
33
+ GzipSink (result ).use { gzippedSink ->
34
+ gzippedSink .write(input, input .size)
35
35
}
36
- return gzippedSink
36
+ return result
37
37
}
38
38
39
- override fun decompress (buffer : Buffer ): Buffer {
39
+ override fun decompress (input : Buffer ): Buffer {
40
40
val result = Buffer ()
41
- if (buffer.size == 0L ) return result
41
+ // We're lenient and will allow an empty payload to be
42
+ // interpreted as a compressed empty payload (even though
43
+ // it's missing the gzip format preamble/metadata).
44
+ if (input.size == 0L ) return result
42
45
43
- GzipSource (buffer ).use {
44
- while (it .read(result, Int .MAX_VALUE .toLong()) != - 1L ) {
46
+ GzipSource (input ).use { gzippedSource ->
47
+ while (gzippedSource .read(result, Int .MAX_VALUE .toLong()) != - 1L ) {
45
48
// continue reading.
46
49
}
47
50
}
Original file line number Diff line number Diff line change @@ -30,26 +30,23 @@ class Envelope {
30
30
* @param compressionMinBytes The minimum bytes the source needs to be in order to be compressed.
31
31
*/
32
32
fun pack (source : Buffer , compressionPool : CompressionPool ? = null, compressionMinBytes : Int? = null): Buffer {
33
+ val flags: Int
34
+ val payload: Buffer
33
35
if (compressionMinBytes == null ||
34
36
source.size < compressionMinBytes ||
35
37
compressionPool == null
36
38
) {
37
- return source.use {
38
- val result = Buffer ()
39
- result.writeByte(0 )
40
- result.writeInt(source.buffer.size.toInt())
41
- result.writeAll(source)
42
- result
43
- }
44
- }
45
- return source.use { buffer ->
46
- val result = Buffer ()
47
- result.writeByte(1 )
48
- val compressedBuffer = compressionPool.compress(buffer)
49
- result.writeInt(compressedBuffer.size.toInt())
50
- result.writeAll(compressedBuffer)
51
- result
39
+ flags = 0
40
+ payload = source
41
+ } else {
42
+ flags = 1
43
+ payload = compressionPool.compress(source)
52
44
}
45
+ val result = Buffer ()
46
+ result.writeByte(flags)
47
+ result.writeInt(payload.buffer.size.toInt())
48
+ result.writeAll(payload)
49
+ return result
53
50
}
54
51
55
52
/* *
Original file line number Diff line number Diff line change @@ -157,19 +157,29 @@ internal class GRPCInterceptor(
157
157
onCompletion = { result ->
158
158
val trailers = result.trailers
159
159
val completion = completionParser.parse(emptyMap(), trailers)
160
+ if (completion == null && result.cause != null ) {
161
+ // let error result propagate
162
+ return @fold result
163
+ }
164
+ val exception: ConnectException ?
160
165
if (completion != null ) {
161
- val exception = completion.toConnectExceptionOrNull(
166
+ exception = completion.toConnectExceptionOrNull(
162
167
serializationStrategy,
163
168
result.cause,
164
169
)
165
- StreamResult .Complete (
166
- code = exception?.code ? : Code .OK ,
167
- cause = exception,
168
- trailers = trailers,
169
- )
170
170
} else {
171
- result
171
+ exception = ConnectException (
172
+ code = Code .INTERNAL_ERROR ,
173
+ errorDetailParser = serializationStrategy.errorDetailParser(),
174
+ message = " protocol error: status is missing from trailers" ,
175
+ metadata = trailers,
176
+ )
172
177
}
178
+ StreamResult .Complete (
179
+ code = exception?.code ? : Code .OK ,
180
+ cause = exception,
181
+ trailers = trailers,
182
+ )
173
183
},
174
184
)
175
185
},
You can’t perform that action at this time.
0 commit comments