| 331 | } |
| 332 | |
| 333 | int ProtocolHttp2::parseData(ProtoRequestHttp2 *request, QIODevice *io, const H2Frame &fr) const |
| 334 | { |
| 335 | // qCDebug(C_SERVER_H2) << "Consuming DATA" << fr.len; |
| 336 | if (fr.streamId == 0) { |
| 337 | return sendGoAway(io, request->maxStreamId, ErrorProtocolError); |
| 338 | } |
| 339 | |
| 340 | quint8 padLength = 0; |
| 341 | if (fr.flags & FlagDataPadded) { |
| 342 | padLength = quint8(*(request->buffer + 9)); |
| 343 | if (padLength >= fr.len) { |
| 344 | return sendGoAway(io, request->maxStreamId, ErrorProtocolError); |
| 345 | } |
| 346 | } |
| 347 | |
| 348 | H2Stream *stream; |
| 349 | auto streamIt = request->streams.constFind(fr.streamId); |
| 350 | if (streamIt != request->streams.constEnd()) { |
| 351 | stream = streamIt.value(); |
| 352 | |
| 353 | if (stream->state == H2Stream::Idle) { |
| 354 | return sendGoAway(io, request->maxStreamId, ErrorProtocolError); |
| 355 | } else if (stream->state == H2Stream::HalfClosed || stream->state == H2Stream::Closed) { |
| 356 | return sendGoAway(io, request->maxStreamId, ErrorStreamClosed); |
| 357 | } |
| 358 | } else { |
| 359 | return sendGoAway(io, request->maxStreamId, ErrorStreamClosed); |
| 360 | } |
| 361 | |
| 362 | // qCDebug(C_SERVER_H2) << "Frame data" << padLength << "state" << stream->state << |
| 363 | // "content-length" << stream->contentLength; |
| 364 | |
| 365 | if (!stream->body) { |
| 366 | stream->body = createBody(request->contentLength); |
| 367 | if (!stream->body) { |
| 368 | // Failed to create body to store data |
| 369 | return sendGoAway(io, request->maxStreamId, ErrorInternalError); |
| 370 | } |
| 371 | } |
| 372 | stream->body->write(request->buffer + 9, fr.len - padLength); |
| 373 | |
| 374 | stream->consumedData += fr.len - padLength; |
| 375 | if (stream->contentLength != -1 && |
| 376 | ((fr.flags & FlagDataEndStream && stream->contentLength != stream->consumedData) || |
| 377 | (stream->contentLength > stream->consumedData))) { |
| 378 | return sendGoAway(io, request->maxStreamId, ErrorProtocolError); |
| 379 | } |
| 380 | |
| 381 | if (fr.flags & FlagDataEndStream) { |
| 382 | queueStream(request->sock, stream); |
| 383 | } |
| 384 | |
| 385 | return ErrorNoError; |
| 386 | } |
| 387 | |
| 388 | int ProtocolHttp2::parseHeaders(ProtoRequestHttp2 *request, QIODevice *io, const H2Frame &fr) const |
| 389 | { |
nothing calls this directly
no test coverage detected