159
159
redirectCount: int
160
160
timestamp* : Moment
161
161
duration* : Duration
162
+ headersBuffer: seq [byte ]
162
163
163
164
HttpClientRequestRef* = ref HttpClientRequest
164
165
@@ -859,6 +860,7 @@ proc closeWait*(request: HttpClientRequestRef) {.async: (raises: []).} =
859
860
await noCancel(allFutures(pending))
860
861
request.session = nil
861
862
request.error = nil
863
+ request.headersBuffer.reset()
862
864
request.state = HttpReqRespState.Closed
863
865
untrackCounter(HttpClientRequestTrackerName)
864
866
@@ -992,38 +994,40 @@ proc prepareResponse(
992
994
993
995
proc getResponse(req: HttpClientRequestRef): Future[HttpClientResponseRef] {.
994
996
async: (raises: [CancelledError, HttpError]) .} =
995
- var buffer: array [HttpMaxHeadersSize, byte ]
996
997
let timestamp = Moment.now()
997
998
req.connection.setTimestamp(timestamp)
998
999
let
999
1000
bytesRead =
1000
1001
try :
1001
- await req.connection.reader.readUntil(addr buffer[0 ],
1002
- len(buffer), HeadersMark).wait(
1002
+ await req.connection.reader.readUntil(addr req.headersBuffer[0 ],
1003
+ len(req.headersBuffer),
1004
+ HeadersMark).wait(
1003
1005
req.session.headersTimeout)
1004
1006
except AsyncTimeoutError:
1005
1007
raiseHttpReadError(" Reading response headers timed out" )
1006
1008
except AsyncStreamError as exc:
1007
1009
raiseHttpReadError(
1008
1010
" Could not read response headers, reason: " & $ exc.msg)
1009
1011
1010
- let response = prepareResponse(req, buffer.toOpenArray( 0 , bytesRead - 1 ))
1011
- if response.isErr():
1012
- raiseHttpProtocolError(response.error())
1013
- let res = response.get( )
1014
- res .setTimestamp(timestamp)
1015
- return res
1012
+ let response =
1013
+ prepareResponse(req,
1014
+ req.headersBuffer.toOpenArray( 0 , bytesRead - 1 )).valueOr:
1015
+ raiseHttpProtocolError(error )
1016
+ response .setTimestamp(timestamp)
1017
+ response
1016
1018
1017
1019
proc new* (t: typedesc [HttpClientRequestRef], session: HttpSessionRef,
1018
1020
ha: HttpAddress, meth: HttpMethod = MethodGet,
1019
1021
version: HttpVersion = HttpVersion11,
1020
1022
flags: set [HttpClientRequestFlag] = {},
1023
+ maxResponseHeadersSize: int = HttpMaxHeadersSize,
1021
1024
headers: openArray [HttpHeaderTuple] = [],
1022
1025
body: openArray [byte ] = []) : HttpClientRequestRef =
1023
1026
let res = HttpClientRequestRef(
1024
1027
state: HttpReqRespState.Ready, session: session, meth: meth,
1025
1028
version: version, flags: flags, headers: HttpTable.init(headers),
1026
- address: ha, bodyFlag: HttpClientBodyFlag.Custom, buffer: @ body
1029
+ address: ha, bodyFlag: HttpClientBodyFlag.Custom, buffer: @ body,
1030
+ headersBuffer: newSeq[byte ](max(maxResponseHeadersSize, HttpMaxHeadersSize))
1027
1031
)
1028
1032
trackCounter(HttpClientRequestTrackerName)
1029
1033
res
@@ -1032,62 +1036,74 @@ proc new*(t: typedesc[HttpClientRequestRef], session: HttpSessionRef,
1032
1036
url: string , meth: HttpMethod = MethodGet,
1033
1037
version: HttpVersion = HttpVersion11,
1034
1038
flags: set [HttpClientRequestFlag] = {},
1039
+ maxResponseHeadersSize: int = HttpMaxHeadersSize,
1035
1040
headers: openArray [HttpHeaderTuple] = [],
1036
1041
body: openArray [byte ] = []) : HttpResult[HttpClientRequestRef] =
1037
1042
let address = ? session.getAddress(parseUri(url))
1038
1043
let res = HttpClientRequestRef(
1039
1044
state: HttpReqRespState.Ready, session: session, meth: meth,
1040
1045
version: version, flags: flags, headers: HttpTable.init(headers),
1041
- address: address, bodyFlag: HttpClientBodyFlag.Custom, buffer: @ body
1046
+ address: address, bodyFlag: HttpClientBodyFlag.Custom, buffer: @ body,
1047
+ headersBuffer: newSeq[byte ](max(maxResponseHeadersSize, HttpMaxHeadersSize))
1042
1048
)
1043
1049
trackCounter(HttpClientRequestTrackerName)
1044
1050
ok(res)
1045
1051
1046
1052
proc get* (t: typedesc [HttpClientRequestRef], session: HttpSessionRef,
1047
1053
url: string , version: HttpVersion = HttpVersion11,
1048
1054
flags: set [HttpClientRequestFlag] = {},
1055
+ maxResponseHeadersSize: int = HttpMaxHeadersSize,
1049
1056
headers: openArray [HttpHeaderTuple] = []
1050
1057
) : HttpResult[HttpClientRequestRef] =
1051
- HttpClientRequestRef.new(session, url, MethodGet, version, flags, headers)
1058
+ HttpClientRequestRef.new(session, url, MethodGet, version, flags,
1059
+ maxResponseHeadersSize, headers)
1052
1060
1053
1061
proc get* (t: typedesc [HttpClientRequestRef], session: HttpSessionRef,
1054
1062
ha: HttpAddress, version: HttpVersion = HttpVersion11,
1055
1063
flags: set [HttpClientRequestFlag] = {},
1064
+ maxResponseHeadersSize: int = HttpMaxHeadersSize,
1056
1065
headers: openArray [HttpHeaderTuple] = []
1057
1066
) : HttpClientRequestRef =
1058
- HttpClientRequestRef.new(session, ha, MethodGet, version, flags, headers)
1067
+ HttpClientRequestRef.new(session, ha, MethodGet, version, flags,
1068
+ maxResponseHeadersSize, headers)
1059
1069
1060
1070
proc post* (t: typedesc [HttpClientRequestRef], session: HttpSessionRef,
1061
1071
url: string , version: HttpVersion = HttpVersion11,
1062
1072
flags: set [HttpClientRequestFlag] = {},
1073
+ maxResponseHeadersSize: int = HttpMaxHeadersSize,
1063
1074
headers: openArray [HttpHeaderTuple] = [],
1064
1075
body: openArray [byte ] = []
1065
1076
) : HttpResult[HttpClientRequestRef] =
1066
- HttpClientRequestRef.new(session, url, MethodPost, version, flags, headers,
1067
- body)
1077
+ HttpClientRequestRef.new(session, url, MethodPost, version, flags,
1078
+ maxResponseHeadersSize, headers, body)
1068
1079
1069
1080
proc post* (t: typedesc [HttpClientRequestRef], session: HttpSessionRef,
1070
1081
url: string , version: HttpVersion = HttpVersion11,
1071
1082
flags: set [HttpClientRequestFlag] = {},
1083
+ maxResponseHeadersSize: int = HttpMaxHeadersSize,
1072
1084
headers: openArray [HttpHeaderTuple] = [],
1073
1085
body: openArray [char ] = []) : HttpResult[HttpClientRequestRef] =
1074
- HttpClientRequestRef.new(session, url, MethodPost, version, flags, headers,
1086
+ HttpClientRequestRef.new(session, url, MethodPost, version, flags,
1087
+ maxResponseHeadersSize, headers,
1075
1088
body.toOpenArrayByte(0 , len(body) - 1 ))
1076
1089
1077
1090
proc post* (t: typedesc [HttpClientRequestRef], session: HttpSessionRef,
1078
1091
ha: HttpAddress, version: HttpVersion = HttpVersion11,
1079
1092
flags: set [HttpClientRequestFlag] = {},
1093
+ maxResponseHeadersSize: int = HttpMaxHeadersSize,
1080
1094
headers: openArray [HttpHeaderTuple] = [],
1081
1095
body: openArray [byte ] = []) : HttpClientRequestRef =
1082
- HttpClientRequestRef.new(session, ha, MethodPost, version, flags, headers,
1083
- body)
1096
+ HttpClientRequestRef.new(session, ha, MethodPost, version, flags,
1097
+ maxResponseHeadersSize, headers, body)
1084
1098
1085
1099
proc post* (t: typedesc [HttpClientRequestRef], session: HttpSessionRef,
1086
1100
ha: HttpAddress, version: HttpVersion = HttpVersion11,
1087
1101
flags: set [HttpClientRequestFlag] = {},
1102
+ maxResponseHeadersSize: int = HttpMaxHeadersSize,
1088
1103
headers: openArray [HttpHeaderTuple] = [],
1089
1104
body: openArray [char ] = []) : HttpClientRequestRef =
1090
- HttpClientRequestRef.new(session, ha, MethodPost, version, flags, headers,
1105
+ HttpClientRequestRef.new(session, ha, MethodPost, version, flags,
1106
+ maxResponseHeadersSize, headers,
1091
1107
body.toOpenArrayByte(0 , len(body) - 1 ))
1092
1108
1093
1109
proc prepareRequest(request: HttpClientRequestRef): string =
@@ -1454,8 +1470,10 @@ proc redirect*(request: HttpClientRequestRef,
1454
1470
var res = request.headers
1455
1471
res.set (HostHeader, ha.hostname)
1456
1472
res
1457
- var res = HttpClientRequestRef.new(request.session, ha, request.meth,
1458
- request.version, request.flags, headers.toList(), request.buffer)
1473
+ var res =
1474
+ HttpClientRequestRef.new(request.session, ha, request.meth,
1475
+ request.version, request.flags, headers = headers.toList(),
1476
+ body = request.buffer)
1459
1477
res.redirectCount = redirectCount
1460
1478
ok(res)
1461
1479
@@ -1478,8 +1496,10 @@ proc redirect*(request: HttpClientRequestRef,
1478
1496
var res = request.headers
1479
1497
res.set (HostHeader, address.hostname)
1480
1498
res
1481
- var res = HttpClientRequestRef.new(request.session, address, request.meth,
1482
- request.version, request.flags, headers.toList(), request.buffer)
1499
+ var res =
1500
+ HttpClientRequestRef.new(request.session, address, request.meth,
1501
+ request.version, request.flags, headers = headers.toList(),
1502
+ body = request.buffer)
1483
1503
res.redirectCount = redirectCount
1484
1504
ok(res)
1485
1505
0 commit comments