summaryrefslogtreecommitdiffstats
path: root/netwerk/protocol/http/nsIHttpActivityObserver.idl
blob: 1a2cea84ba311ed011f3c1902fe64f16c1f8d05b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "nsISupports.idl"

%{ C++
namespace mozilla {
namespace net {
class HttpActivityArgs;
} // namespace net
} // namespace mozilla
%}

[ref] native HttpActivityArgs(const mozilla::net::HttpActivityArgs);

/**
 * nsIHttpActivityObserver
 *
 * This interface provides a way for http activities to be reported
 * to observers.
 */
[scriptable, uuid(412880C8-6C36-48d8-BF8F-84F91F892503)]
interface nsIHttpActivityObserver : nsISupports
{
    /**
     * observe activity from the http transport
     *
     * @param aHttpChannel
     *        nsISupports interface for the the http channel that
     *        generated this activity
     * @param aActivityType
     *        The value of this aActivityType will be one of
     *          ACTIVITY_TYPE_SOCKET_TRANSPORT or
     *          ACTIVITY_TYPE_HTTP_TRANSACTION
     * @param aActivitySubtype
     *        The value of this aActivitySubtype, will be depend
     *        on the value of aActivityType. When aActivityType
     *        is ACTIVITY_TYPE_SOCKET_TRANSPORT
     *          aActivitySubtype will be one of the
     *          nsISocketTransport::STATUS_???? values defined in
     *          nsISocketTransport.idl
     *        OR when aActivityType
     *        is ACTIVITY_TYPE_HTTP_TRANSACTION
     *          aActivitySubtype will be one of the
     *          nsIHttpActivityObserver::ACTIVITY_SUBTYPE_???? values
     *          defined below
     * @param aTimestamp
     *        microseconds past the epoch of Jan 1, 1970
     * @param aExtraSizeData
     *        Any extra size data optionally available with
     *        this activity
     * @param aExtraStringData
     *        Any extra string data optionally available with
     *        this activity
     */
    [must_use]
    void observeActivity(in nsISupports  aHttpChannel,
                         in uint32_t     aActivityType,
                         in uint32_t     aActivitySubtype,
                         in PRTime       aTimestamp,
                         in uint64_t     aExtraSizeData,
                         in ACString     aExtraStringData);

    /**
     * This attribute is true when this interface is active and should
     * observe http activities. When false, observeActivity() should not
     * be called. It is present for compatibility reasons and should be
     * implemented only by nsHttpActivityDistributor.
     */
    [must_use] readonly attribute boolean isActive;

    /**
     * This function is for internal use only. Every time a http transaction
     * is created in socket process, we use this function to set the value of
     * |isActive|. We need this since the real value of |isActive| is
     * only available in parent process.
     */
    [noscript] void setIsActive(in boolean aActived);

    /**
     * This function is used when the real http channel is not available.
     * We use the information in |HttpActivityArgs| to get the http channel or
     * create a |NullHttpChannel|.
     *
     * @param aArgs
     *        See the definition of |HttpActivityArgs| in PSocketProcess.ipdl.
     */
    [noscript, must_use]
    void observeActivityWithArgs(in HttpActivityArgs aArgs,
                                 in uint32_t aActivityType,
                                 in uint32_t aActivitySubtype,
                                 in PRTime   aTimestamp,
                                 in uint64_t aExtraSizeData,
                                 in ACString aExtraStringData);

    /**
     * This function is for testing only. We use this function to observe the
     * activities of HTTP connections. To receive this notification,
     * observeConnection should be set to true.
     */
    [must_use]
    void observeConnectionActivity(in ACString     aHost,
                                   in int32_t      aPort,
                                   in boolean      aSSL,
                                   in boolean      aHasECH,
                                   in boolean      aIsHttp3,
                                   in uint32_t     aActivityType,
                                   in uint32_t     aActivitySubtype,
                                   in PRTime       aTimestamp,
                                   in ACString     aExtraStringData);

    const unsigned long ACTIVITY_TYPE_SOCKET_TRANSPORT                      = 0x0001;
    const unsigned long ACTIVITY_TYPE_HTTP_TRANSACTION                      = 0x0002;
    const unsigned long ACTIVITY_TYPE_HTTP_CONNECTION                       = 0x0003;

    const unsigned long ACTIVITY_SUBTYPE_REQUEST_HEADER                     = 0x5001;
    const unsigned long ACTIVITY_SUBTYPE_REQUEST_BODY_SENT                  = 0x5002;
    const unsigned long ACTIVITY_SUBTYPE_RESPONSE_START                     = 0x5003;
    const unsigned long ACTIVITY_SUBTYPE_RESPONSE_HEADER                    = 0x5004;
    const unsigned long ACTIVITY_SUBTYPE_RESPONSE_COMPLETE                  = 0x5005;
    const unsigned long ACTIVITY_SUBTYPE_TRANSACTION_CLOSE                  = 0x5006;
    const unsigned long ACTIVITY_SUBTYPE_PROXY_RESPONSE_HEADER              = 0x5007;
    const unsigned long ACTIVITY_SUBTYPE_DNSANDSOCKET_CREATED               = 0x5008;
    const unsigned long ACTIVITY_SUBTYPE_SPECULATIVE_DNSANDSOCKET_CREATED   = 0x5009;
    const unsigned long ACTIVITY_SUBTYPE_ECH_SET                            = 0x500A;
    const unsigned long ACTIVITY_SUBTYPE_CONNECTION_CREATED                 = 0x500B;

    /**
     *  When aActivityType is ACTIVITY_TYPE_SOCKET_TRANSPORT
     *  and aActivitySubtype is STATUS_SENDING_TO
     *  aExtraSizeData will contain the count of bytes sent
     *  There may be more than one of these activities reported
     *  for a single http transaction, each aExtraSizeData
     *  represents only that portion of the total bytes sent
     *
     *  When aActivityType is ACTIVITY_TYPE_HTTP_TRANSACTION
     *  and aActivitySubtype is ACTIVITY_SUBTYPE_REQUEST_HEADER
     *  aExtraStringData will contain the text of the header
     *
     *  When aActivityType is ACTIVITY_TYPE_HTTP_TRANSACTION
     *  and aActivitySubtype is ACTIVITY_SUBTYPE_RESPONSE_HEADER
     *  aExtraStringData will contain the text of the header
     *
     *  When aActivityType is ACTIVITY_TYPE_HTTP_TRANSACTION
     *  and aActivitySubtype is ACTIVITY_SUBTYPE_RESPONSE_COMPLETE
     *  aExtraSizeData will contain the count of total bytes received
     */
};

%{C++

#define NS_HTTP_ACTIVITY_TYPE_SOCKET_TRANSPORT    \
            nsIHttpActivityObserver::ACTIVITY_TYPE_SOCKET_TRANSPORT
#define NS_HTTP_ACTIVITY_TYPE_HTTP_TRANSACTION    \
            nsIHttpActivityObserver::ACTIVITY_TYPE_HTTP_TRANSACTION
#define NS_ACTIVITY_TYPE_HTTP_CONNECTION          \
            nsIHttpActivityObserver::ACTIVITY_TYPE_HTTP_CONNECTION

#define NS_HTTP_ACTIVITY_SUBTYPE_REQUEST_HEADER    \
            nsIHttpActivityObserver::ACTIVITY_SUBTYPE_REQUEST_HEADER
#define NS_HTTP_ACTIVITY_SUBTYPE_REQUEST_BODY_SENT \
            nsIHttpActivityObserver::ACTIVITY_SUBTYPE_REQUEST_BODY_SENT
#define NS_HTTP_ACTIVITY_SUBTYPE_RESPONSE_START    \
            nsIHttpActivityObserver::ACTIVITY_SUBTYPE_RESPONSE_START
#define NS_HTTP_ACTIVITY_SUBTYPE_RESPONSE_HEADER   \
            nsIHttpActivityObserver::ACTIVITY_SUBTYPE_RESPONSE_HEADER
#define NS_HTTP_ACTIVITY_SUBTYPE_RESPONSE_COMPLETE \
            nsIHttpActivityObserver::ACTIVITY_SUBTYPE_RESPONSE_COMPLETE
#define NS_HTTP_ACTIVITY_SUBTYPE_TRANSACTION_CLOSE \
            nsIHttpActivityObserver::ACTIVITY_SUBTYPE_TRANSACTION_CLOSE
#define NS_HTTP_ACTIVITY_SUBTYPE_PROXY_RESPONSE_HEADER \
            nsIHttpActivityObserver::ACTIVITY_SUBTYPE_PROXY_RESPONSE_HEADER
#define NS_HTTP_ACTIVITY_SUBTYPE_DNSANDSOCKET_CREATED \
            nsIHttpActivityObserver::ACTIVITY_SUBTYPE_DNSANDSOCKET_CREATED
#define NS_HTTP_ACTIVITY_SUBTYPE_SPECULATIVE_DNSANDSOCKET_CREATED \
            nsIHttpActivityObserver::ACTIVITY_SUBTYPE_SPECULATIVE_DNSANDSOCKET_CREATED
#define NS_HTTP_ACTIVITY_SUBTYPE_ECH_SET \
            nsIHttpActivityObserver::ACTIVITY_SUBTYPE_ECH_SET
#define NS_HTTP_ACTIVITY_SUBTYPE_CONNECTION_CREATED \
            nsIHttpActivityObserver::ACTIVITY_SUBTYPE_CONNECTION_CREATED
%}

/**
 * nsIHttpActivityDistributor
 *
 * This interface provides a way to register and unregister observers to the
 * http activities.
 */
[scriptable, builtinclass, uuid(7C512CB8-582A-4625-B5B6-8639755271B5)]
interface nsIHttpActivityDistributor : nsIHttpActivityObserver
{
    void addObserver(in nsIHttpActivityObserver aObserver);
    void removeObserver(in nsIHttpActivityObserver aObserver);

    /**
     * C++ friendly getter
     */
    [noscript, notxpcom] boolean Activated();
    [noscript, notxpcom] boolean ObserveProxyResponseEnabled();
    [noscript, notxpcom] boolean ObserveConnectionEnabled();

    /**
     * When true, the ACTIVITY_SUBTYPE_PROXY_RESPONSE_HEADER will be sent to
     * the observers.
     */
    [must_use] attribute boolean observeProxyResponse;

    /**
     * When true, the ACTIVITY_TYPE_HTTP_CONNECTION will be sent to
     * the observers.
     */
    [must_use] attribute boolean observeConnection;
};