RFC 2565
Internet Printing Protocol/1.0: Encoding and Transport
Internet Printing Protocol/1.0: Encoding and Transport ๐
Part 1 of 8 ๐ฆ
Okay bestie, this is the RFC for Internet Printing Protocol/1.0: Encoding and Transport ๐จ๏ธโจ. It's RFC 2565 and it's giving experimental energy ๐งช. It was published in April 1999 in the Network Working Group, and it's Category: Experimental. The authors are R. Herriot, Ed. (Xerox Corporation), S. Butler (Hewlett-Packard), P. Moore (Microsoft), and R. Turner (Sharp Labs) ๐. The title block doesn't list anything it obsoletes or updates, so there's no drama there ๐.
Status of This Memo โจ
This memo defines an Experimental Protocol for the Internet community ๐งช. It's not an Internet standard of any kind, so don't go calling it one ๐ . Discussion and suggestions for improvement are welcome ๐ซถ. Distribution of this memo is unlimited ๐.
Copyright Notice ๐ธ
Copyright (C) The Internet Society (1999). All Rights Reserved.
IESG Note ๐ฅ
Okay so this document defines an Experimental protocol for the Internet community ๐งช. The IESG expects that a revised version will eventually be published as a Proposed Standard protocol ๐. That future version is expected to change from what's in this memo, especially because it'll likely bring in strong authentication and privacy features, plus an "ipp:" URL type that supports those security measures ๐. Other changes are possible too ๐ฆ.
Implementors, be warned! Future versions of this protocol may not interoperate with the version of IPP defined in this document ๐. Even if they do interoperate, some protocol features may not be available ๐ญ.
The IESG encourages experimentation with this protocol, especially in combination with Transport Layer Security (TLS) [RFC 2246] โจ. The goal is to figure out how TLS can be used effectively as a security layer for IPP ๐๐.
Abstract ๐
This document is one piece of a set that together describes every aspect of a new Internet Printing Protocol (IPP) ๐จ๏ธ. IPP is an application level protocol for distributed printing using Internet tools and technologies ๐. This document is the one that defines the rules for encoding IPP operations and IPP attributes into a new Internet MIME media type called "application/ipp" ๐. It also defines how to transport a message body whose Content-Type is "application/ipp" over HTTP ๐.
The full set of IPP documents includes:
- Design Goals for an Internet Printing Protocol [RFC2567]
- Rationale for the Structure and Model and Protocol for the Internet Printing Protocol [RFC2568]
- Internet Printing Protocol/1.0: Model and Semantics [RFC2566]
- Internet Printing Protocol/1.0: Encoding and Transport (this document)
- Internet Printing Protocol/1.0: Implementer's Guide [ipp-iig]
- Mapping between LPD and IPP Protocols [RFC2569]
Here's the vibe for each one ๐ . "Design Goals for an Internet Printing Protocol" takes a broad look at distributed printing and lists real-life scenarios that clarify which features a printing protocol for the Internet needs ๐ง. It identifies requirements for three types of users: end users, operators, and administrators ๐. It calls out a subset of end user requirements that IPP/1.0 satisfies, and operator and administrator requirements are out of scope for version 1.0 ๐.
"Rationale for the Structure and Model and Protocol for the Internet Printing Protocol" describes IPP from a high-level view ๐ฆ. It maps out the roadmap for the documents that make up the IPP suite, and it gives background and reasoning for the IETF working group's major decisions ๐ธ.
"Internet Printing Protocol/1.0: Model and Semantics" describes a simplified model with abstract objects, their attributes, and their operations, all independent of encoding and transport ๐. It introduces a Printer and a Job object, and the Job object optionally supports multiple documents per Job ๐. It also covers security, internationalization, and directory issues ๐.
This document, "Internet Printing Protocol/1.0: Implementer's Guide", gives advice to implementers of IPP clients and IPP objects ๐ ๏ธ.
"Mapping between LPD and IPP Protocols" gives some advice to implementers of gateways between IPP and LPD (Line Printer Daemon) implementations ๐งฉ.
Table of Contents ๐
1. Introduction.....................................................4
2. Conformance Terminology..........................................4
3. Encoding of the Operation Layer.................................4
3.1 Picture of the Encoding.....................................5
3.2 Syntax of Encoding..........................................7
3.3 Version-number..............................................9
3.4 Operation-id................................................9
3.5 Status-code.................................................9
3.6 Request-id..................................................9
3.7 Tags.......................................................10
3.7.1 Delimiter Tags.........................................10
3.7.2 Value Tags.............................................11
3.8 Name-Length................................................13
3.9 (Attribute) Name...........................................13
3.10 Value Length...............................................16
3.11 (Attribute) Value..........................................16
3.12 Data.......................................................18
4. Encoding of Transport Layer.....................................18
5. Security Considerations.........................................19
5.1 Using IPP with SSL3........................................19
6. References......................................................20
7. Authors' Addresses..............................................22
8. Other Participants:.............................................24
9. Appendix A: Protocol Examples...................................25
9.1 Print-Job Request..........................................25
9.2 Print-Job Response (successful)............................26
9.3 Print-Job Response (failure)...............................27
9.4 Print-Job Response (success with attributes ignored).......28
9.5 Print-URI Request..........................................30
9.6 Create-Job Request.........................................31
9.7 Get-Jobs Request...........................................31
9.8 Get-Jobs Response..........................................32
10. Appendix C: Registration of MIME Media Type Information for
"application/ipp"..............................................35
11. Full Copyright Statement.......................................37
1. Introduction โจ
Okay so this document holds the rules for encoding IPP operations, and it describes two layers: the transport layer and the operation layer ๐.
The transport layer is an HTTP/1.1 request or response ๐. RFC 2068 [RFC2068] describes HTTP/1.1 ๐. This document specifies the HTTP headers that an IPP implementation supports ๐ .
The operation layer is a message body in an HTTP request or response ๐. The document "Internet Printing Protocol/1.0: Model and Semantics" [RFC2566] defines what that message body means and which values are supported ๐ง . This document covers how an IPP operation gets encoded ๐ค. From here on, the aforementioned document [RFC2566] is referred to as the "IPP model document" ๐.
2. Conformance Terminology ๐ฅ
Here's the BCP 14 key word situation. The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 [RFC2119] ๐.
3. Encoding of the Operation Layer ๐ง
Bestie, the operation layer MUST contain a single operation request or operation response ๐ . Each request or response is made of a sequence of values and attribute groups ๐งฉ. Attribute groups are a sequence of attributes, and each attribute is a name and a value ๐ฆ. Names and values end up being sequences of octets ๐ข.
The encoding is built out of octets, which are the most primitive type ๐ข. Several types are built from octets, but three matter most: integers, character strings, and octet strings. Most other data types are built on top of those ๐ธ. Every character string in this encoding MUST be a sequence of characters, and each character is associated with some charset and some natural language ๐. A character string MUST be in "reading order", so the first character in the value (according to reading order) is the first character in the encoding โ๏ธ. A character string whose associated charset is US-ASCII and whose associated natural language is US English is called a US-ASCII-STRING ๐บ๐ธ. A character string whose associated charset and natural language are specified in a request or response, as described in the model document, is called a LOCALIZED-STRING ๐. An octet string MUST be in "IPP model document order", so the first octet in the value (according to the IPP model document order) is the first octet in the encoding ๐งพ. Every integer in this encoding MUST be encoded as a signed integer, using two's-complement binary encoding with big-endian format (also known as "network order" and "most significant byte first") ๐. The number of octets for an integer MUST be 1, 2 or 4, depending on how it's used in the protocol ๐ข.
Here's the size breakdown, periodt ๐
. One-octet integers, called SIGNED-BYTE, are used for the version-number and tag fields ๐. Two-byte integers, called SIGNED-SHORT, are used for the operation-id, status-code, and length fields โจ. Four-byte integers, called SIGNED-INTEGER, are used for value fields and the sequence number ๐ฅ.
The next two sections show the operation layer in two ways ๐:
- informally, through pictures and description ๐จ
- formally, through Augmented Backus-Naur Form (ABNF), as specified by RFC 2234 [RFC2234] ๐ง
3.1 Picture of the Encoding โจ
okay so bestie, this is the whole vibe of an operation request or response ๐ It's basically a stack of fields, and the diagram below shows what sits where:
-----------------------------------------------
| version-number | 2 bytes - required
-----------------------------------------------
| operation-id (request) |
| or | 2 bytes - required
| status-code (response) |
-----------------------------------------------
| request-id | 4 bytes - required
-----------------------------------------------------------
| xxx-attributes-tag | 1 byte |
----------------------------------------------- |-0 or more
| xxx-attribute-sequence | n bytes |
-----------------------------------------------------------
| end-of-attributes-tag | 1 byte - required
-----------------------------------------------
| data | q bytes - optional
-----------------------------------------------
The xxx-attributes-tag and xxx-attribute-sequence pair can be any one of four values for "xxx": operation, job, printer and unsupported ๐. Together, each pair represents an attribute group from the model document. The xxx-attributes-tag tells you which group it is, and the xxx-attribute-sequence holds the attributes themselves ๐ฆ
The order of those tag and sequence pairs is spelled out in the IPP model document for every operation request and operation response, so check there for the exact sequence ๐
A request or response SHOULD contain each xxx-attributes-tag defined for that request or response, even if there are no attributes ๐ธ The one exception is the unsupported-attributes-tag, which SHOULD only show up if the unsupported-attribute-sequence is non-empty. A receiver of a request MUST be able to treat these two things as equivalent empty attribute groups:
- a) an
xxx-attributes-tagwith an emptyxxx-attribute-sequence, - b) an expected but missing
xxx-attributes-tag.
Ngl, this is the kind of rule that keeps everyone chill ๐ซถ
The data gets left out of some operations, but the end-of-attributes-tag is still there even when the data is omitted ๐ Quick note: the xxx-attributes-tag and the end-of-attributes-tag are called 'delimiter-tags'. Also, the xxx-attribute-sequence shown above may consist of 0 bytes, according to the rule below ๐ง
An xxx-attributes-sequence is made up of zero or more compound-attributes:
-----------------------------------------------
| compound-attribute | s bytes - 0 or more
-----------------------------------------------
A compound-attribute is one attribute with a single value, followed by zero or more additional values ๐
Note: a 'compound-attribute' represents a single attribute in the model document. The 'additional value' syntax is for attributes with 2 or more values. It's giving clean organisation fr fr โจ
Each attribute has this layout:
-----------------------------------------------
| value-tag | 1 byte
-----------------------------------------------
| name-length (value is u) | 2 bytes
-----------------------------------------------
| name | u bytes
-----------------------------------------------
| value-length (value is v) | 2 bytes
-----------------------------------------------
| value | v bytes
-----------------------------------------------
And an additional value looks like this:
-----------------------------------------------------------
| value-tag | 1 byte |
----------------------------------------------- |
| name-length (value is 0x0000) | 2 bytes |
----------------------------------------------- |-0 or more
| value-length (value is w) | 2 bytes |
----------------------------------------------- |
| value | w bytes |
-----------------------------------------------------------
Note: an additional value is like an attribute whose name-length is 0. Iconic behaviour, honestly ๐
If you're writing a parsing loop, the encoding looks like this instead:
-----------------------------------------------
| version-number | 2 bytes - required
-----------------------------------------------
| operation-id (request) |
| or | 2 bytes - required
| status-code (response) |
-----------------------------------------------
| request-id | 4 bytes - required
-----------------------------------------------------------
| tag (delimiter-tag or value-tag) | 1 byte |
----------------------------------------------- |-0 or more
| empty or rest of attribute | x bytes |
-----------------------------------------------------------
| end-of-attributes-tag | 2 bytes - required
-----------------------------------------------
| data | y bytes - optional
-----------------------------------------------
The value of the tag decides what the bytes after it are. They could be:
- attributes
- data
- the remainder of a single attribute, where the tag specifies the type of the value
3.2 Syntax of Encoding ๐
Here's the ABNF [RFC2234] for the syntax. The one twist is that 'strings of literals' MUST be case sensitive ๐ So 'a' means lower case 'a' and not upper case 'A'. On top of that, SIGNED-BYTE and SIGNED-SHORT fields are written as '%x' values that show their range of values.
ipp-message = ipp-request / ipp-response
ipp-request = version-number operation-id request-id
*(xxx-attributes-tag xxx-attribute-sequence)
end-of-attributes-tag data
ipp-response = version-number status-code request-id
*(xxx-attributes-tag xxx-attribute-sequence)
end-of-attributes-tag data
xxx-attribute-sequence = *compound-attribute
xxx-attributes-tag = operation-attributes-tag / job-attributes-tag /
printer-attributes-tag / unsupported-attributes-tag
version-number = major-version-number minor-version-number
major-version-number = SIGNED-BYTE ; initially %d1
minor-version-number = SIGNED-BYTE ; initially %d0
operation-id = SIGNED-SHORT ; mapping from model defined below
status-code = SIGNED-SHORT ; mapping from model defined below
request-id = SIGNED-INTEGER ; whose value is > 0
compound-attribute = attribute *additional-values
attribute = value-tag name-length name value-length value
additional-values = value-tag zero-name-length value-length value
name-length = SIGNED-SHORT ; number of octets of 'name'
name = LALPHA *( LALPHA / DIGIT / "-" / "_" / "." )
value-length = SIGNED-SHORT ; number of octets of 'value'
value = OCTET-STRING
data = OCTET-STRING
zero-name-length = %x00.00 ; name-length of 0
operation-attributes-tag = %x01 ; tag of 1
job-attributes-tag = %x02 ; tag of 2
printer-attributes-tag = %x04 ; tag of 4
unsupported-attributes-tag = %x05 ; tag of 5
end-of-attributes-tag = %x03 ; tag of 3
value-tag = %x10-FF
SIGNED-BYTE = BYTE
SIGNED-SHORT = 2BYTE
SIGNED-INTEGER = 4BYTE
DIGIT = %x30-39 ; "0" to "9"
LALPHA = %x61-7A ; "a" to "z"
BYTE = %x00-FF
OCTET-STRING = *BYTE
The syntax lets an xxx-attributes-tag show up even when the xxx-attribute-sequence after it is empty ๐ง That's on purpose, so the Get-Jobs response can return no attributes for some job-objects. It's RECOMMENDED that the sender not send an xxx-attributes-tag when there are no attributes (except in the Get-Jobs response just mentioned). Still, the receiver MUST be able to decode that syntax anyway ๐ซถ
3.3 Version-number ๐
The version-number MUST consist of a major and a minor version-number, and each of those MUST be represented by a SIGNED-BYTE ๐ The protocol in this document MUST have a major version-number of 1 (0x01) and a minor version-number of 0 (0x00). The ABNF for these two bytes MUST be %x01.00 โจ
3.4 Operation-id ๐ฆ
Operation-ids are defined as enums in the model document. An operation-ids enum value MUST be encoded as a SIGNED-SHORT ๐
Note: the values 0x4000 to 0xFFFF are reserved for private extensions. Private extensions get their own lane, bestie ๐ธ
3.5 Status-code ๐
Status-codes are defined as enums in the model document too. A status-code enum value MUST be encoded as a SIGNED-SHORT ๐ฅ
The status-code is an operation attribute in the model document. In the protocol, though, it has a special spot, sitting outside of the operation attributes ๐
If an IPP status-code gets returned, then the HTTP Status-Code MUST be 200 (successful-ok). With any other HTTP Status-Code value, the HTTP response MUST NOT contain an IPP message-body, which means no IPP status-code gets returned at all ๐
3.6 Request-id ๐
The request-id lets a client match a response with its request. This mechanism is unnecessary in HTTP, but it may be useful when application/ipp entity bodies get used in another context โจ
The request-id in a response MUST be the value of the request-id received in the corresponding request. A client can set the request-id in each request to a unique value or to a constant value, such as 1, depending on what the client does with the request-id returned in the response ๐ The value of the request-id MUST be greater than zero ๐
3.7 Tags ๐ง
There are two kinds of tags, and they're both super important ๐
- delimiter tags: delimit major sections of the protocol, namely attributes and data
- value tags: specify the type of each attribute value
3.7.1 Delimiter Tags
okay bestie, the delimiter tags are the big โจ dividers that organise the whole message, and this table lists their values ๐
Tag Value (Hex) Delimiter
0x00 reserved
0x01 operation-attributes-tag
0x02 job-attributes-tag
0x03 end-of-attributes-tag
0x04 printer-attributes-tag
0x05 unsupported-attributes-tag
0x06-0x0e reserved for future delimiters
0x0F reserved for future chunking-end-of-attributes-
tag
so when an xxx-attributes-tag shows up, it MUST mean that the zero or more attributes after it, up until the next delimiter tag, belong to the group xxx from the model document. xxx can be operation, job, printer, or unsupported ๐
let's break that down ๐ฆ
- an operation-attributes-tag MUST mean the attributes after it are operation attributes from the model document ๐
- a job-attributes-tag MUST mean the attributes after it are job attributes or job template attributes from the model document ๐ง
- a printer-attributes-tag MUST mean the attributes after it are printer attributes from the model document ๐จ๏ธ
- an unsupported-attributes-tag MUST mean the attributes after it are unsupported attributes from the model document ๐
the operation-attributes-tag and the end-of-attributes-tag each MUST show up exactly once in an operation. the operation-attributes-tag MUST be the first delimiter, and the end-of-attributes-tag MUST be the last one ๐ if the operation has a document-content group, the document data in that group MUST come right after the end-of-attributes-tag ๐
the other three xxx-attributes-tags are OPTIONAL in an operation, and each one MUST appear at most once. the one exception is the job-attributes-tag in a Get-Jobs response, which can show up zero or more times ๐ธ
the order and presence of delimiter tags in each operation request and each operation response MUST match what the model document defines. for more detail, check section 3.9 "(Attribute) Name" and section 9 "Appendix A: Protocol Examples" ๐
and finally, a Printer MUST handle the reserved delimiter tags differently from reserved value tags. that way it can tell when a whole attribute group is something it doesn't understand, versus just one single value it doesn't understand ๐
3.7.2 Value Tags
the value-tag is the first octet of an attribute, and it tells you what type the attribute's value is. here are the "out-of-band" value-tags ๐
Tag Value (Hex) Meaning
0x10 unsupported
0x11 reserved for future 'default'
0x12 unknown
0x13 no-value
Tag Value (Hex) Meaning
0x14-0x1F reserved for future "out-of-band" values.
the "unsupported" value MUST be used in the attribute-sequence of an error response, for any attributes the printer doesn't support ๐ โโ๏ธ "default" is reserved for a future feature where you set a value back to its default ๐ "unknown" is for a supported attribute whose value is temporarily unknown โณ and "no-value" is for a supported attribute that doesn't have a value assigned yet. like, "job-k-octets-supported" has no value if the implementation supports it but an admin hasn't set a limit on the printer ๐ซถ
here are the integer value-tags ๐ข
Tag Value (Hex) Meaning
0x20 reserved
0x21 integer
0x22 boolean
0x23 enum
0x24-0x2F reserved for future integer types
NOTE: 0x20 is reserved for "generic integer" in case it's ever needed ๐
next up are the octetString value-tags ๐ง
Tag Value (Hex) Meaning
0x30 octetString with an unspecified format
0x31 dateTime
0x32 resolution
0x33 rangeOfInteger
0x34 reserved for collection (in the future)
0x35 textWithLanguage
0x36 nameWithLanguage
0x37-0x3F reserved for future octetString types
and the character-string value-tags ๐
Tag Value (Hex) Meaning
0x40 reserved
0x41 textWithoutLanguage
0x42 nameWithoutLanguage
0x43 reserved
0x44 keyword
0x45 uri
0x46 uriScheme
0x47 charset
0x48 naturalLanguage
Tag Value (Hex) Meaning
0x49 mimeMediaType
0x4A-0x5F reserved for future character string types
NOTE: 0x40 is reserved for "generic character-string" in case it's ever needed ๐ท
NOTE: every attribute value always has a type, and its tag spells that type out. "nameWithoutLanguage" is one example. an attribute's name has an implicit type, and that type is keyword ๐
the values 0x60-0xFF are reserved for future types. there are no values set aside for private extensions ๐ซ a new type MUST be registered through the type 2 registration process [RFC2566] ๐
the tag 0x7F is reserved for extending types past the 255 values that fit in one byte ๐ a tag value of 0x7F MUST signify that the first 4 bytes of the value field are read as the tag value. this extension doesn't affect parsers that don't know about this special tag. to them it's just like any other unknown tag, and the value length tells them how long the value is, which they treat as a single unit ๐งฉ all of these 4-byte tag values are currently unallocated, except that 0x40000000-0x7FFFFFFF is reserved for experimental use ๐งช
3.8 Name-Length โจ
the name-length field MUST be a SIGNED-SHORT ๐ฏ it MUST give the number of octets in the name field that comes right after it. the two bytes of the name-length field itself don't get counted ๐
if a name-length field is zero, the name field after it MUST be empty, and the value after that MUST be treated as an extra value for the attribute before it ๐ inside an attribute-sequence, if two attributes have the same name, the first one MUST be ignored ๐ a zero-length name is the only way to get multi-valued attributes, so it's giving main character energy ๐
3.9. (Attribute) Name ๐ฆ
okay so some operation elements are called parameters in the model document [RFC2566] ๐ and they're kind of special. they MUST be encoded in a special position and they MUST NOT show up as operation attributes. these are the parameters:
version-number: the parameter namedversion-numberin the IPP model document MUST become theversion-numberfield in the operation layer request or response.operation-id: the parameter namedoperation-idin the IPP model document MUST become theoperation-idfield in the operation layer request.status-code: the parameter namedstatus-codein the IPP model document MUST become thestatus-codefield in the operation layer response.request-id: the parameter namedrequest-idin the IPP model document MUST become therequest-idfield in the operation layer request or response.
Now the URI situation ๐ธ All Printer and Job objects get identified by a Uniform Resource Identifier (URI) [RFC2396] so they can be referenced persistently and unambiguously. URIs are a useful concept, BUT until the notion of URI is more stable (meaning defined more completely and deployed more widely), the URIs used for IPP objects are expected to actually be URLs [RFC1738] [RFC1808]. every URL is a specialized form of a URI, so even though the rest of this document says URI, it covers the more specific idea of URL too โจ
Some operation elements are encoded twice. once as the request-URI on the HTTP Request-Line, and a second time as a REQUIRED operation attribute in the application/ipp entity. these attributes are the target URI for the operation ๐
printer-uri: when the target is a printer and the transport is HTTP or HTTPS (for SSL3 [ssl]), the target printer-uri defined in each operation in the IPP model document MUST be an operation attribute calledprinter-uri, and it MUST also be specified outside of the operation layer as the request-URI on the Request-Line at the HTTP level.job-uri: when the target is a job and the transport is HTTP or HTTPS (for SSL3), the target job-uri of each operation in the IPP model document MUST be an operation attribute calledjob-uri, and it MUST also be specified outside of the operation layer as the request-URI on the Request-Line at the HTTP level.
Note: The target URI is included twice in an operation referencing the same IPP object, but the two URIs NEED NOT be literally identical. One can be a relative URI and the other can be an absolute URI. HTTP/1.1 allows clients to generate and send a relative URI rather than an absolute URI. A relative URI identifies a resource with the scope of the HTTP server, but does not include scheme, host or port.
the following statements explain how URLs should be used when mapping IPP onto HTTP/1.1 ๐ง
- Although it's potentially redundant, a client MUST supply the target of the operation both as an operation attribute and as a URI at the HTTP layer. the reason is to keep one consistent set of rules for mapping application/ipp onto possibly many communication layers, even where URLs aren't the addressing mechanism in the transport layer.
- even though these two URLs might not be literally identical (one relative, one absolute), they MUST both reference the same IPP object.
- the URI in the HTTP layer is either relative or absolute, and the HTTP server uses it to route the HTTP request to the correct resource relative to that HTTP server. the HTTP server doesn't need to be aware of the URI inside the operation request.
- once the HTTP server resource starts processing the HTTP request, it might get the reference to the right IPP Printer object from either the HTTP URI (using to the context of the HTTP server for relative URLs) or from the URI within the operation request. the choice is up to the implementation ๐
- HTTP URIs can be relative or absolute, but the target URI in the operation MUST be an absolute URI.
the model document sorts the remaining attributes into groups for each operation request and response. every one of those groups MUST be represented in the protocol by an xxx-attribute-sequence, preceded by the matching xxx-attributes-tag (see the table below and section 9 "Appendix A: Protocol Examples"). the order of these xxx-attributes-tags and xxx-attribute-sequences in the protocol MUST be the same as in the model document, BUT the order of attributes inside each xxx-attribute-sequence MUST be unspecified. here's the table that maps each model document group name to its xxx-attributes-sequence ๐
Model Document Group xxx-attributes-sequence
Operation Attributes operations-attributes-sequence
Job Template Attributes job-attributes-sequence
Job Object Attributes job-attributes-sequence
Unsupported Attributes unsupported-attributes-sequence
Requested Attributes job-attributes-sequence
Get-Job-Attributes)
Requested Attributes printer-attributes-sequence
Get-Printer-Attributes)
Document Content in a special position as described
above
If an operation contains attributes from more than one job object (e.g. a Get-Jobs response), the attributes from each job object MUST be in a separate job-attribute-sequence, so that the attributes from the ith job object are in the ith job-attribute-sequence. check out Section 9 "Appendix A: Protocol Examples" for a table showing these rules in action ๐
3.10. Value Length ๐
each attribute value MUST be preceded by a SIGNED-SHORT, and that SIGNED-SHORT MUST specify the number of octets in the value that follows the length, not counting the two bytes that hold the length itself ๐
for any of the types represented by binary signed integers, the sender MUST encode the value in exactly four octets ๐ฅ
for any of the types represented by character-strings, the sender MUST encode the value with all of the characters in the string and without any padding characters โจ
if a value-tag contains an "out-of-band" value, like "unsupported", the value-length MUST be 0 and the value empty. the value has no meaning when the value-tag is out-of-band. if a client gets a response with a nonzero value-length in this case, it MUST ignore the value field. if a printer gets a request with a nonzero value-length in this case, it MUST reject the request ๐
3.11. (Attribute) Value ๐
the syntax types, and most of the details of how they're represented, are defined in the IPP model document. this table adds to that info and defines the model document's syntax types in terms of the 5 basic types from section 3 "Encoding of the Operation Layer". the 5 types are US-ASCII-STRING, LOCALIZED-STRING, SIGNED-INTEGER, SIGNED-SHORT, SIGNED-BYTE, and OCTET-STRING ๐
Syntax of Attribute Encoding
Value
textWithoutLanguage, LOCALIZED-STRING.
nameWithoutLanguage
textWithLanguage OCTET_STRING consisting of 4 fields:
a) a SIGNED-SHORT which is the number of octets
in the following field
b) a value of type natural-language,
c) a SIGNED-SHORT which is the number of octets
in the following field,
d) a value of type textWithoutLanguage.
The length of a textWithLanguage value MUST be 4
+ the value of field a + the value of field c.
nameWithLanguage OCTET_STRING consisting of 4 fields:
a) a SIGNED-SHORT which is the number of octets
in the following field
b) a value of type natural-language,
c) a SIGNED-SHORT which is the number of octets
in the following field,
d) a value of type nameWithoutLanguage.
The length of a nameWithLanguage value MUST be 4
+ the value of field a + the value of field c.
charset, US-ASCII-STRING.
naturalLanguage,
mimeMediaType,
keyword, uri, and
uriScheme
boolean SIGNED-BYTE where 0x00 is 'false' and 0x01 is
'true'.
Syntax of Attribute Encoding
Value
integer and enum a SIGNED-INTEGER.
dateTime OCTET-STRING consisting of eleven octets whose
contents are defined by "DateAndTime" in RFC
2579 [RFC2579].
resolution OCTET_STRING consisting of nine octets of 2
SIGNED-INTEGERs followed by a SIGNED-BYTE. The
first SIGNED-INTEGER contains the value of cross
feed direction resolution. The second SIGNED-
INTEGER contains the value of feed direction
resolution. The SIGNED-BYTE contains the units
value.
rangeOfInteger Eight octets consisting of 2 SIGNED-INTEGERs.
The first SIGNED-INTEGER contains the lower
bound and the second SIGNED-INTEGER contains the
upper bound.
1setOf X Encoding according to the rules for an attribute
with more than 1 value. Each value X is encoded
according to the rules for encoding its type.
octetString OCTET-STRING
the type of the value in the model document decides how the value is encoded and what the value-tag is ๐ธ
3.12. Data ๐ง
the data part MUST include any data required by the operation
4. Encoding of Transport Layer โจ
okay bestie, HTTP/1.1 [RFC2068] is the transport layer for this protocol ๐๐ it's literally the delivery truck that carries all the IPP stuff around ๐ซถ
The operation layer was designed assuming the transport layer already has these two things, no cap:
- the URI of the target job or printer operation
- the total length of the data in the operation layer, either as a single length or as a sequence of chunks each with a length.
It is REQUIRED that a printer implementation support HTTP over the IANA assigned Well Known Port 631 (the IPP default port) ๐จ๏ธ, though a printer implementation may support HTTP over some other port as well. A printer may also have to support another port for privacy (See Section 5 "Security Considerations") ๐
Note: even though port 631 is the IPP default, port 80 remains the default for an HTTP URI ๐ So a URI for a printer using port 631 MUST contain an explicit port, e.g. "http://forest:631/pinetree". An HTTP URI for IPP with no explicit port implicitly references port 80, which is consistent with the rules for HTTP/1.1. This is giving consistency ๐
Each HTTP operation MUST use the POST method, where the request-URI is the object target of the operation ๐ฏ and the "Content-Type" of the message-body in each request and response MUST be "application/ipp". The message-body MUST contain the operation layer and MUST have the syntax described in section 3.2 "Syntax of Encoding" โจ A client implementation MUST adhere to the rules for a client described for HTTP1.1 [RFC2068]. A printer (server) implementation MUST adhere to the rules for an origin server described for HTTP1.1 [RFC2068]. Main character energy ๐
An IPP server sends a response for each request that it receives ๐ฌ If an IPP server detects an error, it MAY send a response before it has read the entire request. If the HTTP layer of the IPP server completes processing the HTTP headers successfully, it MAY send an intermediate response, such as "100 Continue", with no IPP data before sending the IPP response. A client MUST expect such a variety of responses from an IPP server ๐ For further information on HTTP/1.1, consult the HTTP documents [RFC2068].
5. Security Considerations ๐๐
okay this section is serious, so let's get into it ๐ญ
The IPP Model document defines an IPP implementation with "privacy" as one that implements Secure Socket Layer Version 3 (SSL3). Note: SSL3 is not an IETF standards track specification ๐ SSL3 meets the requirements for IPP security with regards to features such as mutual authentication and privacy (via encryption). The IPP Model document also outlines IPP-specific security considerations and should be the primary reference for security implications with regards to the IPP protocol itself. Read that one, periodt ๐
The IPP Model document defines an IPP implementation with "authentication" as one that implements the standard way for transporting IPP messages within HTTP 1.1. These include the security considerations outlined in the HTTP 1.1 standard document [RFC2068] and Digest Access Authentication extension [RFC2069] ๐
The current HTTP infrastructure supports HTTP over TCP port 80. IPP server implementations MUST offer IPP services using HTTP over the IANA assigned Well Known Port 631 (the IPP default port) ๐จ๏ธ IPP server implementations may support other ports, in addition to this port.
See further discussion of IPP security concepts in the model document [RFC2566] ๐ฆ
5.1 Using IPP with SSL3 ๐
An assumption is that the URI for a secure IPP Printer object has been found by means outside the IPP printing protocol, via a directory service, web site or other means ๐บ๏ธ
IPP provides a transparent connection to SSL by calling the corresponding URL (an https URI connects by default to port 443) ๐ธ However, the following functions can be provided to ease the integration of IPP with SSL during implementation:
connect (URI), returns a status
"connect" makes an https call and returns the immediate status of the connection as returned by SSL to the user. The status values are explained in section 5.4.2 of the SSL document [ssl]. A session-id may also be retained to later resume a session โจ The SSL handshake protocol may also require the cipher specifications supported by the client, key length of the ciphers, compression methods, certificates, etc. These should be sent to the server and hence should be available to the IPP client (although as part of administration features) ๐ง
disconnect (session)
to disconnect a particular session ๐
The session-id available from the "connect" could be used.
resume (session)
to reconnect using a previous session-id ๐
The availability of this information as administration features is left for implementers, and need not be specified at this time ๐ซถ
6. References ๐
[RFC2278] Freed, N. and J. Postel, "IANA Charset Registration Procedures", BCP 19, RFC 2278, January 1998.
[dpa] ISO/IEC 10175 Document Printing Application (DPA), June 1996.
[iana] IANA Registry of Coded Character Sets: ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets.
[ipp-iig] Hastings, Tom, et al., "Internet Printing Protocol/1.0: Implementer's Guide", Work in Progress.
[RFC2569] Herriot, R., Hastings, T., Jacobs, N. and J. Martin, "Mapping between LPD and IPP Protocols", RFC 2569, April 1999.
[RFC2566] deBry, R., Hastings, T., Herriot, R., Isaacson, S. and P. Powell, "Internet Printing Protocol/1.0: Model and Semantics", RFC 2566, April 1999.
[RFC2565] Herriot, R., Butler, S., Moore, P., Tuner, R., "Internet Printing Protocol/1.0: Encoding and Transport", RFC 2565, April 1999.
[RFC2568] Zilles, S., "Rationale for the Structure and Model and Protocol for the Internet Printing Protocol", RFC 2568, April 1999.
[RFC2567] Wright, D., "Design Goals for an Internet Printing Protocol", RFC 2567, April 1999.
[RFC822] Crocker, D., "Standard for the Format of ARPA Internet Text Messages", STD 11, RFC 822, August 1982.
[RFC1123] Braden, R., "Requirements for Internet Hosts - Application and Support", STD 3, RFC 1123, October 1989.
[RFC1179] McLaughlin, L. III, (editor), "Line Printer Daemon Protocol" RFC 1179, August 1990.
[RFC2223] Postel, J. and J. Reynolds, "Instructions to RFC Authors", RFC 2223, October 1997.
[RFC1738] Berners-Lee, T., Masinter, L. and M. McCahill, "Uniform Resource Locators (URL)", RFC 1738, December 1994.
[RFC1759] Smith, R., Wright, F., Hastings, T., Zilles, S. and J. Gyllenskog, "Printer MIB", RFC 1759, March 1995.
[RFC1766] Alvestrand, H., " Tags for the Identification of Languages", RFC 1766, March 1995.
[RFC1808] Fielding, R., "Relative Uniform Resource Locators", RFC 1808, June 1995.
[RFC2579] McCloghrie, K., Perkins, D. and J. Schoenwaelder, "Textual Conventions for SMIv2", STD 58, RFC 2579, April 1999.
[RFC2046] Freed, N. and N. Borenstein, Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types", RFC 2046, November 1996.
[RFC2048] Freed, N., Klensin J. and J. Postel. Multipurpose Internet Mail Extension (MIME) Part Four: Registration Procedures", BCP 13, RFC 2048, November 1996.
[RFC2068] Fielding, R., Gettys, J., Mogul, J., Frystyk, H. and T. Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", RFC 2068, January 1997.
[RFC2069] Franks, J., Hallam-Baker, P., Hostetler, J., Leach, P., Luotonen, A., Sink, E. and L. Stewart, "An Extension to HTTP: Digest Access Authentication", RFC 2069, January 1997.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.
[RFC2184] Freed, N. and K. Moore, "MIME Parameter Value and Encoded Word Extensions: Character Sets, Languages, and Continuations", RFC 2184, August 1997.
[RFC2234] Crocker, D. and P. Overell, "Augmented BNF for Syntax Specifications: ABNF", RFC 2234. November 1997.
[RFC2396] Berners-Lee, T., Fielding, R. and L. Masinter, "Uniform Resource Identifiers (URI): Generic Syntax", RFC 2396, August 1998.
7. Authors' Addresses ๐
Robert Herriot (Editor)
Xerox Corporation
3400 Hillview Ave., Bldg #1
Palo Alto, CA 94304
Phone: 650-813-7696
Fax: 650-813-6860
EMail: rherriot@pahv.xerox.com
Sylvan Butler
Hewlett-Packard
11311 Chinden Blvd.
Boise, ID 83714
Phone: 208-396-6000
Fax: 208-396-3457
EMail: sbutler@boi.hp.com
Paul Moore
Microsoft
One Microsoft Way
Redmond, WA 98053
Phone: 425-936-0908
Fax: 425-93MS-FAX
EMail: paulmo@microsoft.com
Randy Turner
Sharp Laboratories
5750 NW Pacific Rim Blvd
Camas, WA 98607
Phone: 360-817-8456
Fax: 360-817-8436
EMail: rturner@sharplabs.com
IPP Mailing List: ipp@pwg.org
IPP Mailing List Subscription: ipp-request@pwg.org
IPP Web Page: http://www.pwg.org/ipp/
8. Other Participants: ๐ซ
Chuck Adams - Tektronix Harry Lewis - IBM
Ron Bergman - Dataproducts Tony Liao - Vivid Image
Keith Carter - IBM David Manchala - Xerox
Angelo Caruso - Xerox Carl-Uno Manros - Xerox
Jeff Copeland - QMS Jay Martin - Underscore
Roger deBry - IBM Larry Masinter - Xerox
Lee Farrell - Canon Ira McDonald - High North Inc.
Sue Gleeson - Digital Bob Pentecost - Hewlett-Packard
Charles Gordon - Osicom Patrick Powell - Astart
Technologies
Brian Grimshaw - Apple Jeff Rackowitz - Intermec
Jerry Hadsell - IBM Xavier Riley - Xerox
Richard Hart - Digital Gary Roberts - Ricoh
Tom Hastings - Xerox Stuart Rowley - Kyocera
Stephen Holmstead Richard Schneider - Epson
Zhi-Hong Huang - Zenographics Shigern Ueda - Canon
Scott Isaacson - Novell Bob Von Andel - Allegro Software
Rich Lomicka - Digital William Wagner - Digital Products
David Kellerman - Northlake Jasper Wong - Xionics
Software
Robert Kline - TrueSpectra Don Wright - Lexmark
Dave Kuntz - Hewlett-Packard Rick Yardumian - Xerox
Takami Kurono - Brother Lloyd Young - Lexmark
Rich Landau - Digital Peter Zehler - Xerox
Greg LeClair - Epson Frank Zhao - Panasonic
Steve Zilles - Adobe
9. Appendix A: Protocol Examples ๐ง
9.1 Print-Job Request ๐จ๏ธโจ
okay bestie, this is a Print-Job request with job-name, copies, and sides all specified ๐. the ipp-attribute-fidelity attribute is set to 'true', so the print request fails if the copies or the sides attribute isn't supported, or if their values aren't supported. it's giving strict bouncer energy ๐
Octets Symbolic Value Protocol field
0x0100 1.0 version-number
0x0002 Print-Job operation-id
0x00000001 1 request-id
0x01 start operation-attributes operation-attributes-tag
0x47 charset type value-tag
0x0012 name-length
attributes- attributes-charset name
charset
0x0008 value-length
us-ascii US-ASCII value
0x48 natural-language type value-tag
0x001B name-length
attributes- attributes-natural-language name
natural-
language
0x0005 value-length
en-us en-US value
0x45 uri type value-tag
0x000B name-length
printer-uri printer-uri name
0x001A value-length
http://forest: printer pinetree value
631/pinetree
0x42 nameWithoutLanguage type value-tag
0x0008 name-length
job-name job-name name
0x0006 value-length
foobar foobar value
0x22 boolean type value-tag
0x16 name-length
ipp-attribute- ipp-attribute-fidelity name
fidelity
0x01 value-length
0x01 true value
0x02 start job-attributes job-attributes-tag
0x21 integer type value-tag
0x0006 name-length
copies copies name
0x0004 value-length
0x00000014 20 value
0x44 keyword type value-tag
0x0005 name-length
sides sides name
0x0013 value-length
two-sided- two-sided-long-edge value
long-edge
0x03 end-of-attributes end-of-attributes-tag
%!PS... <PostScript> data
9.2 Print-Job Response (successful) ๐
here's a successful Print-Job response to that previous request ๐ฆ. the printer supported the copies and sides attributes and their values, so everything went through. the status code returned is 'successful-ok' โจ
Octets Symbolic Value Protocol field
0x0100 1.0 version-number
0x0000 successful-ok status-code
0x00000001 1 request-id
0x01 start operation-attributes operation-attributes-tag
0x47 charset type value-tag
0x0012 name-length
attributes- attributes-charset name
charset
0x0008 value-length
us-ascii US-ASCII value
0x48 natural-language type value-tag
0x001B name-length
attributes- attributes-natural- name
natural-language language
0x0005 value-length
en-us en-US value
0x41 textWithoutLanguage type value-tag
0x000E name-length
status-message status-message name
0x000D value-length
successful-ok successful-ok value
0x02 start job-attributes job-attributes-tag
0x21 integer value-tag
0x0006 name-length
Octets Symbolic Value Protocol field
job-id job-id name
0x0004 value-length
147 147 value
0x45 uri type value-tag
0x0007 name-length
job-uri job-uri name
0x001E value-length
http://forest:63 job 123 on pinetree value
1/pinetree/123
0x42 nameWithoutLanguage type value-tag
0x0009 name-length
job-state job-state name
0x0004 value-length
0x0003 pending value
0x03 end-of-attributes end-of-attributes-tag
9.3 Print-Job Response (failure) ๐
this one is an unsuccessful Print-Job response to that same request ๐ญ. it fails because the printer doesn't support the sides attribute, and because the value '20' for the copies attribute isn't supported. so no job gets created, and neither a job-id nor a job-uri operation attribute comes back. the error code returned is 'client-error-attributes-or-values-not-supported' (0x040B) ๐
Octets Symbolic Value Protocol field
0x0100 1.0 version-number
0x040B client-error-attributes-or- status-code
values-not-supported
0x00000001 1 request-id
0x01 start operation-attributes operation-attribute tag
0x47 charset type value-tag
0x0012 name-length
attributes- attributes-charset name
charset
0x0008 value-length
us-ascii US-ASCII value
0x48 natural-language type value-tag
0x001B name-length
attributes- attributes-natural-language name
natural-
language
0x0005 value-length
Octets Symbolic Value Protocol field
en-us en-US value
0x41 textWithoutLanguage type value-tag
0x000E name-length
status- status-message name
message
0x002F value-length
client-error- client-error-attributes-or- value
attributes- values-not-supported
or-values-
not-supported
0x05 start unsupported-attributes unsupported-attributes tag
0x21 integer type value-tag
0x0006 name-length
copies copies name
0x0004 value-length
0x00000014 20 value
0x10 unsupported (type) value-tag
0x0005 name-length
sides sides name
0x0000 value-length
0x03 end-of-attributes end-of-attributes-tag
9.4 Print-Job Response (success with attributes ignored) ๐
last one, and it's a plot twist ๐ง. this is a successful Print-Job response to a request like the previous one, except the ipp-attribute-fidelity value is false ๐. the print request succeeds even though the printer supports neither the sides attribute nor the value '20' for the copies attribute. so a job is created, and both a job-id and a job-uri operation attribute come back ๐. the unsupported attributes get returned too, in an Unsupported Attributes Group. the error code returned is 'successful-ok-ignored-or-substituted-attributes' (0x0001) โจ๐
Octets Symbolic Value Protocol field
0x0100 1.0 version-number
0x0001 successful-ok-ignored-or- status-code
substituted-attributes
0x00000001 1 request-id
0x01 start operation-attributes operation-attributes-tag
0x47 charset type value-tag
0x0012 name-length
attributes- attributes-charset name
charset
0x0008 value-length
Octets Symbolic Value Protocol field
us-ascii US-ASCII value
0x48 natural-language type value-tag
0x001B name-length
attributes- attributes-natural- name
natural-language language
0x0005 value-length
en-us en-US value
0x41 textWithoutLanguage type value-tag
0x000E name-length
status-message status-message name
0x002F value-length
successful-ok- successful-ok-ignored-or- value
ignored-or- substituted-attributes
substituted-
attributes
0x05 start unsupported- unsupported-attributes
attributes tag
0x21 integer type value-tag
0x0006 name-length
copies copies name
0x0004 value-length
0x00000014 20 value
0x10 unsupported (type) value-tag
0x0005 name-length
sides sides name
0x0000 value-length
0x02 start job-attributes job-attributes-tag
0x21 integer value-tag
0x0006 name-length
job-id job-id name
0x0004 value-length
147 147 value
0x45 uri type value-tag
0x0007 name-length
job-uri job-uri name
0x001E value-length
http://forest:63 job 123 on pinetree value
1/pinetree/123
0x42 nameWithoutLanguage type value-tag
0x0009 name-length
job-state job-state name
0x0004 value-length
0x0003 pending value
0x03 end-of-attributes end-of-attributes-tag
9.5 Print-URI Request ๐ฆ
okay so this one is a Print-URI request asking for copies and a job-name, and it's giving main character energy ๐ the printer gets the job by URI instead of a document, so there's no document-format sneaking in here ๐ธ the operation-attributes group, the job-attributes group, and the end tag all show up in order ๐
Octets Symbolic Value Protocol field
0x0100 1.0 version-number
Octets Symbolic Value Protocol field
0x0003 Print-URI operation-id
0x00000001 1 request-id
0x01 start operation-attributes operation-attributes-tag
0x47 charset type value-tag
0x0012 name-length
attributes- attributes-charset name
charset
0x0008 value-length
us-ascii US-ASCII value
0x48 natural-language type value-tag
0x001B name-length
attributes- attributes-natural-language name
natural-
language
0x0005 value-length
en-us en-US value
0x45 uri type value-tag
0x000B name-length
printer-uri printer-uri name
0x001A value-length
http://forest printer pinetree value
:631/pinetree
0x45 uri type value-tag
0x000C name-length
document-uri document-uri name
0x11 value-length
ftp://foo.com ftp://foo.com/foo value
/foo
0x42 nameWithoutLanguage type value-tag
0x0008 name-length
job-name job-name name
0x0006 value-length
foobar foobar value
0x02 start job-attributes job-attributes-tag
0x21 integer type value-tag
0x0006 name-length
copies copies name
0x0004 value-length
0x00000001 1 value
0x03 end-of-attributes end-of-attributes-tag
9.6 Create-Job Request ๐ง
next up is a Create-Job request with no parameters and no attributes, so it's basically the minimalist era โจ it still needs the version, the operation, the request-id, and the operation-attributes group with the charset, language, and printer-uri, then it ends ๐ซถ
Octets Symbolic Value Protocol field
0x0100 1.0 version-number
0x0005 Create-Job operation-id
0x00000001 1 request-id
0x01 start operation-attributes operation-attributes-tag
0x47 charset type value-tag
0x0012 name-length
Octets Symbolic Value Protocol field
attributes- attributes-charset name
charset
0x0008 value-length
us-ascii US-ASCII value
0x48 natural-language type value-tag
0x001B name-length
attributes- attributes-natural-language name
natural-
language
0x0005 value-length
en-us en-US value
0x45 uri type value-tag
0x000B name-length
printer-uri printer-uri name
0x001A value-length
http://forest: printer pinetree value
631/pinetree
0x03 end-of-attributes end-of-attributes-tag
9.7 Get-Jobs Request ๐
this is a Get-Jobs request with parameters but no attributes ๐ (lowkey the name is doing a lot here) it asks for a limit of 50 and a requested-attributes list with job-id, job-name, and document-format, so the printer knows exactly what to send back ๐
Octets Symbolic Value Protocol field
0x0100 1.0 version-number
0x000A Get-Jobs operation-id
0x00000123 0x123 request-id
0x01 start operation-attributes operation-attributes-tag
0x47 charset type value-tag
Octets Symbolic Value Protocol field
0x0012 name-length
attributes- attributes-charset name
charset
0x0008 value-length
us-ascii US-ASCII value
0x48 natural-language type value-tag
0x001B name-length
attributes- attributes-natural-language name
natural-
language
0x0005 value-length
en-us en-US value
0x45 uri type value-tag
0x000B name-length
printer-uri printer-uri name
0x001A value-length
http://forest:6 printer pinetree value
31/pinetree
0x21 integer type value-tag
0x0005 name-length
limit limit name
0x0004 value-length
0x00000032 50 value
0x44 keyword type value-tag
0x0014 name-length
requested- requested-attributes name
attributes
0x0006 value-length
job-id job-id value
0x44 keyword type value-tag
0x0000 additional value name-length
0x0008 value-length
job-name job-name value
0x44 keyword type value-tag
0x0000 additional value name-length
0x000F value-length
document-format document-format value
0x03 end-of-attributes end-of-attributes-tag
9.8 Get-Jobs Response ๐
and here's the response to that last request ๐ the printer sends back three jobs, but it keeps the second one's details to itself (for security reasons ๐), so you'll only see info on the first and third. the status is successful-ok and the request-id gets echoed back, which is so iconic of it ๐
Octets Symbolic Value Protocol field
0x0100 1.0 version-number
0x0000 successful-ok status-code
0x00000123 0x123 request-id (echoed
back)
0x01 start operation-attributes operation-attribute-tag
0x47 charset type value-tag
0x0012 name-length
attributes- attributes-charset name
charset
0x000A value-length
ISO-8859-1 ISO-8859-1 value
0x48 natural-language type value-tag
0x001B name-length
attributes- attributes-natural-language name
natural-
language
0x0005 value-length
en-us en-US value
0x41 textWithoutLanguage type value-tag
0x000E name-length
status-message status-message name
0x000D value-length
successful-ok successful-ok value
0x02 start job-attributes (1st job-attributes-tag
object)
0x21 integer type value-tag
0x0006 name-length
job-id job-id name
0x0004 value-length
147 147 value
0x36 nameWithLanguage value-tag
0x0008 name-length
job-name job-name name
0x000C value-length
0x0005 sub-value-length
fr-ca fr-CA value
0x0003 sub-value-length
fou fou name
0x02 start job-attributes (2nd job-attributes-tag
object)
0x02 start job-attributes (3rd job-attributes-tag
object)
0x21 integer type value-tag
0x0006 name-length
job-id job-id name
0x0004 value-length
Octets Symbolic Value Protocol field
148 148 value
0x36 nameWithLanguage value-tag
0x0008 name-length
job-name job-name name
0x0012 value-length
0x0005 sub-value-length
de-CH de-CH value
0x0009 sub-value-length
isch guet isch guet name
0x03 end-of-attributes end-of-attributes-tag
10. Appendix C: Registration of MIME Media Type Information for "application/ipp" ๐
okay so this appendix is the paperwork bit ๐ It has everything IANA needs to register a MIME media type. Everything after this paragraph gets sent to IANA so they can register application/ipp, whose contents are defined in Section 3 "Encoding of the Operation Layer" in this document.
MIME type name: application
MIME subtype name: ipp
A Content-Type of "application/ipp" means an Internet Printing Protocol message body, either a request or a response ๐จ๏ธ Right now there's only one version, IPP/1.0. Its syntax is described in Section 3 "Encoding of the Operation Layer" of [RFC2565], and its semantics are described in [RFC2566].
Required parameters: none
Optional parameters: none
Encoding considerations:
IPP/1.0 requests and responses MAY contain long lines and ALWAYS contain binary data (for example, attribute value lengths) ๐ง
Security considerations:
IPP/1.0 requests and responses don't add any security risks that aren't already inherent in the underlying transport protocols ๐ The mixed-version interworking rules in [RFC2566], and the protocol encoding rules in [RFC2565], are complete and unambiguous.
Interoperability considerations:
IPP/1.0 requests (generated by clients) and responses (generated by servers) MUST comply with all conformance requirements imposed by the normative specifications [RFC2566] and [RFC2565]. The protocol encoding rules in [RFC2565] are comprehensive, so interoperability between conforming implementations is guaranteed. Support for specific optional features is not ensured, though ๐ซถ Both the "charset" and the "natural-language" of every IPP/1.0 attribute value that is a LOCALIZED-STRING are explicit within the IPP protocol requests and responses. You don't need any outside info from HTTP, SMTP, or other message transport headers to figure them out โจ
Published specification:
[RFC2566] Isaacson, S., deBry, R., Hastings, T., Herriot, R. and P.
Powell, "Internet Printing Protocol/1.0: Model and
Semantics" RFC 2566, April 1999.
[RFC2565] Herriot, R., Butler, S., Moore, P., Tuner, R., "Internet
Printing Protocol/1.0: Encoding and Transport", RFC 2565,
April 1999.
Applications which use this media type:
IPP print clients and print servers use this type when they talk to each other over HTTP/1.1 (see [RFC2565]), SMTP/ESMTP, FTP, or some other transport protocol ๐ฎ Messages of type "application/ipp" are self-contained and transport-independent. That includes the "charset" and "natural-language" context for any LOCALIZED-STRING value, so the message carries its own context with it ๐
Person & email address to contact for further information:
Scott A. Isaacson
Novell, Inc.
122 E 1700 S
Provo, UT 84606
Phone: 801-861-7366
Fax: 801-861-4025
Email: sisaacson@novell.com
or
Robert Herriot (Editor)
Xerox Corporation
3400 Hillview Ave., Bldg #1
Palo Alto, CA 94304
Phone: 650-813-7696
Fax: 650-813-6860
EMail: rherriot@pahv.xerox.com
11. Full Copyright Statement ยฉ
this part is the legal stuff, so I'm keeping the wording exactly as written ๐
Copyright (C) The Internet Society (1999). All Rights Reserved.
This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself may not be modified in any way, such as by removing the copyright notice or references to the Internet Society or other Internet organizations, except as needed for the purpose of developing Internet standards in which case the procedures for copyrights defined in the Internet Standards process must be followed, or as required to translate it into languages other than English.
The limited permissions granted above are perpetual and will not be revoked by the Internet Society or its successors or assigns.
This document and the information contained herein is provided on an "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. ๐ฆ
๐ฆ where this page comes from
- ietf: rfc2565 1999-04
- ๐ girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms