QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
NTRIPHttpCodec.h
Go to the documentation of this file.
1#pragma once
2
3#include <optional>
4
5#include <QtCore/QByteArray>
6#include <QtCore/QByteArrayView>
7#include <QtCore/QDateTime>
8#include <QtCore/QString>
9#include <QtNetwork/QHttpHeaders>
10
11#include "NTRIPError.h"
12
14
16{
19};
20
22{
23 QByteArray bytes;
24 QString error;
25
26 [[nodiscard]] static NTRIPHttpRequest build(const NTRIPConnectionConfig& config,
28};
29
32{
33public:
35 : _purpose(purpose)
36 {}
37
38 static constexpr qsizetype MAX_HEADER_BYTES = 32768;
39 static constexpr qsizetype MAX_LINE_BYTES = 8192;
40 static constexpr quint64 MAX_CHUNK_BYTES = 16 * 1024 * 1024;
41 static constexpr qsizetype MAX_ERROR_BODY_BYTES = 500;
42 static constexpr qsizetype MAX_ERROR_PREVIEW_CHARS = 200;
43
44 struct [[nodiscard]] Status
45 {
46 int code = 0;
47 QString reason;
48 bool valid = false;
49 };
50
51 struct [[nodiscard]] Result
52 {
53 QByteArray body;
54 bool connected = false;
55 bool complete = false;
56 std::optional<NTRIPFailure> failure;
57 };
58
59 void reset();
60 Result feed(QByteArrayView bytes, const QDateTime& utcNow);
61 Result finish();
62
63 bool awaitingErrorBody() const { return _pendingFailure.has_value(); }
64
65 static Status parseStatusLine(QByteArrayView line);
66
67private:
68 enum class State
69 {
70 Status,
71 Headers,
72 IcyHeaders,
73 Identity,
74 ChunkSize,
75 ChunkData,
76 ChunkEnd,
77 Trailers,
78 Complete,
79 Failed
80 };
81
82 void _lineReceived(Result& result, const QDateTime& utcNow);
83 void _beginBody(Result& result);
84 void _beginIcyBody(Result& result);
85 void _finishError(Result& result);
86 void _fail(Result& result, const QString& detail, NTRIPError code = NTRIPError::InvalidHttpResponse);
87
88 QHttpHeaders _headers;
89 NTRIPHttpPurpose _purpose;
90 State _state = State::Status;
91 QByteArray _line;
92 Status _status;
93 qsizetype _headerBytes = 0;
94 quint64 _remaining = 0;
95 int _chunkEndBytes = 0;
96 int _informationalResponses = 0;
97 bool _http10 = false;
98 bool _chunked = false;
99 std::optional<quint64> _contentLength;
100 std::optional<NTRIPFailure> _pendingFailure;
101 QByteArray _errorBody;
102};
Config config
NTRIPHttpPurpose
Private transport parser; buffers framing, never correction payloads.
static constexpr quint64 MAX_CHUNK_BYTES
static constexpr qsizetype MAX_ERROR_PREVIEW_CHARS
bool awaitingErrorBody() const
Result feed(QByteArrayView bytes, const QDateTime &utcNow)
static constexpr qsizetype MAX_ERROR_BODY_BYTES
static constexpr qsizetype MAX_LINE_BYTES
static constexpr qsizetype MAX_HEADER_BYTES
static Status parseStatusLine(QByteArrayView line)
NTRIPHttpDecoder(NTRIPHttpPurpose purpose=NTRIPHttpPurpose::Corrections)
QByteArray body
Retains valid prefixes when subsequent framing fails.
std::optional< NTRIPFailure > failure
static NTRIPHttpRequest build(const NTRIPConnectionConfig &config, NTRIPHttpPurpose purpose=NTRIPHttpPurpose::Corrections)