idnits 2.17.1 draft-ietf-ipp-implementers-guide-00.txt: Checking boilerplate required by RFC 5378 and the IETF Trust (see https://trustee.ietf.org/license-info): ---------------------------------------------------------------------------- ** Looks like you're using RFC 2026 boilerplate. This must be updated to follow RFC 3978/3979, as updated by RFC 4748. Checking nits according to https://www.ietf.org/id-info/1id-guidelines.txt: ---------------------------------------------------------------------------- ** Missing expiration date. The document expiration date should appear on the first and last page. ** The document seems to lack a 1id_guidelines paragraph about Internet-Drafts being working documents. ** The document seems to lack a 1id_guidelines paragraph about the list of current Internet-Drafts. ** The document seems to lack a 1id_guidelines paragraph about the list of Shadow Directories. ** The document is more than 15 pages and seems to lack a Table of Contents. == No 'Intended status' indicated for this document; assuming Proposed Standard == The page length should not exceed 58 lines per page, but there was 46 longer pages, the longest (page 16) being 67 lines Checking nits according to https://www.ietf.org/id-info/checklist : ---------------------------------------------------------------------------- ** The document seems to lack a Security Considerations section. ** The document seems to lack an IANA Considerations section. (See Section 2.2 of https://www.ietf.org/id-info/checklist for how to handle the case when there are no actions for IANA.) ** The document seems to lack separate sections for Informative/Normative References. All references will be assumed normative when checking for downward references. ** The abstract seems to contain references ([IPP-PRO], [IPP-RAT], [IPP-MOD], [IPP-REQ], [IPPLPD]), which it shouldn't. Please replace those with straight textual mentions of the documents in question. == There are 29 instances of lines with non-RFC6890-compliant IPv4 addresses in the document. If these are example addresses, they should be changed. ** The document seems to lack a both a reference to RFC 2119 and the recommended RFC 2119 boilerplate, even if it appears to use RFC 2119 keywords. RFC 2119 keyword, line 110: '...he values of the REQUIRED Operation at...' RFC 2119 keyword, line 112: '...he values of the OPTIONAL Operation at...' RFC 2119 keyword, line 228: '...ontain the terminology MUST, MUST NOT,...' RFC 2119 keyword, line 229: '...MAY, NEED NOT, SHOULD, SHOULD NOT, REQ...' RFC 2119 keyword, line 237: '...ords. The words MUST, MUST NOT, and R...' (90 more instances...) Miscellaneous warnings: ---------------------------------------------------------------------------- == The copyright year in the RFC 3978 Section 5.4 Copyright Line does not match the current year == Line 1110 has weird spacing: '...(1setOf range...' == Line 2083 has weird spacing: '... must not...' == Line 2086 has weird spacing: '...nection must...' == Line 2097 has weird spacing: '... may mus...' == Line 2101 has weird spacing: '... must not...' == (27 more instances...) == The expression 'MAY NOT', while looking like RFC 2119 requirements text, is not defined in RFC 2119, and should not be used. Consider using 'MUST NOT' instead (if that is what you mean). Found 'MAY NOT' in this paragraph: OPTIONAL Operation attributes are those that an IPP object MAY or MAY NOT support. An IPP object validates the values of the OPTIONAL attributes supplied by the client. The IPP object performs the same syntactic validation checks for each OPTIONAL attribute value as in Section 2.1.1.5. As in Section 2.1.1.5, if any fail, the IPP object REJECTS the request and RETURNS the 'client-error-bad-request' or the 'client-error-request-value-too-long' status code. -- The document seems to lack a disclaimer for pre-RFC5378 work, but may have content which was first submitted before 10 November 2008. If you have contacted all the original authors and they are all willing to grant the BCP78 rights to the IETF Trust, then this is fine, and you can ignore this comment. If not, you may need to add the pre-RFC5378 disclaimer. (See the Legal Provisions document at https://trustee.ietf.org/license-info for more information.) -- The document date (November 16, 1998) is 9286 days in the past. Is this intentional? Checking references for intended status: Proposed Standard ---------------------------------------------------------------------------- (See RFCs 3967 and 4897 for information about using normative references to lower-maturity documents in RFCs) == Missing Reference: 'RFC2119' is mentioned on line 234, but not defined == Unused Reference: 'RFC2396' is defined on line 2328, but no explicit reference was found in the text == Unused Reference: 'SSL' is defined on line 2332, but no explicit reference was found in the text == Outdated reference: A later version (-05) exists of draft-ietf-ipp-lpd-ipp-map-04 ** Downref: Normative reference to an Experimental draft: draft-ietf-ipp-lpd-ipp-map (ref. 'IPP LPD') ** Downref: Normative reference to an Experimental draft: draft-ietf-ipp-model (ref. 'IPP-MOD') -- No information found for draft-ietf-ipp-pro - is the name correct? -- Possible downref: Normative reference to a draft: ref. 'IPP-PRO' == Outdated reference: A later version (-04) exists of draft-ietf-ipp-rat-03 ** Downref: Normative reference to an Experimental draft: draft-ietf-ipp-rat (ref. 'IPP-RAT') == Outdated reference: A later version (-03) exists of draft-ietf-ipp-req-02 ** Downref: Normative reference to an Experimental draft: draft-ietf-ipp-req (ref. 'IPP-REQ') ** Obsolete normative reference: RFC 2068 (Obsoleted by RFC 2616) ** Obsolete normative reference: RFC 2396 (Obsoleted by RFC 3986) -- Possible downref: Non-RFC (?) normative reference: ref. 'SSL' Summary: 17 errors (**), 0 flaws (~~), 17 warnings (==), 5 comments (--). Run idnits with the --verbose option for more detailed information about the items above. -------------------------------------------------------------------------------- 2 INTERNET-DRAFT 3 draft-ietf-ipp-implementers-guide-00.txt 4 T. Hastings 5 Xerox Corporation 6 C. Manros 7 Xerox Corporation 8 November 16, 1998 10 Internet Printing Protocol/1.0: Implementer's Guide 12 Copyright (C) The Internet Society (date). All Rights Reserved. 14 Status of this Memo 16 This document is an Internet-Draft. Internet-Drafts are working 17 documents of the Internet Engineering Task Force (IETF), its areas, and 18 its working groups. Note that other groups may also distribute working 19 documents as Internet-Drafts. 21 Internet-Drafts are draft documents valid for a maximum of six months 22 and may be updated, replaced, or obsoleted by other documents at any 23 time. It is inappropriate to use Internet-Drafts as reference material 24 or to cite them other than as "work in progress". 26 To learn the current status of any Internet-Draft, please check the 27 "1id-abstracts.txt" listing contained in the Internet-Drafts Shadow 28 Directories on ftp.is.co.za (Africa), nic.nordu.net (Europe), 29 munnari.oz.au (Pacific Rim), ftp.ietf.org (US East Coast), or 30 ftp.isi.edu (US West Coast). 32 Abstract 34 This document is one of a set of documents, which together describe all 35 aspects of a new Internet Printing Protocol (IPP). IPP is an 36 application level protocol that can be used for distributed printing 37 using Internet tools and technologies. This document contains 38 information that supplements the IPP Model and Semantics [IPP-MOD] and 39 the IPP Transport and Encoding [IPP-PRO] documents. It is intended to 40 help implementers understand IPP/1.0 and some of the considerations that 41 may assist them in the design of their client and/or IPP object 42 implementations. For example, a typical order of processing requests is 43 given, including error checking. Motivation for some of the 44 specification decisions is also included. 46 Expires May 16, 1999 47 The full set of IPP documents includes: 49 Design Goals for an Internet Printing Protocol [IPP-REQ] 50 Rationale for the Structure and Model and Protocol for the Internet 51 Printing Protocol [IPP-RAT] 52 Internet Printing Protocol/1.0: Model and Semantics [IPP-MOD] 53 Internet Printing Protocol/1.0: Encoding and Transport [IPP-PRO] 54 Mapping between LPD and IPP Protocols [IPP LPD] 56 The document, "Design Goals for an Internet Printing Protocol", takes a 57 broad look at distributed printing functionality, and it enumerates 58 real-life scenarios that help to clarify the features that need to be 59 included in a printing protocol for the Internet. It identifies 60 requirements for three types of users: end users, operators, and 61 administrators. The design goals document calls out a subset of end 62 user requirements that are satisfied in IPP/1.0. Operator and 63 administrator requirements are out of scope for version 1.0. 65 The document, "Rationale for the Structure and Model and Protocol for 66 the Internet Printing Protocol", describes IPP from a high level view, 67 defines a roadmap for the various documents that form the suite of IPP 68 specifications, and gives background and rationale for the IETF working 69 group's major decisions. 71 The document, "Internet Printing Protocol/1.0: Model and Semantics", 72 describes a simplified model with abstract objects, their attributes, 73 and their operations. The model introduces a Printer and a Job. The 74 Job supports multiple documents per Job. The model document also 75 addresses how security, internationalization, and directory issues are 76 addressed. 78 The document, "Internet Printing Protocol/1.0: Encoding and Transport", 79 is a formal mapping of the abstract operations and attributes defined in 80 the model document onto HTTP/1.1. It also defines the encoding rules 81 for a new Internet media type called "application/ipp". 83 The document, "Mapping between LPD and IPP Protocols", gives some advice 84 to implementers of gateways between IPP and LPD (Line Printer Daemon) 85 implementations. 87 Expires May 16, 1999 88 TABLE OF CONTENTS 90 1 Introduction......................................................5 92 1.1 Conformance language...........................................5 94 1.2 Other terminology..............................................6 96 2 Model and Semantics...............................................6 98 2.1 Suggested Operation Processing Steps for IPP Objects...........6 100 2.1.1 Suggested Operation Processing Steps for all Operations.....7 102 2.1.1.1 Validate version number.................................7 104 2.1.1.2 Validate operation identifier...........................7 106 2.1.1.3 Validate the request identifier.........................7 108 2.1.1.4 Validate attribute group and attribute presence and order8 110 2.1.1.5 Validate the values of the REQUIRED Operation attributes15 112 2.1.1.6 Validate the values of the OPTIONAL Operation attributes18 114 2.1.2 Suggested Additional Processing Steps for Operations that 115 Create/Validate Jobs and Add Documents...........................20 117 2.1.2.1 Default "ipp-attribute-fidelity" if not supplied.......20 119 2.1.2.2 Check that the Printer object is accepting jobs........20 121 2.1.2.3 Validate the values of the Job Template attributes.....20 123 2.1.2.4 Check for conflicting Job Template attributes values...25 125 2.1.2.5 Decide whether to REJECT the request...................25 127 2.1.2.6 For the Validate-Job operation, RETURN one of the success 128 status codes....................................................26 130 2.1.2.7 Create the Job object with attributes to support.......26 132 2.1.2.8 Return one of the success status codes.................28 134 2.1.2.9 Accept appended Document Content.......................28 136 2.1.2.10Scheduling and Starting to Process the Job.............28 138 2.1.2.11Completing the Job.....................................28 140 2.1.2.12Destroying the Job after completion....................29 142 Expires May 16, 1999 143 2.1.2.13Interaction with "ipp-attribute-fidelity"..............29 145 2.2 Status codes returned by operation............................29 147 2.2.1 Printer Operations.........................................29 149 2.2.1.1 Print-Job..............................................29 151 2.2.1.2 Print-URI..............................................31 153 2.2.1.3 Validate-Job...........................................31 155 2.2.1.4 Create-Job.............................................31 157 2.2.1.5 Get-Printer-Attributes.................................32 159 2.2.1.6 Get-Jobs...............................................32 161 2.2.2 Job Operations.............................................33 163 2.2.2.1 Send-Document..........................................33 165 2.2.2.2 Send-URI...............................................34 167 2.2.2.3 Cancel-Job.............................................34 169 2.2.2.4 Get-Job-Attributes.....................................35 171 2.3 Validate-Job..................................................36 173 2.4 Case Sensitivity in URIs......................................36 175 2.5 Natural Language Override (NLO)...............................36 177 2.6 The "queued-job-count" Printer Description attribute..........38 179 2.6.1 Why is "queued-job-count" RECOMMENDED?.....................38 181 2.6.2 Is "queued-job-count" a good measure of how busy a printer is? 182 38 184 2.7 Sending empty attribute groups................................38 186 2.8 Returning unsupported attributes in Get-Xxxx responses........38 188 2.9 Returning job-state in Print-Job response.....................38 190 2.10 Multi-valued attributes.....................................39 192 3 Encoding and Transport...........................................40 194 3.1 General Headers...............................................41 196 3.2 Request Headers..............................................41 198 Expires May 16, 1999 199 3.3 Response Headers..............................................42 201 3.4 Entity Headers...............................................43 203 3.5 Optional support for HTTP/1.0.................................44 205 3.6 HTTP/1.1 Chunking.............................................44 207 4 References.......................................................45 209 4.1 Authors' Address..............................................45 211 5 Appendix C: Full Copyright Statement.............................46 213 1 Introduction 215 This document contains information that supplements the IPP Model and 216 Semantics [IPP-MOD] and the IPP Transport and Encoding [IPP-PRO] 217 documents. As such this information is not part of the formal 218 specifications. Instead information is presented to help implementers 219 understand the specification, including some of the motivation for 220 decisions taken by the committee in developing the specification. Some 221 of the implementation considerations are intended to help implementers 222 design their client and/or IPP object implementations. If there are any 223 contradictions between this document and [IPP-MOD] or [IPP-PRO], those 224 documents take precedence over this document. 226 1.1 Conformance language 228 Usually, this document does not contain the terminology MUST, MUST NOT, 229 MAY, NEED NOT, SHOULD, SHOULD NOT, REQUIRED, and OPTIONAL. However, 230 when those terms do appear in this document, their intent is to repeat 231 what the [IPP-MOD] and [IPP-PRO] documents require and allow, rather 232 than specifying additional conformance requirements. These terms are 233 defined in section 13 on conformance terminology in [IPP-MOD], most of 234 which is taken from RFC 2119 [RFC2119]. 236 Implementers should read section 13 in [IPP-MOD] in order to understand 237 these capitalized words. The words MUST, MUST NOT, and REQUIRED 238 indicate what implementations are required to support in a client or IPP 239 object in order to be conformant to [IPP-MOD] and [IPP-PRO]. MAY, NEED 240 NOT, and OPTIONAL indicate was is merely allowed as an implementer 241 option. The verbs SHOULD and SHOULD NOT indicate suggested behavior, 242 but which is not required or disallowed, respectively, in order to 243 conform to the specification. 245 Expires May 16, 1999 246 1.2 Other terminology 248 The term "sender" refers to the client that sends a request or an IPP 249 object that returns a response. The term "receiver" refers to the IPP 250 object that receives a request and to a client that receives a response. 252 2 Model and Semantics 254 This section discusses various aspects of IPP/1.0 Model and Semantics 255 [IPP-MOD]. 257 2.1 Suggested Operation Processing Steps for IPP Objects 259 This section suggests the steps and error checks that an IPP object MAY 260 perform when processing requests and returning responses. An IPP object 261 MAY perform some or all of the error checks. However, some 262 implementations MAY choose to be more forgiving than the error checks 263 shown here, in order to be able to accept requests from non-conforming 264 clients. Not performing all of these error checks is a so-called 265 "forgiving" implementation. On the other hand, clients that 266 successfully submit requests to IPP objects that do perform all the 267 error checks will be more likely to be able to interoperate with other 268 IPP object implementations. Thus an implementer of an IPP object needs 269 to decide whether to be a "forgiving" or a "strict" implementation. 270 Therefore, the error status codes returned may differ between 271 implementations. Consequentially, client SHOULD NOT expect exactly the 272 error code processing described in this section. 274 When an IPP object receives a request, the IPP object either accepts or 275 rejects the request. In order to determine whether or not to accept or 276 reject the request, the IPP object SHOULD execute the following steps. 277 The order of the steps may be rearranged and/or combined, including 278 making one or multiple passes over the request. 280 A client MUST supply requests that would pass all of the error checks 281 indicated here in order to be a conforming client. Therefore, a client 282 SHOULD supply requests that are conforming, in order to avoid being 283 rejected by some IPP object implementations. 285 In the following, processing continues step by step until a "RETURNS the 286 xxx status code ." statement is encountered. Error returns are 287 indicated by the verb: "REJECTS". Since clients have difficulty getting 288 the status code before sending all of the document data in a Print-Job 289 request, clients SHOULD use the Validate-Job operation before sending 290 large documents to be printed, in order to validate whether the IPP 291 Printer will accept the job or not. 293 It is assumed that security authentication and authorization has already 294 taken place at a lower layer. 296 Expires May 16, 1999 297 2.1.1Suggested Operation Processing Steps for all Operations 299 This section is intended to apply to all operations. The next section 300 contains the additional steps for the Print-Job, Validate-Job, Print- 301 URI, Create-Job, Send-Document, and Send-URI operations that create 302 jobs, adds documents, and validates jobs. 304 2.1.1.1 Validate version number 306 Every request and every response contains the "version-number" 307 attribute. The value of this attribute is the major and minor version 308 number of the syntax and semantics that the client and IPP object is 309 using, respectively. The "version-number" attribute remains in a fixed 310 position across all future versions so that all clients and IPP object 311 that support future versions can determine which version is being used. 312 The IPP object checks to see if the major version number supplied in the 313 request is supported. If not, the Printer object REJECTS the request 314 and RETURNS the 'server-error-version-not-supported' status code in the 315 response. The IPP object returns in the "version-number" response 316 attribute the major and minor version for the error response. Thus the 317 client can learn at least one major and minor version that the IPP 318 object supports. The IPP object is encouraged to return the closest 319 version number to the one supplied by the client. 321 The checking of the minor version number is implementation dependent, 322 however if the client supplied minor version is explicitly supported, 323 the IPP object MUST respond using that identical minor version number. 324 If the requested minor version is not supported (the requested minor 325 version is either higher or lower) than a supported minor version, the 326 IPP object SHOULD return the closest supported minor version. 328 2.1.1.2 Validate operation identifier 330 The Printer object checks to see if the "operation-id" attribute 331 supplied by the client is supported as indicated in the Printer object's 332 "printer-operations-supported" attribute. If not, the Printer REJECTS 333 the request and returns the 'server-error-operation-not-supported' 334 status code in the response. 336 2.1.1.3 Validate the request identifier 338 The Printer object SHOULD NOT check to see if the "request-id" attribute 339 supplied by the client is in range: between 1 and 2**31 - 1 (inclusive), 340 but copies all 32 bits. 342 Note: The "version-number", "operation-id", and the "request-id" 343 parameters are in fixed octet positions in the IPP/1.0 encoding. The 344 "version-number" parameter will be the same fixed octet position in all 345 versions of the protocol. These fields are validated before proceeding 346 with the rest of the validation. 348 Expires May 16, 1999 349 2.1.1.4 Validate attribute group and attribute presence and order 351 The order of the following validation steps depends on implementation. 353 2.1.1.4.1 Validate the presence and order of attribute groups 355 Client requests and IPP object responses contain attribute groups that 356 Section 3 requires to be present and in a specified order. An IPP 357 object verifies that the attribute groups are present and in the correct 358 order in requests supplied by clients (attribute groups without an * in 359 the following tables). 361 If an IPP object receives a request with (1) required attribute groups 362 missing, or (2) the attributes groups are out of order, or (3) the 363 groups are repeated, the IPP object REJECTS the request and RETURNS the 364 'client-error-bad-request' status code. For example, it is an error for 365 the Job Template Attributes group to occur before the Operation 366 Attributes group, for the Operation Attributes group to be omitted, or 367 for an attribute group to occur more than once, except in the Get-Jobs 368 response. 370 Since this kind of attribute group error is most likely to be an error 371 detected by a client developer rather than by a customer, the IPP object 372 NEED NOT return an indication of which attribute group was in error in 373 either the Unsupported Attributes group or the Status Message. Also, 374 the IPP object NEED NOT find all attribute group errors before returning 375 this error. 377 2.1.1.4.2 Ignore unknown attribute groups in the expected position 379 Future attribute groups may be added to the specification at the end of 380 requests just before the Document Content and at the end of response, 381 except for the Get-Jobs response, where it maybe there or before the 382 first job attributes returned. If an IPP object receives an unknown 383 attribute group in these positions, it ignores the entire group, rather 384 than returning an error, since that group may be a new group in a later 385 minor version of the protocol that can be ignored. (If the new 386 attribute group cannot be ignored without confusing the client, the 387 major version number would have been increased in the protocol document 388 and in the request). If the unknown group occurs in a different 389 position, the IPP object REJECTS the request and RETURNS the 'client- 390 error-bad-request' status code. 392 Clients also ignore unknown attribute groups returned in a response. 394 Note: By validating that requests are in the proper form, IPP objects 395 force clients to use the proper form which, in turn, increases the 396 chances that customers will be able to use such clients from multiple 397 vendors with IPP objects from other vendors. 399 Expires May 16, 1999 400 2.1.1.4.3 Validate the presence of a single occurrence of required 401 Operation attributes 403 Client requests and IPP object responses contain Operation attributes 404 that [IPP-MOD] Section 3 requires to be present. Attributes within a 405 group may be in any order, except for the ordering of target, charset, 406 and natural languages attributes. These attributes MUST be first, and 407 MUST be supplied in the following order: charset, natural language, and 408 then target. An IPP object verifies that the attributes that Section 4 409 requires to be supplied by the client have been supplied in the request 410 (attributes without an * in the following tables). An asterisk (*) 411 indicates groups and Operation attributes that the client may omit in a 412 request or an IPP object may omit in a response. 414 If an IPP object receives a request with required attributes missing or 415 repeated from a group, the IPP object REJECTS the request and RETURNS 416 the 'client-error-bad-request' status code. For example, it is an error 417 for the "attributes-charset" or "attributes-natural-language" attribute 418 to be omitted in any operation request, or for an Operation attribute to 419 be supplied in a Job Template group or a Job Template attribute to be 420 supplied in an Operation Attribute group in a create request. It is 421 also an error to supply the "attributes-charset" attribute twice. 423 Since these kinds of attribute errors are most likely to be detected by 424 a client developer rather than by a customer, the IPP object NEED NOT 425 return an indication of which attribute was in error in either the 426 Unsupported Attributes group or the Status Message. Also, the IPP 427 object NEED NOT find all attribute errors before returning this error. 429 The following tables list all the attributes for all the operations by 430 attribute group in each request and each response. The order of the 431 groups is the order that the client supplies the groups as specified in 432 [IPP-MOD] Section 3. The order of the attributes within a group is 433 arbitrary, except as noted for some of the special operation attributes 434 (charset, natural language, and target). The tables below use the 435 following notation: 437 R indicates a REQUIRED attribute that an IPP object MUST support 438 O indicates an OPTIONAL attribute that an IPP object NEED NOT 439 support 440 * indicates that a client MAY omit the attribute in a request 441 and that an IPP object MAY omit the attribute in a 442 response. The absence of an * means that a client MUST 443 supply the attribute in a request and an IPP object MUST 444 supply the attribute in a response. 446 Operation Requests 448 The tables below show the attributes in their proper attribute groups 449 for operation requests: 451 Note: All operation requests contain "version-number", "operation-id", 452 and "request-id" parameters. 454 Expires May 16, 1999 455 Expires May 16, 1999 457 Print-Job Request: 458 Group 1: Operation Attributes (R) 459 attributes-charset (R) 460 attributes-natural-language (R) 461 printer-uri (R) 462 requesting-user-name (R*) 463 job-name (R*) 464 ipp-attribute-fidelity (R*) 465 document-name (R*) 466 document-format (R*) 467 document-natural-language (O*) 468 compression (O*) 469 job-k-octets (O*) 470 job-impressions (O*) 471 job-media-sheets (O*) 472 Group 2: Job Template Attributes (R*) 473 (O*) 474 (see [IPP-MOD] Section 4.2) 475 Group 3: Document Content (R) 476 478 Validate-Job Request: 479 Group 1: Operation Attributes (R) 480 attributes-charset (R) 481 attributes-natural-language (R) 482 printer-uri (R) 483 requesting-user-name (R*) 484 job-name (R*) 485 ipp-attribute-fidelity (R*) 486 document-name (R*) 487 document-format (R*) 488 document-natural-language (O*) 489 compression (O*) 490 job-k-octets (O*) 491 job-impressions (O*) 492 job-media-sheets (O*) 493 Group 2: Job Template Attributes (R*) 494 (O*) 495 (see [IPP-MOD] Section 4.2) 497 Create-Job Request: 498 Group 1: Operation Attributes (R) 499 attributes-charset (R) 500 attributes-natural-language (R) 501 printer-uri (R) 502 requesting-user-name (R*) 503 job-name (R*) 504 ipp-attribute-fidelity (R*) 505 job-k-octets (O*) 506 job-impressions (O*) 507 job-media-sheets (O*) 508 Group 2: Job Template Attributes (R*) 509 (O*) (see 510 (see [IPP-MOD] Section 4.2) 512 Expires May 16, 1999 514 Print-URI Request: 515 Group 1: Operation Attributes (R) 516 attributes-charset (R) 517 attributes-natural-language (R) 518 printer-uri (R) 519 document-uri (R) 520 requesting-user-name (R*) 521 job-name (R*) 522 ipp-attribute-fidelity (R*) 523 document-name (R*) 524 document-format (R*) 525 document-natural-language (O*) 526 compression (O*) 527 job-k-octets (O*) 528 job-impressions (O*) 529 job-media-sheets (O*) 530 Group 2: Job Template Attributes (R*) 531 (O*) (see 532 (see [IPP-MOD] Section 4.2) 534 Send-Document Request: 535 Group 1: Operation Attributes (R) 536 attributes-charset (R) 537 attributes-natural-language (R) 538 (printer-uri & job-id) | job-uri (R) 539 last-document (R) 540 requesting-user-name (R*) 541 document-name (R*) 542 document-format (R*) 543 document-natural-language (O*) 544 compression (O*) 545 Group 2: Document Content (R*) 546 548 Send-URI Request: 549 Group 1: Operation Attributes (R) 550 attributes-charset (R) 551 attributes-natural-language (R) 552 (printer-uri & job-id) | job-uri (R) 553 last-document (R) 554 document-uri (R) 555 requesting-user-name (R*) 556 document-name (R*) 557 document-format (R*) 558 document-natural-language (O*) 559 compression (O*) 561 Cancel-Job Request: 562 Group 1: Operation Attributes (R) 563 attributes-charset (R) 564 attributes-natural-language (R) 565 (printer-uri & job-id) | job-uri (R) 566 requesting-user-name (R*) 568 Expires May 16, 1999 569 message (O*) 571 Get-Printer-Attributes Request: 572 Group 1: Operation Attributes (R) 573 attributes-charset (R) 574 attributes-natural-language (R) 575 printer-uri (R) 576 requesting-user-name (R*) 577 requested-attributes (R*) 578 document-format (R*) 580 Get-Job-Attributes Request: 581 Group 1: Operation Attributes (R) 582 attributes-charset (R) 583 attributes-natural-language (R) 584 (printer-uri & job-id) | job-uri (R) 585 requesting-user-name (R*) 586 requested-attributes (R*) 588 Get-Jobs Request: 589 Group 1: Operation Attributes (R) 590 attributes-charset (R) 591 attributes-natural-language (R) 592 printer-uri (R) 593 requesting-user-name (R*) 594 limit (R*) 595 requested-attributes (R*) 596 which-jobs (R*) 597 my-jobs (R*) 599 Operation Responses 601 The tables below show the response attributes in their proper attribute 602 groups for responses. 604 Note: All operation responses contain "version-number", "status-code", 605 and "request-id" parameters. 607 Expires May 16, 1999 608 Print-Job Response: 609 Print-URI Response: 610 Create-Job Response: 611 Send-Document Response: 612 Send-URI Response: 613 Group 1: Operation Attributes (R) 614 attributes-charset (R) 615 attributes-natural-language (R) 616 status-message (O*) 617 Group 2: Unsupported Attributes (R*) (see Note 3) 618 (R*) 619 Group 3: Job Object Attributes(R*) (see Note 2) 620 job-uri (R) 621 job-id (R) 622 job-state (R) 623 job-state-reasons (O*) 624 job-state-message (O*) 625 number-of-intervening-jobs (O*) 627 Validate-Job Response: 628 Cancel-Job Response: 629 Group 1: Operation Attributes (R) 630 attributes-charset (R) 631 attributes-natural-language (R) 632 status-message (O*) 633 Group 2: Unsupported Attributes (R*) (see Note 3) 634 (R*) 636 Note 2 - the Job Object Attributes and Printer Object Attributes are 637 returned only if the IPP object returns one of the success status codes. 639 Note 3 - the Unsupported Attributes Group is present only if the client 640 included some Operation and/or Job Template attributes or values that 641 the Printer doesn't support whether a success or an error return. 643 Get-Printer-Attributes Response: 644 Group 1: Operation Attributes (R) 645 attributes-charset (R) 646 attributes-natural-language (R) 647 status-message (O*) 648 Group 2: Unsupported Attributes (R*) (see Note 4) 649 (R*) 650 Group 3: Printer Object Attributes(R*) (see Note 2) 651 (R*) 653 Note 4 - the Unsupported Attributes Group is present only if the client 654 included some Operation attributes that the Printer doesn't support 655 whether a success or an error return. 657 Expires May 16, 1999 658 Get-Job-Attributes Response: 659 Group 1: Operation Attributes (R) 660 attributes-charset (R) 661 attributes-natural-language (R) 662 status-message (O*) 663 Group 2: Unsupported Attributes (R*) (see Note 4) 664 (R*) 665 Group 3: Job Object Attributes(R*) (see Note 2) 666 (R*) 668 Get-Jobs Response: 669 Group 1: Operation Attributes (R) 670 attributes-charset (R) 671 attributes-natural-language (R) 672 status-message (O*) 673 Group 2: Unsupported Attributes (R*) (see Note 4) 674 (R*) 675 Group 3: Job Object Attributes(R*) (see Note 2, 5) 676 (R*) 678 Note 5: for the Get-Jobs operation the response contains a separate Job 679 Object Attributes group 3 to N containing requested-attributes for each 680 job object in the response. 682 2.1.1.5 Validate the values of the REQUIRED Operation attributes 684 An IPP object validates the values supplied by the client of the 685 REQUIRED Operation attribute that the IPP object MUST support. The next 686 section specifies the validation of the values of the OPTIONAL Operation 687 attributes that IPP objects MAY support. 689 The IPP object performs the following syntactic validation checks of 690 each Operation attribute value: 692 a)that the length of each Operation attribute value is correct for 693 the attribute syntax tag supplied by the client according to 694 [IPP-MOD] Section 4.1, 696 b)that the attribute syntax tag is correct for that Operation 697 attribute according to [IPP-MOD] Section 3, 699 c)that the value is in the range specified for that Operation 700 attribute according to [IPP-MOD] Section 3, 702 d)that multiple values are supplied by the client only for 703 operation attributes that are multi-valued, i.e., that are 704 1setOf X according to [IPP-MOD] Section 3. 706 If any of these checks fail, the IPP object REJECTS the request and 707 RETURNS the 'client-error-bad-request' or the 'client-error-request- 708 value-too-long' status code. Since such an error is most likely to be 709 an error detected by a client developer, rather than by an end-user, the 711 Expires May 16, 1999 712 IPP object NEED NOT return an indication of which attribute had the 713 error in either the Unsupported Attributes Group or the Status Message. 714 The description for each of these syntactic checks is explicitly 715 expressed in the first IF statement in the following table. 717 In addition, the IPP object checks each Operation attribute value 718 against some Printer object attribute or some hard-coded value if there 719 is no "xxx-supported" Printer object attribute defined. If its value is 720 not among those supported or is not in the range supported, then the IPP 721 object REJECTS the request and RETURNS the error status code indicated 722 in the table by the second IF statement. If the value of the Printer 723 object's "xxx-supported" attribute is 'no-value' (because the system 724 administrator hasn't configured a value), the check always fails. 726 ----------------------------------------------- 728 attributes-charset (charset) 730 IF NOT any single non-empty 'charset' value less than or equal to 63 731 octets, REJECT/RETURN 'client-error-request-value-too-long'. 732 IF NOT in the Printer object's "charset-supported" attribute, 733 REJECT/RETURN "client-error-charset-not-supported". 735 attributes-natural-language(naturalLanguage) 737 IF NOT any single non-empty 'naturalLanguage' value less than or 738 equal to 63 octets, REJECT/RETURN 'client-error-request-value-too- 739 long'. 740 ACCEPT the request even if not a member of the set in the Printer 741 object's "generated-natural-language-supported" attribute. 743 requesting-user-name 745 IF NOT any single 'name' value less than or equal to 255 octets, 746 REJECT/RETURN 'client-error-request-value-too-long'. 747 IF the IPP object can obtain a better authenticated name, use it 748 instead. 750 job-name(name) 752 IF NOT any single 'name' value less than or equal to 255 octets, 753 REJECT/RETURN 'client-error-request-value-too-long'. 754 IF NOT supplied by the client, the Printer object creates a name from 755 the document-name or document-uri. 757 document-name (name) 759 IF NOT any single 'name' value less than or equal to 255 octets, 760 REJECT/RETURN 'client-error-request-value-too-long'. 762 ipp-attribute-fidelity (boolean) 764 IF NOT either a single 'true' or 'false' 'boolean' value equal to 1 765 octet, REJECT/RETURN 'client-error-bad-request'. 767 Expires May 16, 1999 769 IF NOT supplied by the client, the IPP object assumes the value 770 'false'. 772 document-format (mimeMediaType) 774 IF NOT any single non-empty 'mimeMediaType' value less than or equal 775 to 255 octets, REJECT/RETURN 'client-error-request-value-too-long'. 776 IF NOT in the Printer object's "document-format-supported" attribute, 777 REJECT/RETURN 'client-error-document-format-not-supported' 778 IF NOT supplied by the client, the IPP object assumes the value of 779 the Printer object's "document-format-default" attribute. 781 document-uri (uri) 783 IF NOT any single non-empty 'uri' value less than or equal to 1023 784 octets, REJECT/RETURN 'client-error-request-value-too-long'. 785 IF the URI syntax is not valid, REJECT/RETURN 'client-error-bad- 786 request'. 787 IF scheme is NOT in the Printer object's "reference-uri-schemes- 788 supported" attribute, REJECT/RETURN 'client-error'-uri-scheme-not- 789 supported'. 791 last-document (boolean) 793 IF NOT either a single 'true' or 'false' 'boolean' value equal to 1 794 octet, REJECT/RETURN 'client-error-bad-request'. 796 job-id (integer(1:MAX)) 798 IF NOT any single 'integer' value equal to 4 octets AND in the range 799 1 to MAX, REJECT/RETURN 'client-error-bad-request'. 800 IF NOT a job-id of an existing Job object, REJECT/RETURN 'client- 801 error-not-found' or 'client-error-gone' status code, if keep track 802 of recently deleted jobs. 804 requested-attributes (1setOf keyword) 806 IF NOT any number of 'keyword' values less than or equal to 255 807 octets, REJECT/RETURN 'client-error-request-value-too-long'. 808 Ignore unsupported values which are the keyword names of unsupported 809 attributes. Don't bother to copy such requested (unsupported) 810 attributes to the Unsupported Attribute response group since the 811 response will not return them. 813 which-jobs (type2 keyword) 815 IF NOT a single 'keyword' value less than or equal to 255 octets, 816 REJECT/RETURN 'client-error-request-value-too-long'. 817 IF NEITHER 'completed' NOR 'not-completed', copy the attribute and 818 the unsupported value to the Unsupported Attributes response group 819 and REJECT/RETURN 'client-error-attributes-or-values-not- 820 supported'. 822 Expires May 16, 1999 824 Note: a Printer still supports the 'completed' value even if it keeps 825 no completed/canceled/aborted jobs: by returning no jobs when so 826 queried. 827 IF NOT supplied by the client, the IPP object assumes the 'not- 828 completed' value. 830 my-jobs (boolean) 832 IF NOT either a single 'true' or 'false' 'boolean' value equal to 1 833 octet, REJECT/RETURN 'client-error-bad-request'. 834 IF NOT supplied by the client, the IPP object assumes the 'false' 835 value. 837 limit (integer(1:MAX)) 839 IF NOT any single 'integer' value equal to 4 octets AND in the range 840 1 to MAX, REJECT/RETURN 'client-error-bad-request'. 841 IF NOT supplied by the client, the IPP object returns all jobs, no 842 matter how many. 844 ----------------------------------------------- 846 2.1.1.6 Validate the values of the OPTIONAL Operation attributes 848 OPTIONAL Operation attributes are those that an IPP object MAY or MAY 849 NOT support. An IPP object validates the values of the OPTIONAL 850 attributes supplied by the client. The IPP object performs the same 851 syntactic validation checks for each OPTIONAL attribute value as in 852 Section 2.1.1.5. As in Section 2.1.1.5, if any fail, the IPP object 853 REJECTS the request and RETURNS the 'client-error-bad-request' or the 854 'client-error-request-value-too-long' status code. 856 In addition, the IPP object checks each Operation attribute value 857 against some Printer attribute or some hard-coded value if there is no 858 "xxx-supported" Printer attribute defined. If its value is not among 859 those supported or is not in the range supported, then the IPP object 860 REJECTS the request and RETURNS the error status code indicated in the 861 table. If the value of the Printer object's "xxx-supported" attribute 862 is 'no-value' (because the system administrator hasn't configured a 863 value), the check always fails. 865 If the IPP object doesn't recognize/support an attribute, the IPP object 866 treats the attribute as an unknown or unsupported attribute (see the 867 last row in the table below). 869 ----------------------------------------------- 871 document-natural-language (naturalLanguage) 873 IF NOT any single non-empty 'naturalLanguage' value less than or 874 equal to 63 octets, REJECT/RETURN 'client-error-request-value-too- 875 long'. 877 Expires May 16, 1999 879 IF NOT a value that the Printer object supports in document formats, 880 (no corresponding "xxx-supported" Printer attribute), REJECT/RETURN 881 'client-error-natural-language-not-supported'. 883 compression (type3 keyword) 885 IF NOT any single 'keyword' values less than or equal to 255 octets, 886 REJECT/RETURN 'client-error-request-value-too-long'. 887 IF NOT in the Printer object's "compression-supported" attribute, 888 copy the attribute and the unsupported value to the Unsupported 889 Attributes response group and REJECT/RETURN 'client-error- 890 attributes-or-values-not-supported'. 892 job-k-octets (integer(0:MAX)) 894 IF NOT any single 'integer' value equal to 4 octets, 895 REJECT/RETURN 'client-error-bad-request'. 896 IF NOT in the range of the Printer object's "job-k-octets-supported" 897 attribute, copy the attribute and the unsupported value to the 898 Unsupported Attributes response group and REJECT/RETURN 'client- 899 error-attributes-or-values-not-supported'. 901 job-impressions (integer(0:MAX)) 903 IF NOT any single 'integer' value equal to 4 octets, 904 REJECT/RETURN 'client-error-bad-request'. 905 IF NOT in the range of the Printer object's "job-impressions- 906 supported" attribute, copy the attribute and the unsupported value 907 to the Unsupported Attributes response group and REJECT/RETURN 908 'client-error-attributes-or-values-not-supported'. 910 job-media-sheets (integer(0:MAX)) 912 IF NOT any single 'integer' value equal to 4 octets, 913 REJECT/RETURN 'client-error-bad-request'. 914 IF NOT in the range of the Printer object's "job-media-supported" 915 attribute, copy the attribute and the unsupported value to the 916 Unsupported Attributes response group and REJECT/RETURN 'client- 917 error-attributes-or-values-not-supported'. 919 message (text(127)) 921 IF NOT any single 'text' value less than or equal to 127 octets, 922 REJECT/RETURN 'client-error-request-value-too-long'. 924 unknown or unsupported attribute 926 IF the attribute syntax supplied by the client is supported but the 927 length is not legal for that attribute syntax, REJECT/RETURN 928 'client-error-request-value-too-long'. 929 ELSE copy the attribute and value to the Unsupported Attributes 930 response group and change the attribute value to the "out-of-band" 931 'unsupported' value, but otherwise ignore the attribute. 933 Expires May 16, 1999 935 Note: Future Operation attributes may be added to the protocol 936 specification that may occur anywhere in the specified group. When 937 the operation is otherwise successful, the IPP object returns the 938 'successful-ok-ignored-or-substituted-attributes' status code. 939 Ignoring unsupported Operation attributes in all operations is 940 analogous to the handling of unsupported Job Template attributes in 941 the create and Validate-Job operations when the client supplies the 942 "ipp-attribute-fidelity" Operation attribute with the 'false' value. 943 This last rule is so that we can add OPTIONAL Operation attributes to 944 future versions of IPP so that older clients can inter-work with new 945 IPP objects and newer clients can inter-work with older IPP objects. 946 (If the new attribute cannot be ignored without performing 947 unexpectedly, the major version number would have been increased in 948 the protocol document and in the request). This rule for Operation 949 attributes is independent of the value of the "ipp-attribute- 950 fidelity" attribute. For example, if an IPP object doesn't support 951 the OPTIONAL "job-k-octets" attribute', the IPP object treats "job-k- 952 octets" as an unknown attribute and only checks the length for the 953 'integer' attribute syntax supplied by the client. If it is not four 954 octets, the IPP object REJECTS the request and RETURNS the 'client- 955 error-bad-request' status code, else the IPP object copies the 956 attribute to the Unsupported Attribute response group, setting the 957 value to the "out-of-band" 'unsupported' value, but otherwise ignores 958 the attribute. 960 2.1.2Suggested Additional Processing Steps for Operations that 961 Create/Validate Jobs and Add Documents 963 This section in combination with the previous section recommends the 964 processing steps for the Print-Job, Validate-Job, Print-URI, Create-Job, 965 Send-Document, and Send-URI operations that IPP objects SHOULD use. 966 These are the operations that create jobs, validate a Print-Job request, 967 and add documents to a job. 969 2.1.2.1 Default "ipp-attribute-fidelity" if not supplied 971 The Printer object checks to see if the client supplied an "ipp- 972 attribute-fidelity" Operation attribute. If the attribute is not 973 supplied by the client, the IPP object assumes that the value is 974 'false'. 976 2.1.2.2 Check that the Printer object is accepting jobs 978 If the value of the Printer object's "printer-is-accepting-jobs" is 979 'false', the Printer object REJECTS the request and RETURNS the 'server- 980 error-not-accepting-jobs' status code. 982 2.1.2.3 Validate the values of the Job Template attributes 984 An IPP object validates the values of all Job Template attribute 985 supplied by the client. The IPP object performs the analogous syntactic 987 Expires May 16, 1999 988 validation checks of each Job Template attribute value that it performs 989 for Operation attributes (see Section 2.1.1.5.): 991 a)that the length of each value is correct for the attribute 992 syntax tag supplied by the client according to [IPP-MOD] Section 993 4.1. 995 b)that the attribute syntax tag is correct for that attribute 996 according to [IPP-MOD] Sections 4.2 to 4.4. 998 c)that multiple values are supplied only for multi-valued 999 attributes, i.e., that are 1setOf X according to [IPP-MOD] 1000 Sections 4.2 to 4.4. 1002 As in Section 2.1.1.5, if any of these syntactic checks fail, the IPP 1003 object REJECTS the request and RETURNS the 'client-error-bad-request' or 1004 'client-error-request-value-too-long' status code as appropriate, 1005 independent of the value of the "ipp-attribute-fidelity". Since such an 1006 error is most likely to be an error detected by a client developer, 1007 rather than by an end-user, the IPP object NEED NOT return an indication 1008 of which attribute had the error in either the Unsupported Attributes 1009 Group or the Status Message. The description for each of these 1010 syntactic checks is explicitly expressed in the first IF statement in 1011 the following table. 1013 In addition, the IPP object loops through all the client-supplied Job 1014 Template attributes, checking to see if the supplied attribute value(s) 1015 are supported or in the range supported, i.e., the value of the "xxx" 1016 attribute in the request is (1) a member of the set of values or is in 1017 the range of values of the Printer' objects "xxx-supported" attribute. 1018 If the value of the Printer object's "xxx-supported" attribute is 'no- 1019 value' (because the system administrator hasn't configured a value), the 1020 check always fails. If the check fails, the IPP object copies the 1021 attribute to the Unsupported Attributes response group with its 1022 unsupported value. If the attribute contains more than one value, each 1023 value is checked and each unsupported value is separately copied, while 1024 supported values are not copied. If an IPP object doesn't 1025 recognize/support a Job Template attribute, i.e., there is no 1026 corresponding Printer object "xxx-supported" attribute, the IPP object 1027 treats the attribute as an unknown or unsupported attribute (see the 1028 last row in the table below). 1030 If some Job Template attributes are supported for some document formats 1031 and not for others or the values are different for different document 1032 formats, the IPP object SHOULD take that into account in this validation 1033 using the value of the "document-format" supplied by the client (or 1034 defaulted to the value of the Printer's "document-format-default" 1035 attribute, if not supplied by the client). For example, if "number-up" 1036 is supported for the 'text/plain' document format, but not for the 1037 'application/postscript' document format, the check SHOULD (though it 1038 NEED NOT) depend on the value of the "document-format" operation 1039 attribute. See "document-format" in [IPP-MOD] section 3.2.1.1 and 1040 3.2.5.1. 1042 Expires May 16, 1999 1043 Note: whether the request is accepted or rejected is determined by the 1044 value of the "ipp-attribute-fidelity" attribute in a subsequent step, so 1045 that all Job Template attribute supplied are examined and all 1046 unsupported attributes and/or values are copied to the Unsupported 1047 Attributes response group. 1049 ----------------------------------------------- 1051 job-priority (integer(1:100)) 1053 IF NOT a single 'integer' value with a length equal to 4 octets, 1054 REJECT/RETURN 'client-error-bad-request'. 1055 IF NOT supplied by the client, use the value of the Printer object's 1056 "job-priority-default" attribute at job submission time. 1057 IF NOT in the range 1 to 100, inclusive, copy the attribute and the 1058 unsupported value to the Unsupported Attributes response group. 1059 Map the value to the nearest supported value in the range 1:100 as 1060 specified by the number of discrete values indicated by the value 1061 of the Printer's "job-priority-supported" attribute. See the 1062 formula in [IPP-MOD] Section 4.2.1. 1064 job-hold-until (type3 keyword | name) 1066 IF NOT a single 'keyword' or 'name' value with a length less than or 1067 equal to 255 octets, REJECT/RETURN 'client-error-request-value-too- 1068 long'. 1069 IF NOT supplied by the client, use the value of the Printer object's 1070 "job-hold-until" attribute at job submission time. 1071 IF NOT in the Printer object's "job-hold-until-supported" attribute, 1072 copy the attribute and the unsupported value to the Unsupported 1073 Attributes response group. 1075 job-sheets (type3 keyword | name) 1077 IF NOT a single 'keyword' or 'name' value with a length less than or 1078 equal to 255 octets, REJECT/RETURN 'client-error-request-value-too- 1079 long'. 1080 IF NOT in the Printer object's "job-sheets-supported" attribute, copy 1081 the attribute and the unsupported value to the Unsupported 1082 Attributes response group. 1084 multiple-document-handling (type2 keyword) 1086 IF NOT a single 'keyword' value with a length less than or equal to 1087 255 octets, REJECT/RETURN 'client-error-request-value-too-long'. 1088 IF NOT in the Printer object's "multiple-document-handling-supported" 1089 attribute, copy the attribute and the unsupported value to the 1090 Unsupported Attributes response group. 1092 copies (integer(1:MAX)) 1094 IF NOT a single 'integer' value with a length equal to 4 octets, 1095 REJECT/RETURN 'client-error-bad-request'. 1096 IF NOT in range of the Printer object's "copies-supported" attribute 1098 Expires May 16, 1999 1099 copy the attribute and the unsupported value to the Unsupported 1100 Attributes response group. 1102 finishings (1setOf type2 enum) 1104 IF NOT an 'enum' value(s) each with a length equal to 4 octets, 1105 REJECT/RETURN 'client-error-bad-request'. 1106 IF NOT in the Printer object's "finishings-supported" attribute, copy 1107 the attribute and the unsupported value(s), but not any supported 1108 values, to the Unsupported Attributes response group. 1110 page-ranges (1setOf rangeOfInteger(1:MAX)) 1112 IF NOT a 'rangeOfInteger' value(s) each with a length equal to 8 1113 octets, REJECT/RETURN 'client-error-bad-request'. 1114 IF first value is greater than second value in any range, the ranges 1115 are not in ascending order, or ranges overlap, REJECT/RETURN 1116 'client-error-bad-request'. 1117 IF the value of the Printer object's "page-ranges-supported" 1118 attribute is 'false', copy the attribute to the Unsupported 1119 Attributes response group and set the value to the "out-of-band" 1120 'unsupported' value. 1122 sides (type2 keyword) 1124 IF NOT a single 'keyword' value with a length less than or equal to 1125 255 octets, REJECT/RETURN 'client-error-request-value-too-long'. 1126 IF NOT in the Printer object's "sides-supported" attribute, copy the 1127 attribute and the unsupported value to the Unsupported Attributes 1128 response group. 1130 number-up (integer(1:MAX)) 1132 IF NOT a single 'integer' value with a length equal to 4 octets, 1133 REJECT/RETURN 'client-error-bad-request'. 1134 IF NOT a value or in the range of one of the values of the Printer 1135 object's "number-up-supported" attribute, copy the attribute and 1136 value to the Unsupported Attribute response group. 1138 orientation-requested (type2 enum) 1140 IF NOT a single 'enum' value with a length equal to 4 octets, 1141 REJECT/RETURN 'client-error-bad-request'. 1142 IF NOT in the Printer object's "orientation-requested-supported" 1143 attribute, copy the attribute and the unsupported value to the 1144 Unsupported Attributes response group. 1146 media (type3 keyword | name) 1148 IF NOT a single 'keyword' or 'name' value with a length less than or 1149 equal to 255 octets, REJECT/RETURN 'client-error-request-value-too- 1150 long'. 1152 Expires May 16, 1999 1154 IF NOT in the Printer object's "media-supported" attribute, copy the 1155 attribute and the unsupported value to the Unsupported Attributes 1156 response group. 1158 printer-resolution (resolution) 1160 IF NOT a single 'resolution' value with a length equal to 9 octets, 1161 REJECT/RETURN 'client-error-bad-request'. 1162 IF NOT in the Printer object's "multiple-document-handling-supported" 1163 attribute, copy the attribute and the unsupported value to the 1164 Unsupported Attributes response group. 1166 print-quality (type2 enum) 1168 IF NOT a single 'enum' value with a length equal to 4 octets, 1169 REJECT/RETURN 'client-error-bad-request'. 1170 IF NOT in the Printer object's "print-quality-supported" attribute, 1171 copy the attribute and the unsupported value to the Unsupported 1172 Attributes response group. 1174 unknown or unsupported attribute (i.e., there is no corresponding 1175 Printer object "xxx-supported" attribute) 1177 IF the attribute syntax supplied by the client is supported but the 1178 length is not legal for that attribute syntax, 1179 REJECT/RETURN 'client-error-bad-request' if the length of the 1180 attribute syntax is fixed or 'client-error-request-value-too-long' 1181 if the length of the attribute syntax is variable. 1182 ELSE copy the attribute and value to the Unsupported Attributes 1183 response group and change the attribute value to the "out-of-band" 1184 'unsupported' value. Any remaining Job Template Attributes are 1185 either unknown or unsupported Job Template attributes and are 1186 validated algorithmically according to their attribute syntax for 1187 proper length (see below). 1189 ----------------------------------------------- 1191 If the attribute syntax is supported AND the length check fails, the IPP 1192 object REJECTS the request and RETURNS the 'client-error-bad-request' if 1193 the length of the attribute syntax is fixed or the 'client-error- 1194 request-value-too-long' status code if the length of the attribute 1195 syntax is variable. Otherwise, the IPP object copies the unsupported Job 1196 Template attribute to the Unsupported Attributes response group and 1197 changes the attribute value to the "out-of-band" 'unsupported' value. 1198 The following table shows the length checks for all attribute syntaxes. 1199 In the following table: "<=" means less than or equal, "=" means equal 1200 to: 1202 Expires May 16, 1999 1203 Name Octet length check for read-write attributes 1204 ----------- -------------------------------------------- 1205 'textWithLanguage <= 1023 AND 'naturalLanguage' <= 63 1206 'textWithoutLanguage' <= 1023 1207 'nameWithLanguage' <= 255 AND 'naturalLanguage' <= 63 1208 'nameWithoutLanguage' <= 255 1209 'keyword' <= 255 1210 'enum' = 4 1211 'uri' <= 1023 1212 'uriScheme' <= 63 1213 'charset' <= 63 1214 'naturalLanguage' <= 63 1215 'mimeMediaType' <= 255 1216 'octetString' <= 1023 1217 'boolean' = 1 1218 'integer' = 4 1219 'rangeOfInteger' = 8 1220 'dateTime' = 11 1221 'resolution' = 9 1222 '1setOf X' 1224 2.1.2.4 Check for conflicting Job Template attributes values 1226 Once all the Operation and Job Template attributes have been checked 1227 individually, the Printer object SHOULD check for any conflicting values 1228 among all the supported values supplied by the client. For example, a 1229 Printer object might be able to staple and to print on transparencies, 1230 however due to physical stapling constraints, the Printer object might 1231 not be able to staple transparencies. The IPP object copies the 1232 supported attributes and their conflicting attribute values to the 1233 Unsupported Attributes response group. The Printer object only copies 1234 over those attributes that the Printer object either ignores or 1235 substitutes in order to resolve the conflict, and it returns the 1236 original values which were supplied by the client. For example suppose 1237 the client supplies "finishings" equals 'staple' and "media" equals 1238 'transparency', but the Printer object does not support stapling 1239 transparencies. If the Printer chooses to ignore the stapling request 1240 in order to resolve the conflict, the Printer objects returns 1241 "finishings" equal to 'staple' in the Unsupported Attributes response 1242 group. If any attributes are multi-valued, only the conflicting values 1243 of the attributes are copied. 1245 Note: The decisions made to resolve the conflict (if there is a choice) 1246 is implementation dependent. 1248 2.1.2.5 Decide whether to REJECT the request 1250 If there were any unsupported Job Template attributes or 1251 unsupported/conflicting Job Template attribute values and the client 1252 supplied the "ipp-attribute-fidelity" attribute with the 'true' value, 1253 the Printer object REJECTS the request and return the status code: 1255 Expires May 16, 1999 1256 (1) 'client-error-conflicting-attributes' status code, if there were 1257 any conflicts between attributes supplied by the client. 1258 (2) 'client-error-attributes-or-values-not-supported' status code, 1259 otherwise. 1261 Note: Unsupported Operation attributes or values that are returned do 1262 not affect the status returned in this step. If the unsupported 1263 Operation attribute was a serious error, the above already rejected the 1264 request in a previous step. If control gets to this step with 1265 unsupported Operation attributes being returned, they are not serious 1266 errors. 1268 2.1.2.6 For the Validate-Job operation, RETURN one of the success 1269 status codes 1271 If the requested operation is the Validate-Job operation, the Printer 1272 object returns: 1274 (1) the "successful-ok" status code, if there are no unsupported or 1275 conflicting Job Template attributes or values. 1276 (2) the "successful-ok-conflicting-attributes, if there are any 1277 conflicting Job Template attribute or values. 1278 (3) the "successful-ok-ignored-or-substituted-attributes, if there 1279 are only unsupported Job Template attributes or values. 1281 Note: Unsupported Operation attributes or values that are returned do 1282 not affect the status returned in this step. If the unsupported 1283 Operation attribute was a serious error, the above already rejected the 1284 request in a previous step. If control gets to this step with 1285 unsupported Operation attributes being returned, they are not serious 1286 errors. 1288 2.1.2.7 Create the Job object with attributes to support 1290 If "ipp-attribute-fidelity" is set to 'false' (or it was not supplied by 1291 the client), the Printer object: 1293 (1) creates a Job object, assigns a unique value to the job's "job- 1294 uri" and "job-id" attributes, and initializes all of the job's 1295 other supported Job Description attributes. 1296 (2) removes all unsupported attributes from the Job object. 1297 (3) for each unsupported value, removes either the unsupported value 1298 or substitutes the unsupported attribute value with some supported 1299 value. If an attribute has no values after removing unsupported 1300 values from it, the attribute is removed from the Job object (so 1301 that the normal default behavior at job processing time will take 1302 place for that attribute). 1303 (4) for each conflicting value, removes either the conflicting value 1304 or substitutes the conflicting attribute value with some other 1305 supported value. If an attribute has no values after removing 1306 conflicting values from it, the attribute is removed from the Job 1308 Expires May 16, 1999 1309 object (so that the normal default behavior at job processing time 1310 will take place for that attribute). 1312 If there were no attributes or values flagged as unsupported, or the 1313 value of 'ipp-attribute-fidelity" was 'false', the Printer object is 1314 able to accept the create request and create a new Job object. If the 1315 "ipp-attribute-fidelity" attribute is set to 'true', the Job Template 1316 attributes that populate the new Job object are necessarily all the Job 1317 Template attributes supplied in the create request. If the "ipp- 1318 attribute-fidelity" attribute is set to 'false', the Job Template 1319 attributes that populate the new Job object are all the client supplied 1320 Job Template attributes that are supported or that have value 1321 substitution. Thus, some of the requested Job Template attributes may 1322 not appear in the Job object because the Printer object did not support 1323 those attributes. The attributes that populate the Job object are 1324 persistently stored with the Job object for that Job. A Get-Job- 1325 Attributes operation on that Job object will return only those 1326 attributes that are persistently stored with the Job object. 1328 Note: All Job Template attributes that are persistently stored with the 1329 Job object are intended to be "override values"; that is, they that take 1330 precedence over whatever other embedded instructions might be in the 1331 document data itself. However, it is not possible for all Printer 1332 objects to realize the semantics of "override". End users may query the 1333 Printer's "pdl-override-supported" attribute to determine if the Printer 1334 either attempts or does not attempt to override document data 1335 instructions with IPP attributes. 1337 There are some cases, where a Printer supports a Job Template attribute 1338 and has an associated default value set for that attribute. In the case 1339 where a client does not supply the corresponding attribute, the Printer 1340 does not use its default values to populate Job attributes when creating 1341 the new Job object; only Job Template attributes actually in the create 1342 request are used to populate the Job object. The Printer's default 1343 values are only used later at Job processing time if no other IPP 1344 attribute or instruction embedded in the document data is present. 1346 Note: If the default values associated with Job Template attributes that 1347 the client did not supply were to be used to populate the Job object, 1348 then these values would become "override values" rather than defaults. 1349 If the Printer supports the 'attempted' value of the "pdl-override- 1350 supported" attribute, then these override values could replace values 1351 specified within the document data. This is not the intent of the 1352 default value mechanism. A default value for an attribute is used only 1353 if the create request did not specify that attribute (or it was ignored 1354 when allowed by "ipp-attribute-fidelity" being 'false') and no value was 1355 provided within the content of the document data. 1357 If the client does not supply a value for some Job Template attribute, 1358 and the Printer does not support that attribute, as far as IPP is 1359 concerned, the result of processing that Job (with respect to the 1360 missing attribute) is undefined. 1362 Expires May 16, 1999 1363 2.1.2.8 Return one of the success status codes 1365 Once the Job object has been created, the Printer object accepts the 1366 request and returns to the client: 1368 (1) the 'successful-ok' status code, if there are no unsupported or 1369 conflicting Job Template attributes or values. 1370 (2) the 'successful-ok-conflicting-attributes' status code, if there 1371 are any conflicting Job Template attribute or values. 1372 (3) the 'successful-ok-ignored-or-substituted-attributes' status 1373 code, if there are only unsupported Job Template attributes or 1374 values. 1376 Note: Unsupported Operation attributes or values that are returned do 1377 not affect the status returned in this step. If the unsupported 1378 Operation attribute was a serious error, the above already rejected the 1379 request in a previous step. If control gets to this step with 1380 unsupported Operation attributes being returned, they are not serious 1381 errors. 1383 The Printer object also returns Job status attributes that indicate the 1384 initial state of the Job ('pending', 'pending-held', 'processing', 1385 etc.), etc. See Print-Job Response, [IPP-MOD] section 3.2.1.2. 1387 2.1.2.9 Accept appended Document Content 1389 The Printer object accepts the appended Document Content data and either 1390 starts it printing, or spools it for later processing. 1392 2.1.2.10 Scheduling and Starting to Process the Job 1394 The Printer object uses its own configuration and implementation 1395 specific algorithms for scheduling the Job in the correct processing 1396 order. Once the Printer object begins processing the Job, the Printer 1397 changes the Job's state to 'processing'. If the Printer object supports 1398 PDL override (the "pdl-override-supported" attribute set to 1399 'attempted'), the implementation does its best to see that IPP 1400 attributes take precedence over embedded instructions in the document 1401 data. 1403 2.1.2.11 Completing the Job 1405 The Printer object continues to process the Job until it can move the 1406 Job into the 'completed' state. If an Cancel-Job operation is received, 1407 the implementation eventually moves the Job into the 'canceled' state. 1408 If the system encounters errors during processing that do not allow it 1409 to progress the Job into a completed state, the implementation halts all 1410 processing, cleans up any resources, and moves the Job into the 1411 'aborted' state. 1413 Expires May 16, 1999 1414 2.1.2.12 Destroying the Job after completion 1416 Once the Job moves to the 'completed', 'aborted', or 'canceled' state, 1417 it is an implementation decision as to when to destroy the Job object 1418 and release all associated resources. Once the Job has been destroyed, 1419 the Printer would return either the "client-error-not-found" or "client- 1420 error-gone" status codes for operations directed at that Job. 1422 Note: the Printer object SHOULD NOT re-use a "job-uri" or "job-id" 1423 value for a sufficiently long time after a job has been destroyed, so 1424 that stale references kept by clients are less likely to access the 1425 wrong (newer) job. 1427 2.1.2.13 Interaction with "ipp-attribute-fidelity" 1429 Some Printer object implementations may support "ipp-attribute-fidelity" 1430 set to 'true' and "pdl-override-supported" set to 'attempted' and yet 1431 still not be able to realize exactly what the client specifies in the 1432 create request. This is due to legacy decisions and assumptions that 1433 have been made about the role of job instructions embedded within the 1434 document data and external job instructions that accompany the document 1435 data and how to handle conflicts between such instructions. The 1436 inability to be 100% precise about how a given implementation will 1437 behave is also compounded by the fact that the two special attributes, 1438 "ipp-attribute-fidelity" and "pdl-override-supported", apply to the 1439 whole job rather than specific values for each attribute. For example, 1440 some implementations may be able to override almost all Job Template 1441 attributes except for "number-up". 1443 2.2 Status codes returned by operation 1445 This section lists all status codes once in the first operation (Print- 1446 Job). Then it lists the status codes that are different or specialized 1447 for subsequent operations under each operation. 1449 2.2.1Printer Operations 1451 2.2.1.1 Print-Job 1453 The Printer object MUST return one of the following "status-code" values 1454 for the indicated reason. Whether all of the document data has been 1455 accepted or not before returning the success or error response depends 1456 on implementation. See Section 14 for a more complete description of 1457 each status code. 1459 For the following success status codes, the Job object has been created 1460 and the "job-id", and "job-uri" assigned and returned in the response: 1462 successful-ok: no request attributes were substituted or ignored. 1463 successful-ok-ignored-or-substituted-attributes: some supplied (1) 1464 attributes were ignored or (2) unsupported attribute syntaxes or 1465 values were substituted with supported values or were ignored. 1467 Expires May 16, 1999 1468 Unsupported attributes, attribute syntaxes, or values MUST be 1469 returned in the Unsupported Attributes group of the response. 1470 successful-ok-conflicting-attributes: some supplied attribute values 1471 conflicted with the values of other supplied attributes and were 1472 either substituted or ignored. Attributes or values which conflict 1473 with other attributes and have been substituted or ignored MUST be 1474 returned in the Unsupported Attributes group of the response as 1475 supplied by the client. 1477 For the following error status codes, no job is created and no "job-id" 1478 or "job-uri" is returned: 1480 client-error-bad-request: The request syntax does not conform to the 1481 specification. The IPP object SHOULD NOT return the "status- 1482 message" operation attributes, if supported, if the "attributes- 1483 charset" in the request has not been processed. 1484 client-error-forbidden: The request is being refused for 1485 authorization or authentication reasons. The implementation 1486 security policy is to not reveal whether the failure is one of 1487 authentication or authorization. 1488 client-error-not-authenticated: Either the request requires 1489 authentication information to be supplied or the authentication 1490 information is not sufficient for authorization. 1491 client-error-not-authorized: The requester is not authorized to 1492 perform the request on the target object. 1493 client-error-not-possible: The request cannot be carried out because 1494 of the state of the system. See also 'server-error-not-accepting- 1495 jobs' status code which MUST take precedence if the Printer 1496 object's "printer-accepting-jobs" attribute is 'false'. 1497 client-error-timeout: not applicable. 1498 client-error-not-found: the target object does not exist. 1499 client-error-gone: the target object no longer exists and no 1500 forwarding address is known. 1501 client-error-request-entity-too-large: the size of the request 1502 and/or print data exceeds the capacity of the IPP Printer to 1503 process it. 1504 client-error-request-value-too-long: the size of request variable 1505 length attribute values, such as 'text' and 'name' attribute 1506 syntaxes, exceed the maximum length specified in [IPP-MOD] for the 1507 attribute and MUST be returned in the Unsupported Attributes Group. 1508 client-error-document-format-not-supported: the document format 1509 supplied is not supported. The "document-format" attribute with 1510 the unsupported value MUST be returned in the Unsupported 1511 Attributes Group. This error SHOULD take precedence over any other 1512 'xxx-not-supported' error, except 'client-error-charset-not- 1513 supported'. 1514 client-error-attributes-or-values-not-supported: one or more 1515 supplied attributes, attribute syntaxes, or values are not 1516 supported and the client supplied the "ipp-attributes-fidelity" 1517 operation attribute with a 'true' value. They MUST be returned in 1518 the Unsupported Attributes Group as explained below. 1519 client-error-uri-scheme-not-supported: not applicable. 1520 client-error-charset-not-supported: the charset supplied in the 1521 "attributes-charset" operation attribute is not supported. The 1523 Expires May 16, 1999 1524 Printer's "configured-charset" MUST be returned in the response as 1525 the value of the "attributes-charset" operation attribute and used 1526 for any 'text' and 'name' attributes returned in the error 1527 response. This error SHOULD take precedence over any other error, 1528 unless the request syntax is so bad that the client's supplied 1529 "attributes-charset" cannot be determined. 1530 client-error-conflicting-attributes: one or more supplied attribute 1531 values conflicted with each other and the client supplied the "ipp- 1532 attributes-fidelity" operation attribute with a 'true' value. They 1533 MUST be returned in the Unsupported Attributes Group as explained 1534 below. 1535 server-error-internal-error: an unexpected condition prevents the 1536 request from being fulfilled. 1537 server-error-operation-not-supported: not applicable (since Print- 1538 Job is REQUIRED). 1539 server-error-service-unavailable: the service is temporarily 1540 overloaded. 1541 server-error-version-not-supported: the version in the request is 1542 not supported. The "closest" version number supported MUST be 1543 returned in the response. 1544 server-error-device-error: a device error occurred while receiving 1545 or spooling the request or document data or the IPP Printer object 1546 can only accept one job at a time. 1547 server-error-temporary-error: a temporary error such as a buffer 1548 full write error, a memory overflow, or a disk full condition 1549 occurred while receiving the request and/or the document data. 1550 server-error-not-accepting-jobs: the Printer object's "printer-is- 1551 not-accepting-jobs" attribute is 'false'. 1552 server-error-busy: the Printer is too busy processing jobs to accept 1553 another job at this time. 1554 server-error-job-canceled: the job has been canceled by an operator 1555 or the system while the client was transmitting the document data. 1557 2.2.1.2 Print-URI 1559 All of the Print-Job status codes described in Section 3.2.1.2 Print-Job 1560 Response are applicable to Print-URI with the following specializations 1561 and differences. See Section 14 for a more complete description of each 1562 status code. 1564 server-error-uri-scheme-not-supported: the URI scheme supplied in 1565 the "document-uri" operation attribute is not supported and is 1566 returned in the Unsupported Attributes group. 1568 2.2.1.3 Validate-Job 1570 All of the Print-Job status codes described in Section 3.2.1.2 Print-Job 1571 Response are applicable to Validate-Job. See Section 14 for a more 1572 complete description of each status code. 1574 2.2.1.4 Create-Job 1576 All of the Print-Job status codes described in Section 3.2.1.2 Print-Job 1577 Response are applicable to Create-Job with the following specializations 1579 Expires May 16, 1999 1580 and differences. See Section 14 for a more complete description of each 1581 status code. 1583 server-error-operation-not-supported: the Create-Job operation is 1584 not supported. 1586 2.2.1.5 Get-Printer-Attributes 1588 All of the Print-Job status codes described in Section 3.2.1.2 Print-Job 1589 Response are applicable to the Get-Printer-Attributes operation with the 1590 following specializations and differences. See Section 14 for a more 1591 complete description of each status code. 1593 For the following success status codes, the requested attributes are 1594 returned in Group 3 in the response: 1596 successful-ok: no request attributes were substituted or ignored 1597 (same as Print-Job) and no requested attributes were unsupported. 1598 successful-ok-ignored-or-substituted-attributes: same as Print-Job, 1599 except the "requested-attributes" operation attribute MAY, but NEED 1600 NOT, be returned with the unsupported values. 1601 successful-ok-conflicting-attributes: same as Print-Job. 1603 For the error status codes, Group 3 is returned containing no attributes 1604 or is not returned at all: 1606 client-error-not-possible: Same as Print-Job, in addition the 1607 Printer object is not accepting any requests. 1608 client-error-request-entity-too-large: same as Print-job, except 1609 that no print data is involved. 1610 client-error-attributes-or-values-not-supported: not applicable, 1611 since unsupported operation attributes MUST be ignored and 1612 'successful-ok-ignored-or-substituted-attributes' returned. 1613 client-error-conflicting-attributes: same as Print-Job, except that 1614 "ipp-attribute-fidelity" is not involved. 1615 server-error-operation-not-supported: not applicable (since Get- 1616 Printer-Attributes is REQUIRED). 1617 server-error-device-error: same as Print-Job, except that no 1618 document data is involved. 1619 server-error-temporary-error: same as Print-Job, except that no 1620 document data is involved. 1621 server-error-not-accepting-jobs: not applicable.. 1622 server-error-busy: same as Print-Job, except the IPP object is too 1623 busy to accept even query requests. 1624 server-error-job-canceled: not applicable.. 1626 2.2.1.6 Get-Jobs 1628 All of the Print-Job status codes described in Section 3.2.1.2 Print-Job 1629 Response are applicable to the Get-Jobs operation with the following 1630 specializations and differences. See Section 14 for a more complete 1631 description of each status code. 1633 For the following success status codes, the requested attributes are 1634 returned in Group 3 in the response: 1636 Expires May 16, 1999 1637 successful-ok: no request attributes were substituted or ignored 1638 (same as Print-Job) and no requested attributes were unsupported. 1639 successful-ok-ignored-or-substituted-attributes: same as Print-Job, 1640 except the "requested-attributes" operation attribute MAY, but NEED 1641 NOT, be returned with the unsupported values. 1642 successful-ok-conflicting-attributes: same as Print-Job. 1644 For any error status codes, Group 3 is returned containing no attributes 1645 or is not returned at all. The following brief error status code 1646 descriptions contain unique information for use with Get-Jobs operation. 1647 See section 14 for the other error status codes that apply uniformly to 1648 all operations: 1650 client-error-not-possible: Same as Print-Job, in addition the 1651 Printer object is not accepting any requests. 1652 client-error-request-entity-too-large: same as Print-job, except 1653 that no print data is involved. 1654 client-error-document-format-not-supported: not applicable. 1655 client-error-attributes-or-values-not-supported: not applicable, 1656 since unsupported operation attributes MUST be ignored and 1657 'successful-ok-ignored-or-substituted-attributes' returned. 1658 client-error-conflicting-attributes: same as Print-Job, except that 1659 "ipp-attribute-fidelity" is not involved. 1660 server-error-operation-not-supported: not applicable (since Get-Jobs 1661 is REQUIRED). 1662 server-error-device-error: same as Print-Job, except that no 1663 document data is involved. 1664 server-error-temporary-error: same as Print-Job, except that no 1665 document data is involved. 1666 server-error-not-accepting-jobs: not applicable. 1667 server-error-job-canceled: not applicable. 1669 2.2.2Job Operations 1671 2.2.2.1 Send-Document 1673 All of the Print-Job status codes described in Section 3.2.1.2 Print-Job 1674 Response are applicable to the Get-Printer-Attributes operation with the 1675 following specializations and differences. See Section 14 for a more 1676 complete description of each status code. 1678 For the following success status codes, the document has been added to 1679 the specified Job object and the job's "number-of-documents" attribute 1680 has been incremented: 1682 successful-ok: no request attributes were substituted or ignored 1683 (same as Print-Job). 1684 successful-ok-ignored-or-substituted-attributes: same as Print-Job. 1685 successful-ok-conflicting-attributes: same as Print-Job. 1687 For the error status codes, no document has been added to the Job object 1688 and the job's "number-of-documents" attribute has not been incremented: 1690 client-error-not-possible: Same as Print-Job, except that the 1691 Printer's "printer-is-accepting-jobs" attribute is not involved, so 1692 that the client is able to finish submitting a multi-document job 1694 Expires May 16, 1999 1695 after this attribute has been set to 'true'. Another condition is 1696 that the state of the job precludes Send-Document, i.e., the job 1697 has already been closed out by the client. However, if the IPP 1698 Printer closed out the job due to timeout, the 'client-error- 1699 timeout' error status SHOULD be returned instead. 1700 client-error-timeout: This request was sent after the Printer closed 1701 the job, because it has not received a Send-Document or Send-URI 1702 operation within the Printer's "multiple-operation-time-out" period 1703 . 1704 client-error-request-entity-too-large: same as Print-Job. 1705 client-error-conflicting-attributes: same as Print-Job, except that 1706 "ipp-attributes-fidelity" operation attribute is not involved.. 1707 server-error-operation-not-supported: the Send-Document request is 1708 not supported. 1709 server-error-not-accepting-jobs: not applicable. 1710 server-error-job-canceled: the job has been canceled by an operator 1711 or the system while the client was transmitting the data. 1713 2.2.2.2 Send-URI 1715 All of the Print-Job status code descriptions in Section 3.2.1.2 Print- 1716 Job Response with the specializations described for Send-Document are 1717 applicable to Send-URI. See Section 14 for a more complete description 1718 of each status code. 1720 server-error-uri-scheme-not-supported: the URI scheme supplied in 1721 the "document-uri" operation attribute is not supported and the 1722 "document-uri" attribute MUST be returned in the Unsupported 1723 Attributes group. 1725 2.2.2.3 Cancel-Job 1727 All of the Print-Job status codes described in Section 3.2.1.2 Print-Job 1728 Response are applicable to Cancel-Job with the following specializations 1729 and differences. See Section 14 for a more complete description of each 1730 status code. 1732 For the following success status codes, the Job object is being canceled 1733 or has been canceled: 1735 successful-ok: no request attributes were substituted or ignored 1736 (same as Print-Job). 1737 successful-ok-ignored-or-substituted-attributes: same as Print-Job. 1738 successful-ok-conflicting-attributes: same as Print-Job. 1740 For any of the error status codes, the Job object has not been canceled 1741 or was previously canceled. 1743 client-error-not-possible: The request cannot be carried out because 1744 of the state of the Job object ('completed', 'canceled', or 1745 'aborted') or the state of the system. 1746 client-error-not-found: the target Printer and/or Job object does 1747 not exist. 1748 client-error-gone: the target Printer and/or Job object no longer 1749 exists and no forwarding address is known. 1751 Expires May 16, 1999 1753 client-error-request-entity-too-large: same as Print-Job, except no 1754 document data is involved. 1755 client-error-document-format-not-supported: not applicable. 1756 client-error-attributes-or-values-not-supported: not applicable, 1757 since unsupported operation attributes and values MUST be ignored. 1758 client-error-conflicting-attributes: same as Print-Job, except that 1759 the Printer's "printer-is-accepting-jobs" attribute is not 1760 involved. 1761 server-error-operation-not-supported: not applicable (Cancel-Job is 1762 REQUIRED). 1763 server-error-device-error: same as Print-Job, except no document 1764 data is involved. 1765 server-error-temporary-error: same as Print-Job, except no document 1766 data is involved. 1767 server-error-not-accepting-jobs: not applicable.. 1768 server-error-job-canceled: not applicable. 1770 2.2.2.4 Get-Job-Attributes 1772 All of the Print-Job status codes described in Section 3.2.1.2 Print-Job 1773 Response are applicable to Get-Job-Attributes with the following 1774 specializations and differences. See Section 14 for a more complete 1775 description of each status code. 1777 For the following success status codes, the requested attributes are 1778 returned in Group 3 in the response: 1780 successful-ok: no request attributes were substituted or ignored 1781 (same as Print-Job) and no requested attributes were unsupported. 1782 successful-ok-ignored-or-substituted-attributes: same as Print-Job, 1783 except the "requested-attributes" operation attribute MAY, but NEED 1784 NOT, be returned with the unsupported values. 1785 successful-ok-conflicting-attributes: same as Print-Job. 1787 For the error status codes, Group 3 is returned containing no attributes 1788 or is not returned at all. 1790 client-error-not-possible: Same as Print-Job, in addition the 1791 Printer object is not accepting any requests. 1792 client-error-document-format-not-supported: not applicable. 1793 client-error-attributes-or-values-not-supported: not applicable. 1794 client-error-uri-scheme-not-supported: not applicable. 1795 client-error-conflicting-attributes: not applicable 1796 server-error-operation-not-supported: not applicable (since Get-Job- 1797 Attributes is REQUIRED). 1798 server-error-device-error: same as Print-Job, except no document 1799 data is involved. 1800 server-error-temporary-error: sane as Print-Job, except no document 1801 data is involved.. 1802 server-error-not-accepting-jobs: not applicable. 1803 server-error-job-canceled: not applicable. 1805 Expires May 16, 1999 1807 2.3 Validate-Job 1809 The Validate-Job operation has been designed so that its implementation 1810 may be a part of the Print-Job operation. Therefore, requiring 1811 Validate-Job is not a burden on implementers. Also it is useful for 1812 client's to be able to count on its presence in all conformance 1813 implementations, so that the client can determine before sending a long 1814 document, whether the job will be accepted by the IPP Printer or not. 1816 2.4 Case Sensitivity in URIs 1818 IPP client and server implementations must be aware of the diverse 1819 uppercase/lowercase nature of URIs. RFC 2396 defines URL schemes and 1820 Host names as case insensitive but reminds us that the rest of the URL 1821 may well demonstrate case sensitivity. When creating URL's for fields 1822 where the choice is completely arbitrary, it is probably best to select 1823 lower case. However, this cannot be guaranteed and implementations MUST 1824 NOT rely on any fields being case-sensitive or case-insensitive in the 1825 URL beyond the URL scheme and host name fields. 1827 The reason that the IPP specification does not make any restrictions on 1828 URIs, is so that implementations of IPP may use off-the-shelf components 1829 that conform to the standards that define URIs, such as RFC 2396 and the 1830 HTTP/1.1 specifications [RFC2068]. See these specifications for rules 1831 of matching, comparison, and case-sensitivity. 1833 It is also recommended that that System Administrators and 1834 implementations avoid creating URLs for different printers that differ 1835 only in their case. For example, don't have Printer1 and printer1 as 1836 two different IPP Printers. 1838 The HTTP/1.1 specification [RFC2068] contains more details on comparing 1839 URLs. 1841 2.5 Natural Language Override (NLO) 1843 The 'text' and 'name' attributes each have two forms. One has an 1844 implicit natural language, and the other has an explicit natural 1845 language. The 'textWithoutLanguage' and 'textWithoutLanguage' are the 1846 two 'text' forms. The 'nameWithoutLanguage" and 'nameWithLanguage are 1847 the two 'name' forms. If a receiver (IPP object or IPP client) supports 1848 an attribute with attribute syntax 'text', it MUST support both forms in 1849 a request and a response. A sender (IPP client or IPP object) MAY send 1850 either form for any such attribute. When a sender sends a 1851 WithoutLanguage form, the implicit natural language is specified in the 1852 "attributes-natural-language" operation attribute which all senders MUST 1853 include in every request and response. 1855 When a sender sends a WithLanguage form, it MAY be different from the 1856 implicit natural language supplied by the sender or it MAY be the same. 1857 The receiver MUST treat either form equivalently. 1859 Expires May 16, 1999 1860 There is an implementation decision for senders, whether to always send 1861 the WithLanguage forms or use the WithoutLanguage form when the 1862 attribute's natural language is the same as the request or response. 1863 The former approach makes the sender implementation simpler. The latter 1864 approach is more efficient on the wire and allows inter-working with 1865 non-conforming receivers that fail to support the WithLanguage forms. 1866 As each approach have advantages, the choice is completely up to the 1867 implementer of the sender. 1869 Furthermore, when a client receives a 'text' or 'name' job attribute 1870 that it had previously supplied, that client MUST NOT expect to see the 1871 attribute in the same form, i.e., in the same WithoutLanguage or 1872 WithLanguage form as the client supplied when it created the job. The 1873 IPP object is free to transform the attribute from the WithLanguage form 1874 to the WithoutLanguage form and vice versa, as long as the natural 1875 language is preserved. However, in order to meet this latter 1876 requirement, it is usually simpler for the IPP object implementation to 1877 store the natural language explicitly with the attribute value, i.e., to 1878 store using an internal representation that resembles the WithLanguage 1879 form. 1881 The IPP Printer MUST copy the natural language of a job, i.e., the value 1882 of the "attributes-natural-language" operation attribute supplied by the 1883 client in the create operation, to the Job object as a Job Description 1884 attribute, so that a client is able to query it. In returning a Get- 1885 Job-Attributes response, the IPP object MAY return one of three natural 1886 language values in the response's "attributes-natural-language" 1887 operation attribute: (1) that requested by the requester, (2) the 1888 natural language of the job, or (3) the configured natural language of 1889 the IPP Printer, if the requested language is not supported by the IPP 1890 Printer. 1892 This "attributes-natural-language" Job Description attribute is useful 1893 for an IPP object implementation that prints start sheets in the 1894 language of the user who submitted the job. This same Job Description 1895 attribute is useful to a multi-lingual operator who has to communicate 1896 with different job submitters in different natural languages. This same 1897 Job Description attribute is expected to be used in the future to 1898 generate notification messages in the natural language of the job 1899 submitter. 1901 Early drafts of [IPP-MOD] contained a job-level natural language 1902 override (NLO) for the Get-Jobs response. A job-level (NLO) is an 1903 (unrequested) Job Attribute which then specified the implicit natural 1904 language for any other WithoutLanguage job attributes returned in the 1905 response for that job. Interoperability testing of early 1906 implementations showed that no one was implementing the job-level NLO in 1907 Get-Job responses. So the job-level NLO was eliminated from the Get- 1908 Jobs response. This simplification makes all requests and responses 1909 consistent in that the implicit natural language for any WithoutLanguage 1910 'text' or 'name' form is always supplied in the request's or response's 1911 "attributes-natural-language" operation attribute. 1913 Expires May 16, 1999 1914 2.6 The "queued-job-count" Printer Description attribute 1916 2.6.1Why is "queued-job-count" RECOMMENDED? 1918 The reason that "queued-job-count" is RECOMMENDED, is that some clients 1919 look at that attribute alone when summarizing the status of a list of 1920 printers, instead of doing a Get-Jobs to determine the number of jobs in 1921 the queue. Implementations that fail to support the "queued-job-count" 1922 will cause that client to display 0 jobs when there are actually queued 1923 jobs. 1925 We would have made it a REQUIRED Printer attribute, but some 1926 implementations had already been completed before the issue was raised, 1927 so making it a SHOULD was a compromise. 1929 2.6.2Is "queued-job-count" a good measure of how busy a printer is? 1931 The "queued-job-count" is not a good measure of how busy the printer is 1932 when there are held jobs. A future registration could be to add a 1933 "held-job-count" (or an "active-job-count") Printer Description 1934 attribute if experience shows that such an attribute (combination) is 1935 needed to quickly indicate how busy a printer really is. 1937 2.7 Sending empty attribute groups 1939 The [IPP-MOD] and [IPP-PRO] specifications RECOMMEND that a sender not 1940 send an empty attribute group in a request or a response. However, they 1941 REQUIRE a receiver to accept an empty attribute group as equivalent to 1942 the omission of that group. So a client SHOULD omit the Job Template 1943 Attributes group entirely in a create operation that is not supplying 1944 any Job Template attributes. Similarly, an IPP object SHOULD omit an 1945 empty Unsupported Attributes group if there are no unsupported 1946 attributes to be returned in a response. 1948 2.8 Returning unsupported attributes in Get-Xxxx responses 1950 The client cannot depend on getting unsupported attributes returned in 1951 the Unsupported Attributes group of Get-Printer-Attributes, Get-Jobs, or 1952 Get-Job-Attributes responses that the client requested, but are not 1953 supported by the IPP object. However, such unsupported requested 1954 attributes will not be returned in the Job Attributes or Printer 1955 Attributes group (since they are unsupported). However, the IPP object 1956 is REQUIRED to return the 'successful-ok-ignored-or-substituted- 1957 attributes' status code, so that the client know that all that was 1958 requested has not been returned. 1960 2.9 Returning job-state in Print-Job response 1962 An IPP client submits a small job via Print-Job. By the time the IPP 1963 printer/print server is putting together a response to the operation, 1965 Expires May 16, 1999 1966 the job has finished printing and been removed as an object from the 1967 print system. What should the job-state be in the response? 1969 The Model suggests that the Printer return a response before it even 1970 accepts the document content. The Job Object Attributes are returned 1971 only if the IPP object returns one of the success status codes. Then the 1972 job-state would always be "pending" or "pending-held". 1974 This issue comes up for the implementation of an IPP Printer object as a 1975 server that forwards jobs to devices that do not provide job status back 1976 to the server. If the server is reasonably certain that the job 1977 completed successfully, then it should return the job-state as 1978 'completed'. Also the server can keep the job in its "job history" long 1979 after the job is no longer in the device. Then a user could query the 1980 server and see that the job was in the 'completed' state and completed 1981 as specified by the job's "time-at-completed" time which would be the 1982 same as the server submitted the job to the device. 1984 An alternative is for the server to respond to the client before or 1985 while sending the job to the device, instead of waiting until the server 1986 has finished sending the job to the device. In this case, the server 1987 can return the job's state as 'pending' with the 'job-outgoing' value in 1988 the job's "job-state-reasons" attribute. 1990 If the server doesn't know for sure whether the job completed 1991 successfully (or at all), it could return the (out-of-band) 'unknown' 1992 value. 1994 On the other hand, if the server is able to query the device and/or 1995 setup some sort of event notification that the device initiates when the 1996 job makes state transitions, then the server can return the current job 1997 state in the Print-Job response and in subsequent queries because the 1998 server knows what the job state is in the device (or can query the 1999 device). 2001 All of these alternatives depend on implementation of the server and the 2002 device. 2004 2.10Multi-valued attributes 2006 What is the attribute syntax for a multi-valued attribute? Since some 2007 attributes support values in more than one data type, such as "media", 2008 "job-hold-until", and "job-sheets", IPP semantics associate the 2009 attribute syntax with each value, not with the attribute as a whole. 2010 The protocol associates the attribute syntax tag with each value. Don't 2011 be fooled, just because the attribute syntax tag comes before the 2012 attribute keyword. All attribute values after the first have a zero 2013 length attribute keyword as the indication of a subsequent value of the 2014 same attribute. 2016 Expires May 16, 1999 2017 3 Encoding and Transport 2019 This section discusses various aspects of IPP/1.0 Encoding and Transport 2020 [IPP-PRO]. 2022 The IPP layer doesn't have to deal with chunking. In the context of CGI 2023 scripts, the HTTP layer removes any chunking information in the received 2024 data. 2026 A client MUST NOT expect a response from an IPP server until after the 2027 client has sent the entire response. But a client MAY listen for an 2028 error response that an IPP server MAY send before it receives all the 2029 data. In this case a client, if chunking the data, can send a premature 2030 zero-length chunk to end the request before sending all the data. If the 2031 request is blocked for some reason, a client MAY determine the reason by 2032 opening another connection to query the server. 2034 In the following sections, there are a tables of all HTTP headers which 2035 describe their use in an IPP client or server. The following is an 2036 explanation of each column in these tables. 2038 @ the "header" column contains the name of a header 2039 @ the "request/client" column indicates whether a client sends the 2040 header. 2041 @ the "request/ server" column indicates whether a server supports 2042 the header when received. 2043 @ the "response/ server" column indicates whether a server sends the 2044 header. 2045 @ the "response /client" column indicates whether a client supports 2046 the header when received. 2047 @ the "values and conditions" column specifies the allowed header 2048 values and the conditions for the header to be present in a 2049 request/response. 2051 The table for "request headers" does not have columns for responses, and 2052 the table for "response headers" does not have columns for requests. 2054 The following is an explanation of the values in the "request/client" 2055 and "response/ server" columns. 2057 @ must: the client or server MUST send the header, 2058 @ must-if: the client or server MUST send the header when the 2059 condition described in the "values and conditions" column is met, 2060 @ may: the client or server MAY send the header 2061 @ not: the client or server SHOULD NOT send the header. It is not 2062 relevant to an IPP implementation. 2064 The following is an explanation of the values in the "response/client" 2065 and "request/ server" columns. 2067 @ must: the client or server MUST support the header, 2068 @ may: the client or server MAY support the header 2069 @ not: the client or server SHOULD NOT support the header. It is not 2070 relevant to an IPP implementation. 2072 Expires May 16, 1999 2074 3.1 General Headers 2076 The following is a table for the general headers. 2078 General- Request Response Values and Conditions 2079 Header 2081 Client Server Server Client 2083 Cache- must not must not "no-cache" only 2084 Control 2086 Connection must-if must must- must "close" only. Both 2087 if client and server 2088 SHOULD keep a 2089 connection for the 2090 duration of a sequence 2091 of operations. The 2092 client and server MUST 2093 include this header 2094 for the last operation 2095 in such a sequence. 2097 Date may may must may per RFC 1123 [RFC1123] 2098 from RFC 2068 2099 [RFC2068] 2101 Pragma must not must not "no-cache" only 2103 Transfer- must-if must must- must "chunked" only . 2104 Encoding if Header MUST be present 2105 if Content-Length is 2106 absent. 2108 Upgrade not not not not 2110 Via not not not not 2112 3.2 Request Headers 2114 The following is a table for the request headers. 2116 Request-Header Client Server Request Values and Conditions 2118 Accept may must "application/ipp" only. This 2119 value is the default if the 2120 client omits it 2122 Accept-Charset not not Charset information is within 2123 the application/ipp entity 2125 Accept-Encoding may must empty and per RFC 2068 [RFC2068] 2126 and IANA registry for content- 2128 Expires May 16, 1999 2130 Request-Header Client Server Request Values and Conditions 2132 codings 2134 Accept-Language not not language information is within 2135 the application/ipp entity 2137 Authorization must-if must per RFC 2068. A client MUST send 2138 this header when it receives a 2139 401 "Unauthorized" response and 2140 does not receive a "Proxy- 2141 Authenticate" header. 2143 >From not not per RFC 2068. Because RFC 2144 recommends sending this header 2145 only with the user's approval, it 2146 is not very useful 2148 Host must must per RFC 2068 2150 If-Match not not 2152 If-Modified- not not 2153 Since 2155 If-None-Match not not 2157 If-Range not not 2159 If-Unmodified- not not 2160 Since 2162 Max-Forwards not not 2164 Proxy- must-if not per RFC 2068. A client MUST send 2165 Authorization this header when it receives a 2166 401 "Unauthorized" response and a 2167 "Proxy-Authenticate" header. 2169 Range not not 2171 Referer not not 2173 User-Agent not not 2175 3.3 Response Headers 2177 The following is a table for the request headers. 2179 Response- Server Client Response Values and Conditions 2180 Header 2182 Expires May 16, 1999 2183 Response- Server Client Response Values and Conditions 2184 Header 2186 Accept-Ranges not not 2188 Age not not 2190 Location must-if may per RFC 2068. When URI needs 2191 redirection. 2193 Proxy- not must per RFC 2068 2194 Authenticate 2196 Public may may per RFC 2068 2198 Retry-After may may per RFC 2068 2200 Server not not 2202 Vary not not 2204 Warning may may per RFC 2068 2206 WWW- must-if must per RFC 2068. When a server needs to 2207 Authenticate authenticate a client. 2209 3.4 Entity Headers 2211 The following is a table for the entity headers. 2213 Entity-Header Request Response Values and Conditions 2215 Client Server Server Client 2217 Allow not not not not 2219 Content-Base not not not not 2221 Content- may must must must per RFC 2068 and IANA 2222 Encoding registry for content 2223 codings. 2225 Content- not not not not Application/ipp 2226 Language handles language 2228 Content- must-if must must-if must the length of the 2229 Length message-body per RFC 2230 2068. Header MUST be 2231 present if Transfer- 2232 Encoding is absent.. 2234 Content- not not not not 2235 Location 2237 Expires May 16, 1999 2238 Entity-Header Request Response Values and Conditions 2240 Client Server Server Client 2242 Content-MD5 may may may may per RFC 2068 2244 Content-Range not not not not 2246 Content-Type must must must must "application/ipp" 2247 only 2249 ETag not not not not 2251 Expires not not not not 2253 Last-Modified not not not not 2255 3.5 Optional support for HTTP/1.0 2257 IPP implementations consist of an HTTP layer and an IPP layer. In the 2258 following discussion, the term "client" refers to the HTTP client layer 2259 and the term "server" refers to the HTTP server layer. The Encoding and 2260 Transport document [IPP-PRO] requires that HTTP 1.1 MUST be supported by 2261 all clients and all servers. However, a client and/or a server 2262 implementation may choose to also support HTTP 1.0. 2264 @ This option means that a server may choose to communicate with a 2265 (non-conforming) client that only supports HTTP 1.0. In such cases 2266 the server should not use any HTTP 1.1 specific parameters or 2267 features and should respond using HTTP version number 1.0. 2269 @ This option also means that a client may choose to communicate with a 2270 (non-conforming) server that only supports HTTP 1.0. In such cases, 2271 if the server responds with an HTTP 'unsupported version number' to 2272 an HTTP 1.1 request, the client should retry using HTTP version 2273 number 1.0. 2275 3.6 HTTP/1.1 Chunking 2277 Clients MUST anticipate that the HTTP/1.1 server may chunk responses and 2278 MUST accept them in responses. However, a (non-conforming) HTTP client 2279 that is unable to accept chunked responses may attempt to request an 2280 HTTP 1.1 server not to use chunking in its response to an operation by 2281 using the following HTTP header: 2283 TE: identity 2285 This mechanism should not be used by a server to disable a client from 2286 chunking a request, since chunking of document data is an important 2287 feature for clients to send long documents. 2289 Expires May 16, 1999 2290 4 References 2292 [IPP LPD] 2293 Herriot, R., Hastings, T., Jacobs, N., Martin, J., "Mapping between 2294 LPD and IPP Protocols", draft-ietf-ipp-lpd-ipp-map-04.txt, June 2295 1998. 2297 [IPP-MOD] 2298 R. deBry, T. Hastings, R. Herriot, S. Isaacson, P. Powell, 2299 "Internet Printing Protocol/1.0: Model and Semantics", draft-ietf- 2300 ipp-model-11.txt, November, 1998. 2302 [IPP-PRO] 2303 Herriot, R., Butler, S., Moore, P., Tuner, R., "Internet Printing 2304 Protocol/1.0: Encoding and Transport", draft-ietf-ipp-pro-06.txt, 2305 June, 1998. 2307 [IPP-RAT] 2308 Zilles, S., "Rationale for the Structure and Model and Protocol for 2309 the Internet Printing Protocol", draft-ietf-ipp-rat-03.txt, June, 2310 1998. 2312 [IPP-REQ] 2313 Wright, D., "Design Goals for an Internet Printing Protocol", 2314 draft-ietf-ipp-req-02.txt, June, 1998. 2316 [RFC1123] 2317 Braden, S., "Requirements for Internet Hosts - Application and 2318 Support", RFC 1123, October, 1989. 2320 [RFC2068] 2321 R Fielding, et al, "Hypertext Transfer Protocol . HTTP/1.1" RFC 2322 2068, January 1997. 2324 [rfc2119] 2325 S. Bradner, "Key words for use in RFCs to Indicate Requirement 2326 Levels", RFC 2119 , March 1997. 2328 [RFC2396] 2329 Berners-Lee, T., Fielding, R., Masinter, L., "Uniform Resource 2330 Identifiers (URI): Generic Syntax", RFC 2396, August 1998. 2332 [SSL] 2333 Netscape, The SSL Protocol, Version 3, (Text version 3.02), 2334 November 1996. 2336 4.1 Authors' Address 2338 Thomas N. Hastings 2339 Xerox Corporation 2340 701 Aviation Blvd. 2342 Expires May 16, 1999 2343 El Segundo, CA 90245 2344 hastings@cp10.es.xerox.com 2346 Carl-Uno Manros 2347 Xerox Corporation 2348 701 Aviation Blvd. 2349 El Segundo, CA 90245 2350 manros@cp10.es.xerox.com 2352 5 Appendix C: Full Copyright Statement 2354 Copyright (C) The Internet Society (1998). All Rights Reserved 2356 This document and translations of it may be copied and furnished to 2357 others, and derivative works that comment on or otherwise explain it or 2358 assist in its implementation may be prepared, copied, published and 2359 distributed, in whole or in part, without restriction of any kind, 2360 provided that the above copyright notice and this paragraph are included 2361 on all such copies and derivative works. However, this document itself 2362 may not be modified in any way, such as by removing the copyright notice 2363 or references to the Internet Society or other Internet organizations, 2364 except as needed for the purpose of developing Internet standards in 2365 which case the procedures for copyrights defined in the Internet 2366 Standards process must be followed, or as required to translate it into 2367 languages other than English. 2369 The limited permissions granted above are perpetual and will not be 2370 revoked by the Internet Society or its successors or assigns. 2372 This document and the information contained herein is provided on an "AS 2373 IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK 2374 FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT 2375 LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT 2376 INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR 2377 FITNESS FOR A PARTICULAR PURPOSE. 2379 Expires May 16, 1999