|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 #include "nsISupports.idl" |
|
6 |
|
7 interface nsIInputStream; |
|
8 interface nsIFile; |
|
9 interface nsIOutputStream; |
|
10 interface nsISimpleEnumerator; |
|
11 |
|
12 interface nsIHttpServer; |
|
13 interface nsIHttpServerStoppedCallback; |
|
14 interface nsIHttpRequestHandler; |
|
15 interface nsIHttpRequest; |
|
16 interface nsIHttpResponse; |
|
17 interface nsIHttpServerIdentity; |
|
18 |
|
19 /** |
|
20 * An interface which represents an HTTP server. |
|
21 */ |
|
22 [scriptable, uuid(cea8812e-faa6-4013-9396-f9936cbb74ec)] |
|
23 interface nsIHttpServer : nsISupports |
|
24 { |
|
25 /** |
|
26 * Starts up this server, listening upon the given port. |
|
27 * |
|
28 * @param port |
|
29 * the port upon which listening should happen, or -1 if no specific port is |
|
30 * desired |
|
31 * @throws NS_ERROR_ALREADY_INITIALIZED |
|
32 * if this server is already started |
|
33 * @throws NS_ERROR_NOT_AVAILABLE |
|
34 * if the server is not started and cannot be started on the desired port |
|
35 * (perhaps because the port is already in use or because the process does |
|
36 * not have privileges to do so) |
|
37 * @note |
|
38 * Behavior is undefined if this method is called after stop() has been |
|
39 * called on this but before the provided callback function has been |
|
40 * called. |
|
41 */ |
|
42 void start(in long port); |
|
43 |
|
44 /** |
|
45 * Shuts down this server if it is running (including the period of time after |
|
46 * stop() has been called but before the provided callback has been called). |
|
47 * |
|
48 * @param callback |
|
49 * an asynchronous callback used to notify the user when this server is |
|
50 * stopped and all pending requests have been fully served |
|
51 * @throws NS_ERROR_NULL_POINTER |
|
52 * if callback is null |
|
53 * @throws NS_ERROR_UNEXPECTED |
|
54 * if this server is not running |
|
55 */ |
|
56 void stop(in nsIHttpServerStoppedCallback callback); |
|
57 |
|
58 /** |
|
59 * Associates the local file represented by the string file with all requests |
|
60 * which match request. |
|
61 * |
|
62 * @param path |
|
63 * the path which is to be mapped to the given file; must begin with "/" and |
|
64 * be a valid URI path (i.e., no query string, hash reference, etc.) |
|
65 * @param file |
|
66 * the file to serve for the given path, or null to remove any mapping that |
|
67 * might exist; this file must exist for the lifetime of the server |
|
68 */ |
|
69 void registerFile(in string path, in nsIFile file); |
|
70 |
|
71 /** |
|
72 * Registers a custom path handler. |
|
73 * |
|
74 * @param path |
|
75 * the path on the server (beginning with a "/") which is to be handled by |
|
76 * handler; this path must not include a query string or hash component; it |
|
77 * also should usually be canonicalized, since most browsers will do so |
|
78 * before sending otherwise-matching requests |
|
79 * @param handler |
|
80 * an object which will handle any requests for the given path, or null to |
|
81 * remove any existing handler; if while the server is running the handler |
|
82 * throws an exception while responding to a request, an HTTP 500 response |
|
83 * will be returned |
|
84 * @throws NS_ERROR_INVALID_ARG |
|
85 * if path does not begin with a "/" |
|
86 */ |
|
87 void registerPathHandler(in string path, in nsIHttpRequestHandler handler); |
|
88 |
|
89 /** |
|
90 * Registers a custom prefix handler. |
|
91 * |
|
92 * @param prefix |
|
93 * the path on the server (beginning and ending with "/") which is to be |
|
94 * handled by handler; this path must not include a query string or hash |
|
95 * component. All requests that start with this prefix will be directed to |
|
96 * the given handler. |
|
97 * @param handler |
|
98 * an object which will handle any requests for the given path, or null to |
|
99 * remove any existing handler; if while the server is running the handler |
|
100 * throws an exception while responding to a request, an HTTP 500 response |
|
101 * will be returned |
|
102 * @throws NS_ERROR_INVALID_ARG |
|
103 * if path does not begin with a "/" or does not end with a "/" |
|
104 */ |
|
105 void registerPrefixHandler(in string prefix, in nsIHttpRequestHandler handler); |
|
106 |
|
107 /** |
|
108 * Registers a custom error page handler. |
|
109 * |
|
110 * @param code |
|
111 * the error code which is to be handled by handler |
|
112 * @param handler |
|
113 * an object which will handle any requests which generate the given status |
|
114 * code, or null to remove any existing handler. If the handler throws an |
|
115 * exception during server operation, fallback is to the genericized error |
|
116 * handler (the x00 version), then to 500, using a user-defined error |
|
117 * handler if one exists or the server default handler otherwise. Fallback |
|
118 * will never occur from a user-provided handler that throws to the same |
|
119 * handler as provided by the server, e.g. a throwing user 404 falls back to |
|
120 * 400, not a server-provided 404 that might not throw. |
|
121 * @note |
|
122 * If the error handler handles HTTP 500 and throws, behavior is undefined. |
|
123 */ |
|
124 void registerErrorHandler(in unsigned long code, in nsIHttpRequestHandler handler); |
|
125 |
|
126 /** |
|
127 * Maps all requests to paths beneath path to the corresponding file beneath |
|
128 * dir. |
|
129 * |
|
130 * @param path |
|
131 * the absolute path on the server against which requests will be served |
|
132 * from dir (e.g., "/", "/foo/", etc.); must begin and end with a forward |
|
133 * slash |
|
134 * @param dir |
|
135 * the directory to be used to serve all requests for paths underneath path |
|
136 * (except those further overridden by another, deeper path registered with |
|
137 * another directory); if null, any current mapping for the given path is |
|
138 * removed |
|
139 * @throws NS_ERROR_INVALID_ARG |
|
140 * if dir is non-null and does not exist or is not a directory, or if path |
|
141 * does not begin with and end with a forward slash |
|
142 */ |
|
143 void registerDirectory(in string path, in nsIFile dir); |
|
144 |
|
145 /** |
|
146 * Associates files with the given extension with the given Content-Type when |
|
147 * served by this server, in the absence of any file-specific information |
|
148 * about the desired Content-Type. If type is empty, removes any extant |
|
149 * mapping, if one is present. |
|
150 * |
|
151 * @throws NS_ERROR_INVALID_ARG |
|
152 * if the given type is not a valid header field value, i.e. if it doesn't |
|
153 * match the field-value production in RFC 2616 |
|
154 * @note |
|
155 * No syntax checking is done of the given type, beyond ensuring that it is |
|
156 * a valid header field value. Behavior when not given a string matching |
|
157 * the media-type production in RFC 2616 section 3.7 is undefined. |
|
158 * Implementations may choose to define specific behavior for types which do |
|
159 * not match the production, such as for CGI functionality. |
|
160 * @note |
|
161 * Implementations MAY treat type as a trusted argument; users who fail to |
|
162 * generate this string from trusted data risk security vulnerabilities. |
|
163 */ |
|
164 void registerContentType(in string extension, in string type); |
|
165 |
|
166 /** |
|
167 * Sets the handler used to display the contents of a directory if |
|
168 * the directory contains no index page. |
|
169 * |
|
170 * @param handler |
|
171 * an object which will handle any requests for directories which |
|
172 * do not contain index pages, or null to reset to the default |
|
173 * index handler; if while the server is running the handler |
|
174 * throws an exception while responding to a request, an HTTP 500 |
|
175 * response will be returned. An nsIFile corresponding to the |
|
176 * directory is available from the metadata object passed to the |
|
177 * handler, under the key "directory". |
|
178 */ |
|
179 void setIndexHandler(in nsIHttpRequestHandler handler); |
|
180 |
|
181 /** Represents the locations at which this server is reachable. */ |
|
182 readonly attribute nsIHttpServerIdentity identity; |
|
183 |
|
184 /** |
|
185 * Retrieves the string associated with the given key in this, for the given |
|
186 * path's saved state. All keys are initially associated with the empty |
|
187 * string. |
|
188 */ |
|
189 AString getState(in AString path, in AString key); |
|
190 |
|
191 /** |
|
192 * Sets the string associated with the given key in this, for the given path's |
|
193 * saved state. |
|
194 */ |
|
195 void setState(in AString path, in AString key, in AString value); |
|
196 |
|
197 /** |
|
198 * Retrieves the string associated with the given key in this, in |
|
199 * entire-server saved state. All keys are initially associated with the |
|
200 * empty string. |
|
201 */ |
|
202 AString getSharedState(in AString key); |
|
203 |
|
204 /** |
|
205 * Sets the string associated with the given key in this, in entire-server |
|
206 * saved state. |
|
207 */ |
|
208 void setSharedState(in AString key, in AString value); |
|
209 |
|
210 /** |
|
211 * Retrieves the object associated with the given key in this in |
|
212 * object-valued saved state. All keys are initially associated with null. |
|
213 */ |
|
214 nsISupports getObjectState(in AString key); |
|
215 |
|
216 /** |
|
217 * Sets the object associated with the given key in this in object-valued |
|
218 * saved state. The value may be null. |
|
219 */ |
|
220 void setObjectState(in AString key, in nsISupports value); |
|
221 }; |
|
222 |
|
223 /** |
|
224 * An interface through which a notification of the complete stopping (socket |
|
225 * closure, in-flight requests all fully served and responded to) of an HTTP |
|
226 * server may be received. |
|
227 */ |
|
228 [scriptable, function, uuid(925a6d33-9937-4c63-abe1-a1c56a986455)] |
|
229 interface nsIHttpServerStoppedCallback : nsISupports |
|
230 { |
|
231 /** Called when the corresponding server has been fully stopped. */ |
|
232 void onStopped(); |
|
233 }; |
|
234 |
|
235 /** |
|
236 * Represents a set of names for a server, one of which is the primary name for |
|
237 * the server and the rest of which are secondary. By default every server will |
|
238 * contain ("http", "localhost", port) and ("http", "127.0.0.1", port) as names, |
|
239 * where port is what was provided to the corresponding server when started; |
|
240 * however, except for their being removed when the corresponding server stops |
|
241 * they have no special importance. |
|
242 */ |
|
243 [scriptable, uuid(a89de175-ae8e-4c46-91a5-0dba99bbd284)] |
|
244 interface nsIHttpServerIdentity : nsISupports |
|
245 { |
|
246 /** |
|
247 * The primary scheme at which the corresponding server is located, defaulting |
|
248 * to 'http'. This name will be the value of nsIHttpRequest.scheme for |
|
249 * HTTP/1.0 requests. |
|
250 * |
|
251 * This value is always set when the corresponding server is running. If the |
|
252 * server is not running, this value is set only if it has been set to a |
|
253 * non-default name using setPrimary. In this case reading this value will |
|
254 * throw NS_ERROR_NOT_INITIALIZED. |
|
255 */ |
|
256 readonly attribute string primaryScheme; |
|
257 |
|
258 /** |
|
259 * The primary name by which the corresponding server is known, defaulting to |
|
260 * 'localhost'. This name will be the value of nsIHttpRequest.host for |
|
261 * HTTP/1.0 requests. |
|
262 * |
|
263 * This value is always set when the corresponding server is running. If the |
|
264 * server is not running, this value is set only if it has been set to a |
|
265 * non-default name using setPrimary. In this case reading this value will |
|
266 * throw NS_ERROR_NOT_INITIALIZED. |
|
267 */ |
|
268 readonly attribute string primaryHost; |
|
269 |
|
270 /** |
|
271 * The primary port on which the corresponding server runs, defaulting to the |
|
272 * associated server's port. This name will be the value of |
|
273 * nsIHttpRequest.port for HTTP/1.0 requests. |
|
274 * |
|
275 * This value is always set when the corresponding server is running. If the |
|
276 * server is not running, this value is set only if it has been set to a |
|
277 * non-default name using setPrimary. In this case reading this value will |
|
278 * throw NS_ERROR_NOT_INITIALIZED. |
|
279 */ |
|
280 readonly attribute long primaryPort; |
|
281 |
|
282 /** |
|
283 * Adds a location at which this server may be accessed. |
|
284 * |
|
285 * @throws NS_ERROR_ILLEGAL_VALUE |
|
286 * if scheme or host do not match the scheme or host productions imported |
|
287 * into RFC 2616 from RFC 2396, or if port is not a valid port number |
|
288 */ |
|
289 void add(in string scheme, in string host, in long port); |
|
290 |
|
291 /** |
|
292 * Removes this name from the list of names by which the corresponding server |
|
293 * is known. If name is also the primary name for the server, the primary |
|
294 * name reverts to 'http://127.0.0.1' with the associated server's port. |
|
295 * |
|
296 * @throws NS_ERROR_ILLEGAL_VALUE |
|
297 * if scheme or host do not match the scheme or host productions imported |
|
298 * into RFC 2616 from RFC 2396, or if port is not a valid port number |
|
299 * @returns |
|
300 * true if the given name was a name for this server, false otherwise |
|
301 */ |
|
302 boolean remove(in string scheme, in string host, in long port); |
|
303 |
|
304 /** |
|
305 * Returns true if the given name is in this, false otherwise. |
|
306 * |
|
307 * @throws NS_ERROR_ILLEGAL_VALUE |
|
308 * if scheme or host do not match the scheme or host productions imported |
|
309 * into RFC 2616 from RFC 2396, or if port is not a valid port number |
|
310 */ |
|
311 boolean has(in string scheme, in string host, in long port); |
|
312 |
|
313 /** |
|
314 * Returns the scheme for the name with the given host and port, if one is |
|
315 * present; otherwise returns the empty string. |
|
316 * |
|
317 * @throws NS_ERROR_ILLEGAL_VALUE |
|
318 * if host does not match the host production imported into RFC 2616 from |
|
319 * RFC 2396, or if port is not a valid port number |
|
320 */ |
|
321 string getScheme(in string host, in long port); |
|
322 |
|
323 /** |
|
324 * Designates the given name as the primary name in this and adds it to this |
|
325 * if it is not already present. |
|
326 * |
|
327 * @throws NS_ERROR_ILLEGAL_VALUE |
|
328 * if scheme or host do not match the scheme or host productions imported |
|
329 * into RFC 2616 from RFC 2396, or if port is not a valid port number |
|
330 */ |
|
331 void setPrimary(in string scheme, in string host, in long port); |
|
332 }; |
|
333 |
|
334 /** |
|
335 * A representation of a handler for HTTP requests. The handler is used by |
|
336 * calling its .handle method with data for an incoming request; it is the |
|
337 * handler's job to use that data as it sees fit to make the desired response. |
|
338 * |
|
339 * @note |
|
340 * This interface uses the [function] attribute, so you can pass a |
|
341 * script-defined function with the functionality of handle() to any |
|
342 * method which has a nsIHttpRequestHandler parameter, instead of wrapping |
|
343 * it in an otherwise empty object. |
|
344 */ |
|
345 [scriptable, function, uuid(2bbb4db7-d285-42b3-a3ce-142b8cc7e139)] |
|
346 interface nsIHttpRequestHandler : nsISupports |
|
347 { |
|
348 /** |
|
349 * Processes an HTTP request and initializes the passed-in response to reflect |
|
350 * the correct HTTP response. |
|
351 * |
|
352 * If this method throws an exception, externally observable behavior depends |
|
353 * upon whether is being processed asynchronously. If such is the case, the |
|
354 * output is some prefix (perhaps all, perhaps none, perhaps only some) of the |
|
355 * data which would have been sent if, instead, the response had been finished |
|
356 * at that point. If no data has been written, the response has not had |
|
357 * seizePower() called on it, and it is not being asynchronously created, an |
|
358 * error handler will be invoked (usually 500 unless otherwise specified). |
|
359 * |
|
360 * Some uses of nsIHttpRequestHandler may require this method to never throw |
|
361 * an exception; in the general case, however, this method may throw an |
|
362 * exception (causing an HTTP 500 response to occur, if the above conditions |
|
363 * are met). |
|
364 * |
|
365 * @param request |
|
366 * data representing an HTTP request |
|
367 * @param response |
|
368 * an initially-empty response which must be modified to reflect the data |
|
369 * which should be sent as the response to the request described by metadata |
|
370 */ |
|
371 void handle(in nsIHttpRequest request, in nsIHttpResponse response); |
|
372 }; |
|
373 |
|
374 |
|
375 /** |
|
376 * A representation of the data included in an HTTP request. |
|
377 */ |
|
378 [scriptable, uuid(978cf30e-ad73-42ee-8f22-fe0aaf1bf5d2)] |
|
379 interface nsIHttpRequest : nsISupports |
|
380 { |
|
381 /** |
|
382 * The request type for this request (see RFC 2616, section 5.1.1). |
|
383 */ |
|
384 readonly attribute string method; |
|
385 |
|
386 /** |
|
387 * The scheme of the requested path, usually 'http' but might possibly be |
|
388 * 'https' if some form of SSL tunneling is in use. Note that this value |
|
389 * cannot be accurately determined unless the incoming request used the |
|
390 * absolute-path form of the request line; it defaults to 'http', so only |
|
391 * if it is something else can you be entirely certain it's correct. |
|
392 */ |
|
393 readonly attribute string scheme; |
|
394 |
|
395 /** |
|
396 * The host of the data being requested (e.g. "localhost" for the |
|
397 * http://localhost:8080/file resource). Note that the relevant port on the |
|
398 * host is specified in this.port. This value is in the ASCII character |
|
399 * encoding. |
|
400 */ |
|
401 readonly attribute string host; |
|
402 |
|
403 /** |
|
404 * The port on the server on which the request was received. |
|
405 */ |
|
406 readonly attribute unsigned long port; |
|
407 |
|
408 /** |
|
409 * The requested path, without any query string (e.g. "/dir/file.txt"). It is |
|
410 * guaranteed to begin with a "/". The individual components in this string |
|
411 * are URL-encoded. |
|
412 */ |
|
413 readonly attribute string path; |
|
414 |
|
415 /** |
|
416 * The URL-encoded query string associated with this request, not including |
|
417 * the initial "?", or "" if no query string was present. |
|
418 */ |
|
419 readonly attribute string queryString; |
|
420 |
|
421 /** |
|
422 * A string containing the HTTP version of the request (i.e., "1.1"). Leading |
|
423 * zeros for either component of the version will be omitted. (In other |
|
424 * words, if the request contains the version "1.01", this attribute will be |
|
425 * "1.1"; see RFC 2616, section 3.1.) |
|
426 */ |
|
427 readonly attribute string httpVersion; |
|
428 |
|
429 /** |
|
430 * Returns the value for the header in this request specified by fieldName. |
|
431 * |
|
432 * @param fieldName |
|
433 * the name of the field whose value is to be gotten; note that since HTTP |
|
434 * header field names are case-insensitive, this method produces equivalent |
|
435 * results for "HeAdER" and "hEADer" as fieldName |
|
436 * @returns |
|
437 * The result is a string containing the individual values of the header, |
|
438 * usually separated with a comma. The headers WWW-Authenticate, |
|
439 * Proxy-Authenticate, and Set-Cookie violate the HTTP specification, |
|
440 * however, and for these headers only the separator string is '\n'. |
|
441 * |
|
442 * @throws NS_ERROR_INVALID_ARG |
|
443 * if fieldName does not constitute a valid header field name |
|
444 * @throws NS_ERROR_NOT_AVAILABLE |
|
445 * if the given header does not exist in this |
|
446 */ |
|
447 string getHeader(in string fieldName); |
|
448 |
|
449 /** |
|
450 * Returns true if a header with the given field name exists in this, false |
|
451 * otherwise. |
|
452 * |
|
453 * @param fieldName |
|
454 * the field name whose existence is to be determined in this; note that |
|
455 * since HTTP header field names are case-insensitive, this method produces |
|
456 * equivalent results for "HeAdER" and "hEADer" as fieldName |
|
457 * @throws NS_ERROR_INVALID_ARG |
|
458 * if fieldName does not constitute a valid header field name |
|
459 */ |
|
460 boolean hasHeader(in string fieldName); |
|
461 |
|
462 /** |
|
463 * An nsISimpleEnumerator of nsISupportsStrings over the names of the headers |
|
464 * in this request. The header field names in the enumerator may not |
|
465 * necessarily have the same case as they do in the request itself. |
|
466 */ |
|
467 readonly attribute nsISimpleEnumerator headers; |
|
468 |
|
469 /** |
|
470 * A stream from which data appearing in the body of this request can be read. |
|
471 */ |
|
472 readonly attribute nsIInputStream bodyInputStream; |
|
473 }; |
|
474 |
|
475 |
|
476 /** |
|
477 * Represents an HTTP response, as described in RFC 2616, section 6. |
|
478 */ |
|
479 [scriptable, uuid(1acd16c2-dc59-42fa-9160-4f26c43c1c21)] |
|
480 interface nsIHttpResponse : nsISupports |
|
481 { |
|
482 /** |
|
483 * Sets the status line for this. If this method is never called on this, the |
|
484 * status line defaults to "HTTP/", followed by the server's default HTTP |
|
485 * version (e.g. "1.1"), followed by " 200 OK". |
|
486 * |
|
487 * @param httpVersion |
|
488 * the HTTP version of this, as a string (e.g. "1.1"); if null, the server |
|
489 * default is used |
|
490 * @param code |
|
491 * the numeric HTTP status code for this |
|
492 * @param description |
|
493 * a human-readable description of code; may be null if no description is |
|
494 * desired |
|
495 * @throws NS_ERROR_INVALID_ARG |
|
496 * if httpVersion is not a valid HTTP version string, statusCode is greater |
|
497 * than 999, or description contains invalid characters |
|
498 * @throws NS_ERROR_NOT_AVAILABLE |
|
499 * if this response is being processed asynchronously and data has been |
|
500 * written to this response's body, or if seizePower() has been called on |
|
501 * this |
|
502 */ |
|
503 void setStatusLine(in string httpVersion, |
|
504 in unsigned short statusCode, |
|
505 in string description); |
|
506 |
|
507 /** |
|
508 * Sets the specified header in this. |
|
509 * |
|
510 * @param name |
|
511 * the name of the header; must match the field-name production per RFC 2616 |
|
512 * @param value |
|
513 * the value of the header; must match the field-value production per RFC |
|
514 * 2616 |
|
515 * @param merge |
|
516 * when true, if the given header already exists in this, the values passed |
|
517 * to this function will be merged into the existing header, per RFC 2616 |
|
518 * header semantics (except for the Set-Cookie, WWW-Authenticate, and |
|
519 * Proxy-Authenticate headers, which will treat each such merged header as |
|
520 * an additional instance of the header, for real-world compatibility |
|
521 * reasons); when false, replaces any existing header of the given name (if |
|
522 * any exists) with a new header with the specified value |
|
523 * @throws NS_ERROR_INVALID_ARG |
|
524 * if name or value is not a valid header component |
|
525 * @throws NS_ERROR_NOT_AVAILABLE |
|
526 * if this response is being processed asynchronously and data has been |
|
527 * written to this response's body, or if seizePower() has been called on |
|
528 * this |
|
529 */ |
|
530 void setHeader(in string name, in string value, in boolean merge); |
|
531 |
|
532 /** |
|
533 * A stream to which data appearing in the body of this response (or in the |
|
534 * totality of the response if seizePower() is called) should be written. |
|
535 * After this response has been designated as being processed asynchronously, |
|
536 * or after seizePower() has been called on this, subsequent writes will no |
|
537 * longer be buffered and will be written to the underlying transport without |
|
538 * delaying until the entire response is constructed. Write-through may or |
|
539 * may not be synchronous in the implementation, and in any case particular |
|
540 * behavior may not be observable to the HTTP client as intermediate buffers |
|
541 * both in the server socket and in the client may delay written data; be |
|
542 * prepared for delays at any time. |
|
543 * |
|
544 * @throws NS_ERROR_NOT_AVAILABLE |
|
545 * if accessed after this response is fully constructed |
|
546 */ |
|
547 readonly attribute nsIOutputStream bodyOutputStream; |
|
548 |
|
549 /** |
|
550 * Writes a string to the response's output stream. This method is merely a |
|
551 * convenient shorthand for writing the same data to bodyOutputStream |
|
552 * directly. |
|
553 * |
|
554 * @note |
|
555 * This method is only guaranteed to work with ASCII data. |
|
556 * @throws NS_ERROR_NOT_AVAILABLE |
|
557 * if called after this response has been fully constructed |
|
558 */ |
|
559 void write(in string data); |
|
560 |
|
561 /** |
|
562 * Signals that this response is being constructed asynchronously. Requests |
|
563 * are typically completely constructed during nsIHttpRequestHandler.handle; |
|
564 * however, responses which require significant resources (time, memory, |
|
565 * processing) to construct can be created and sent incrementally by calling |
|
566 * this method during the call to nsIHttpRequestHandler.handle. This method |
|
567 * only has this effect when called during nsIHttpRequestHandler.handle; |
|
568 * behavior is undefined if it is called at a later time. It may be called |
|
569 * multiple times with no ill effect, so long as each call occurs before |
|
570 * finish() is called. |
|
571 * |
|
572 * @throws NS_ERROR_UNEXPECTED |
|
573 * if not initially called within a nsIHttpRequestHandler.handle call or if |
|
574 * called after this response has been finished |
|
575 * @throws NS_ERROR_NOT_AVAILABLE |
|
576 * if seizePower() has been called on this |
|
577 */ |
|
578 void processAsync(); |
|
579 |
|
580 /** |
|
581 * Seizes complete control of this response (and its connection) from the |
|
582 * server, allowing raw and unfettered access to data being sent in the HTTP |
|
583 * response. Once this method has been called the only property which may be |
|
584 * accessed without an exception being thrown is bodyOutputStream, and the |
|
585 * only methods which may be accessed without an exception being thrown are |
|
586 * write(), finish(), and seizePower() (which may be called multiple times |
|
587 * without ill effect so long as all calls are otherwise allowed). |
|
588 * |
|
589 * After a successful call, all data subsequently written to the body of this |
|
590 * response is written directly to the corresponding connection. (Previously- |
|
591 * written data is silently discarded.) No status line or headers are sent |
|
592 * before doing so; if the response handler wishes to write such data, it must |
|
593 * do so manually. Data generation completes only when finish() is called; it |
|
594 * is not enough to simply call close() on bodyOutputStream. |
|
595 * |
|
596 * @throws NS_ERROR_NOT_AVAILABLE |
|
597 * if processAsync() has been called on this |
|
598 * @throws NS_ERROR_UNEXPECTED |
|
599 * if finish() has been called on this |
|
600 */ |
|
601 void seizePower(); |
|
602 |
|
603 /** |
|
604 * Signals that construction of this response is complete and that it may be |
|
605 * sent over the network to the client, or if seizePower() has been called |
|
606 * signals that all data has been written and that the underlying connection |
|
607 * may be closed. This method may only be called after processAsync() or |
|
608 * seizePower() has been called. This method is idempotent. |
|
609 * |
|
610 * @throws NS_ERROR_UNEXPECTED |
|
611 * if processAsync() or seizePower() has not already been properly called |
|
612 */ |
|
613 void finish(); |
|
614 }; |