index.html
102 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Guidelines for Web Content Transformation Proxies 1.0</title>
<style type="text/css">
code { font-family: monospace; }
div.constraint,
div.issue,
div.note,
div.notice { margin-left: 2em; }
ol.enumar { list-style-type: decimal; }
ol.enumla { list-style-type: lower-alpha; }
ol.enumlr { list-style-type: lower-roman; }
ol.enumua { list-style-type: upper-alpha; }
ol.enumur { list-style-type: upper-roman; }
div.exampleInner pre { margin-left: 1em;
margin-top: 0em; margin-bottom: 0em}
div.exampleOuter {border: 4px double gray;
margin: 0em; padding: 0em}
div.exampleInner { background-color: #d5dee3;
border-top-width: 4px;
border-top-style: double;
border-top-color: #d3d3d3;
border-bottom-width: 4px;
border-bottom-style: double;
border-bottom-color: #d3d3d3;
padding: 4px; margin: 0em }
div.exampleWrapper { margin: 4px }
div.exampleHeader { font-weight: bold;
margin: 4px}
.new
{
background-color: #FFFF80;
color: inherit;
}
.requirement
{
background-color: #DDDD80;
color: inherit;
border: 1px black solid;
padding: 0.5em;
}
.requirement:before
{
content: "Requirement: ";
font-weight: bold;
}
.image
{
text-align: center;
}
.flow1
{
font-family: monospace;
font-size:smaller
}
.flow2
{
margin-left: 2em;
font-family: monospace;
font-size:smaller
}
.flow3
{
margin-left: 4em;
font-family: monospace;
font-size:smaller
}
pre
{
border:none;
}</style>
<link rel="stylesheet" type="text/css" href="http://www.w3.org/StyleSheets/TR/W3C-WG-NOTE.css" />
</head>
<body>
<div class="head">
<p><a href="http://www.w3.org/"><img src="http://www.w3.org/Icons/w3c_home" alt="W3C" height="48" width="72"/></a></p>
<h1><a name="title" id="title"></a>Guidelines for Web Content Transformation Proxies 1.0</h1>
<h2><a name="w3c-doctype" id="w3c-doctype"></a>W3C Working Group Note 26 October 2010</h2>
<dl>
<dt>This version:</dt>
<dd>
<a href="http://www.w3.org/TR/2010/NOTE-ct-guidelines-20101026/">http://www.w3.org/TR/2010/NOTE-ct-guidelines-20101026/</a>
</dd>
<dt>Latest version:</dt>
<dd>
<a href="http://www.w3.org/TR/ct-guidelines/">http://www.w3.org/TR/ct-guidelines/</a>
</dd>
<dt>Previous version:</dt>
<dd>
<a href="http://www.w3.org/TR/2010/CR-ct-guidelines-20100617/">http://www.w3.org/TR/2010/CR-ct-guidelines-20100617/</a>
</dd>
<dt>Editor:</dt>
<dd>Jo Rabin, Invited Expert (and before at mTLD Top Level Domain, dotMobi)</dd>
</dl>
<p class="copyright"><a href="http://www.w3.org/Consortium/Legal/ipr-notice#Copyright">Copyright</a> © 2010 <a href="http://www.w3.org/"><acronym title="World Wide Web Consortium">W3C</acronym></a><sup>®</sup> (<a href="http://www.csail.mit.edu/"><acronym title="Massachusetts Institute of Technology">MIT</acronym></a>, <a href="http://www.ercim.eu/"><acronym title="European Research Consortium for Informatics and Mathematics">ERCIM</acronym></a>, <a href="http://www.keio.ac.jp/">Keio</a>), All Rights Reserved. W3C <a href="http://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer">liability</a>, <a href="http://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks">trademark</a> and <a href="http://www.w3.org/Consortium/Legal/copyright-documents">document use</a> rules apply.
</p>
</div>
<hr />
<div>
<h2><a name="abstract" id="abstract"></a>Abstract</h2>
<p>This document provides guidance to Content Transformation proxies as to whether and how to transform Web content.</p>
<p>Content Transformation proxies alter requests sent by user agents to
servers and responses returned by servers so that the appearance,
structure or control flow of Web
applications are modified. Content Transformation proxies are mostly
used to convert Web sites designed for desktop computers to a form
suitable for mobile
devices.
</p>
<p>Based on current practice and standards, this document specifies
mechanisms with which Content Transformation proxies should make their
presence known to other parties, present the outcome of alterations
performed on HTTP traffic, and react to indications set by clients or
servers to constrain these alterations.
</p>
<p>The objective is to reduce undesirable effects on Web applications,
especially mobile-ready ones, and to limit the diversity in the modes of
operation of Content Transformation proxies, while at the same time
allowing proxies to alter content that would otherwise not display
successfully on mobile devices.
</p>
<p>Important considerations regarding the impact on security are highlighted.</p>
</div>
<div>
<h2><a name="status" id="status"></a>Status of this Document</h2>
<p><em>This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the <a href="http://www.w3.org/TR/">W3C technical reports index</a> at http://www.w3.org/TR/.</em></p>
<p>This document was developed by the <a href="http://www.w3.org/2005/MWI/BPWG/">Mobile Web Best Practices Working Group</a> as part of the <a href="http://www.w3.org/Mobile/">Mobile Web Initiative</a>.</p>
<p>This document was expected to become a W3C Recommendation and was published as a W3C Candidate Recommendation on <a href="http://www.w3.org/TR/2010/CR-ct-guidelines-20100617/" title="Candidate Recommendation of the Guidelines for Web Content Transformation Proxies published on 17 June 2010">17 June 2010</a>. As of October 2010, the Mobile Web Best Practices Working Group acknowledges the lack of existing implementations. Nevertheless, it also believes that the guidelines establish a framework acceptable by all parties involved.</p>
<p>The Mobile Web Best Practices Working Group eventually resolved to discontinue the work on this document and to publish it as a <strong>Working Group Note</strong>. The Working Group hopes that this Note may serve as a basis for discussion and negotiation among players.</p>
<p>Other than changes to this section, the document has not changed since its publication as a W3C Candidate Recommendation. In particular, the use of normative language has been kept as-is.</p>
<p>Comments on this document may be sent to the Working Group's public email list <a href="mailto:public-bpwg-comments@w3.org">public-bpwg-comments@w3.org</a> (with <a href="http://lists.w3.org/Archives/Public/public-bpwg-comments/">public archive</a>).</p>
<p>The public <a href="mailto:public-content-transformation-conformance@w3.org">public-content-transformation-conformance@w3.org</a> mailing-list (with <a href="http://lists.w3.org/Archives/Public/public-content-transformation-conformance/" title="Public archive for the public-content-transformation-conformance mailing-list">public archive</a>) that had been created to gather implementation feedback may still be used for that purpose. The Working Group also invites people willing to contribute to the <a href="http://dev.w3.org/2010/ct-guidelines/test-suite/">test case repository</a> to let themselves known on the <a href="mailto:public-bpwg-comments@w3.org">public-bpwg-comments@w3.org</a> public mailing-list, noting however that no further work is anticipated on that topic within the group as of October 2010. Please check the <a href="http://dev.w3.org/2010/ct-guidelines/test-suite/">test case repository</a> for up-to-date information.</p>
<p>Publication as a Working Group Note does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.</p>
<p>This document was produced by a group operating under the <a href="http://www.w3.org/Consortium/Patent-Policy-20040205/">5 February 2004 W3C Patent Policy</a>. W3C maintains a <a rel="disclosure" href="http://www.w3.org/2004/01/pp-impl/37584/status">public list of any patent disclosures</a> made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains <a href="http://www.w3.org/Consortium/Patent-Policy-20040205/#def-essential">Essential Claim(s)</a> must disclose the information in accordance with <a href="http://www.w3.org/Consortium/Patent-Policy-20040205/#sec-Disclosure">section 6 of the W3C Patent Policy</a>. </p>
</div>
<div class="toc">
<h2><a name="contents" id="contents"></a>Table of Contents</h2>
<p class="toc">1 <a href="#sec-introduction">Introduction (Non-Normative)</a><br />
1.1 <a href="#sec-purpose">Purpose</a><br />
1.2 <a href="#sec-audience">Audience</a><br />
1.3 <a href="#sec-scope">Scope</a><br />
1.4 <a href="#sec-principles">Principles</a><br />
1.4.1 <a href="#sec-iab-considerations">IAB Considerations</a><br />
1.4.2 <a href="#sec-priority-of-intention">Priority of Intention</a><br />
2 <a href="#sec-terminology">Terminology (Normative)</a><br />
2.1 <a href="#sec-types-of-proxy">Types of Proxy</a><br />
2.2 <a href="#sec-types-of-transformation">Types of Transformation</a><br />
2.3 <a href="#sec-informing-the-user">User Interaction</a><br />
3 <a href="#sec-conformance">Conformance (Normative)</a><br />
3.1 <a href="#sec-classes-of-product">Classes of Product</a><br />
3.2 <a href="#sec-normative-and-informative-parts">Normative and Informative Parts</a><br />
3.3 <a href="#sec-rfc2119">Normative Language for Conformance Requirements</a><br />
3.4 <a href="#sec-transformation-deployment-conformance">Transformation Deployment Conformance</a><br />
4 <a href="#sec-Components">Behavior of Components (Normative)</a><br />
4.1 <a href="#sec-ProxyReqest">Proxy Forwarding of Request</a><br />
4.1.1 <a href="#sec-applicable-HTTP-methods">Applicable HTTP Methods</a><br />
4.1.2 <a href="#sec-request-no-transform">no-transform directive in Request</a><br />
4.1.3 <a href="#sec-non-web-browsers">Treatment of Requesters that are not Web browsers</a><br />
4.1.4 <a href="#sec-serving-cached-responses">Serving Cached Responses</a><br />
4.1.5 <a href="#sec-altering-header-values">Alteration of HTTP Header Field Values</a><br />
4.1.5.1 <a href="#sec-content-tasting">Content Tasting</a><br />
4.1.5.2 <a href="#sec-avoiding-request-unacceptable">Avoiding "Request Unacceptable" Responses</a><br />
4.1.5.3 <a href="#sec-user-selection">User Selection of Restructured Experience</a><br />
4.1.5.4 <a href="#sec-sequence-of-requests">Sequence of Requests</a><br />
4.1.5.5 <a href="#sec-original-headers">Original Header Fields</a><br />
4.1.6 <a href="#sec-additional-headers">Additional HTTP Header Fields</a><br />
4.1.6.1 <a href="#sec-via-headers">Proxy Treatment of Via Header Field</a><br />
4.2 <a href="#sec-Proxy-Response">Proxy Forwarding of Response to User Agent</a><br />
4.2.1 <a href="#sec-administrative-arrangements">User Preferences</a><br />
4.2.2 <a href="#sec-receipt-of-cache-control-no-transform">Receipt of Cache-Control: no-transform</a><br />
4.2.3 <a href="#sec-proxy-use-of-no-transform">Use of Cache-Control: no-transform</a><br />
4.2.4 <a href="#sec-unacceptable-response">Server Rejection of HTTP Request</a><br />
4.2.5 <a href="#sec-receipt-of-vary-header">Receipt of Vary HTTP Header Field</a><br />
4.2.6 <a href="#sec-receipt-of-link-to-handheld">Link to "handheld" Representation</a><br />
4.2.7 <a href="#sec-WML-content">WML Content</a><br />
4.2.8 <a href="#sec-proxy-decision-to-transform">Proxy Decision to Transform</a><br />
4.2.8.1 <a href="#sec-alteration-of-response">Alteration of Response</a><br />
4.2.8.2 <a href="#sec-link-rewriting">Link Rewriting</a><br />
4.2.8.3 <a href="#sec-https-link-rewriting">HTTPS Link Rewriting</a><br />
5 <a href="#sec-testing">Testing (Normative)</a><br />
</p>
<h3><a name="appendices" id="appendices"></a>Appendices
</h3>
<p class="toc">A <a href="#sec-references">References</a><br />
B <a href="#sec-ConformanceStatement">Conformance Statement</a><br />
C <a href="#sec-Mobile-Content-Types">Internet Content Types associated with Mobile Content</a><br />
D <a href="#sec-Data-Content-Types">Internet Content Types associated with Data Content</a><br />
E <a href="#sec-Mobile-DOCTYPES">DOCTYPEs Associated with Mobile Content</a><br />
F <a href="#sec-Mobile-URI-Patterns">URI Patterns Associated with Mobile Web Sites</a><br />
G <a href="#sec-Summary-User-Preference-Handling">Summary of User Preference Handling</a><br />
H <a href="#sec-example-transformation-interactions">Example Transformation Interactions</a> (Non-Normative)<br />
H.1 <a href="#sec-basic-content-tasting">Basic Content Tasting by Proxy</a><br />
H.2 <a href="#sec-proxy-a-priori-knowledge">Optimization based on Previous Server Interaction</a><br />
H.3 <a href="#sec-optimization-previous-interaction">Optimization based on Previous Server Interaction, Server has Changed its
Operation</a><br />
H.4 <a href="#sec-representation-intended">Server Response Indicating that this Representation is Intended for the Target
Device</a><br />
H.5 <a href="#sec-another-representation">Server Response Indicating that another Representation is Intended for the
Target Device</a><br />
I <a href="#sec-guidance-origin-servers">Informative Guidance for Origin Servers</a> (Non-Normative)<br />
I.1 <a href="#sec-ServerResponse">Server Response to Proxy</a><br />
I.1.1 <a href="#sec-server-use-of-406">Use of HTTP 406 Status</a><br />
I.1.2 <a href="#sec-server-use-of-403">Use of HTTP 403 Status</a><br />
I.1.3 <a href="#sec-cache-control-no-transform">Server Origination of Cache-Control: no-transform</a><br />
I.1.4 <a href="#sec-varying-representations">Varying Representations</a><br />
I.1.4.1 <a href="#sec-use-of-vary-header">Use of Vary HTTP Header Field</a><br />
I.1.4.2 <a href="#sec-use-of-link-element">Indication of Intended Presentation Media Type of Representation</a><br />
J <a href="#sec-applicability">Applicability to Transforming Solutions which are Out of Scope</a> (Non-Normative)<br />
K <a href="#sec-scope-for-future-work">Scope for Future Work</a> (Non-Normative)<br />
K.1 <a href="#sec-powder">POWDER</a><br />
K.2 <a href="#sec-link-http-header">link HTTP Header Field</a><br />
K.3 <a href="#sec-sources-devinfo">Sources of Device Information</a><br />
K.4 <a href="#sec-inter-proxy-comm">Inter Proxy Communication</a><br />
K.5 <a href="#sec-explicit-consent">Explicit Consent</a><br />
K.6 <a href="#sec-amendment-http">Amendment to and Refinement of HTTP</a><br />
L <a href="#sec-acknowledgements">Acknowledgments</a> (Non-Normative)<br />
</p>
</div>
<hr />
<div class="body">
<div class="div1">
<h2><a name="sec-introduction" id="sec-introduction"></a>1 Introduction (Non-Normative)</h2>
<div class="div2">
<h3><a name="sec-purpose" id="sec-purpose"></a>1.1 Purpose
</h3>
<p>Within this document <em>Content Transformation</em> refers to the
manipulation of requests to, and responses from, an origin server.
This manipulation is carried out by proxies in order to provide a
better user experience of content that would otherwise result in an
unsatisfactory experience on the device making the request.
</p>
<p>The W3C Mobile Web Best Practices Working Group neither approves nor disapproves of Content Transformation, but
recognizes that is being deployed widely across mobile data access networks. The
deployments are widely divergent to each other, with many non-standard HTTP
implications, and no well-understood means either of identifying the presence of
such transforming proxies, nor of controlling their actions. This document
establishes a framework to allow that to happen.
</p>
<p>The overall objective of this document is to provide a means, as far as is
practical, for users to be provided with at least a <a href="http://www.w3.org/TR/di-gloss/#def-functional-user-experience"
>"functional user experience"</a>
<a href="#ref-DIGLOSS">[Device Independence Glossary]</a> of the Web, when mobile, taking into account the
fact that an increasing number of content providers create experiences specially
tailored to the mobile context which they do not wish to be altered by third
parties. Equally it takes into account the fact that there remain a very large
number of Web sites that do not provide a <em>functional user
experience</em> when perceived on many mobile devices.
</p>
<p>It is stressed that this document is unlikely to be the last word on this topic. As noted below (<a href="#sec-scope"><span class="specref">1.3 Scope</span></a>) it is out of scope of this document to provide a comprehensive solution to control of transforming proxies, though such
a solution would appear to be needed. The document is an attempt to improve a situation at a point in time where there appears
to be disregard of the provisions of HTTP - and is primarily a reminder and an encouragement to follow those provisions more
closely.
</p>
</div>
<div class="div2">
<h3><a name="sec-audience" id="sec-audience"></a>1.2 Audience
</h3>
<p>The audience for this document is creators of Content Transformation proxies and
purchasers and operators of such proxies. The document also contains non-normative guidance for content providers whose services
may be accessed by means of such proxies.
</p>
</div>
<div class="div2">
<h3><a name="sec-scope" id="sec-scope"></a>1.3 Scope
</h3>
<p>The recommendations in this document refer only to "Web browsing" - i.e. access
by user agents that are intended primarily for interaction by users with HTML
Web pages (Web browsers) using HTTP. Clients that interact with proxies using
mechanisms other than HTTP (and that typically involve the download of a special
client) are out of scope, and are considered to be a distributed user agent.
Proxies which are operated in the control of or under the direction of the
operator of an origin server are similarly considered to be a distributed origin
server and hence out of scope.
</p>
<p>The W3C <a href="http://www.w3.org/2005/MWI/BPWG/">Mobile Web Best Practices Working Group</a> (BPWG) is not chartered to create new technology - its role is to advise on
best practice for use of existing technology. In satisfying Content
Transformation requirements, existing HTTP header fields, directives and behaviors
must be respected, and as far as is practical, no extensions to <a href="#ref-HTTP">[RFC 2616 HTTP]</a> are to be used.
</p>
<p>The recommendations in this document refer to interactions of a proxy and do not refer to any presumed aspects of the internal
operation of the proxy. For this reason, the document does not discuss use of "allow" and "disallow" lists (though it does
discuss behavior that is induced by the implementation of such lists). In addition it does not discuss details of how transformation
is carried out except if this is reflected in interoperability. For this reason, it does not discuss the insertion or insertion
of headers and footers or any other specific behaviors (though it does discuss the need for essential user interaction of
some form).
</p>
<p>Moral, legal and other similar questions are not in scope of this document. The BPWG does not have authority or expertise
to comment one way or another about setting precedent or authorising any particular behavior or its absence.
</p>
</div>
<div class="div2">
<h3><a name="sec-principles" id="sec-principles"></a>1.4 Principles
</h3>
<div class="div3">
<h4><a name="sec-iab-considerations" id="sec-iab-considerations"></a>1.4.1 IAB Considerations
</h4>
<p>The BPWG made reference to Internet Architecture Board (IAB) work on "Open Pluggable Edge Services" <a href="#ref-OPES">[RFC 3238 OPES]</a> for various
principles that underlie behavior of proxies. In this work the IAB expressed its
concerns about privacy,
control, monitoring, and accountability of such services.
</p>
</div>
<div class="div3">
<h4><a name="sec-priority-of-intention" id="sec-priority-of-intention"></a>1.4.2 Priority of Intention
</h4>
<p>The Web allows users considerable flexibility in respect of the representation of content. At the same time, Content Providers
may have a preferred manner in which they wish their content to be represented. Content Transformation must reconcile these
contrasting factors. In creating this Recommendation the BPWG has determined that Content Transformation proxies should respect
Content Providers intentions, where they are expressed, but may allow users to choose other representations, except where
Content Providers specifically prohibit this.
</p>
<p>The BPWG recognizes that there is neither a systematic vocabulary for Content Provider Intentions, nor a systematic means
of expression of such intentions. There is scope for further work in this area (see <a href="#sec-scope-for-future-work"><span class="specref">K Scope for Future Work</span></a>).
</p>
</div>
</div>
</div>
<div class="div1">
<h2><a name="sec-terminology" id="sec-terminology"></a>2 Terminology (Normative)</h2>
<div class="div2">
<h3><a name="sec-types-of-proxy" id="sec-types-of-proxy"></a>2.1 Types of Proxy
</h3>
<p>Alteration of HTTP requests and responses is not prohibited by HTTP other than in
the circumstances referred to in <a href="#ref-HTTP">[RFC 2616 HTTP]</a>
<a href="http://tools.ietf.org/html/rfc2616#section-13.5.2">Section 13.5.2</a> and <a href="http://tools.ietf.org/html/rfc2616#section-14.9.5">Section 14.9.5</a>.
</p>
<p>HTTP defines two types of proxy: transparent proxies and non-transparent proxies.
As discussed in <a href="#ref-HTTP">[RFC 2616 HTTP]</a>
<a href="http://tools.ietf.org/html/rfc2616#section-1.3">Section 1.3, Terminology</a>:
</p>
<p>
<a name="term-transparent" id="term-transparent" title="transparent proxy"
></a>"A <b>transparent
proxy</b> is a proxy that does not modify the request or response
beyond what is required for proxy authentication and identification.
<a name="term-non-transparent" id="term-non-transparent"
title="non-transparent proxy"
></a>A
<b>non-transparent proxy</b> is a proxy that modifies the request
or response in order to provide some added service to the user agent, such
as group annotation services, media type transformation, protocol reduction,
or anonymity filtering. Except where either transparent or
non-transparent behavior is explicitly stated, the HTTP proxy requirements apply
to both types of proxies."
</p>
<p>This document elaborates the behavior of non-transparent proxies, when used for
Content Transformation in the context discussed in <a href="#ref-CT-Landscape">[CT Landscape]</a>.
</p>
</div>
<div class="div2">
<h3><a name="sec-types-of-transformation" id="sec-types-of-transformation"
></a>2.2 Types of Transformation
</h3>
<p>Transforming proxies can carry out a wide variety of operations. In this document
we categorize these operations as follows (noting that these are general concepts that we do not formalize further):
</p>
<ol class="enumar">
<li>
<p>Alteration of Requests</p>
<p>Transforming proxies process requests in a number of ways, especially
replacement of various request header fields to avoid HTTP 406 Status
responses (if a server can not provide content that is compatible with
the original HTTP request header fields) and at user request.
</p>
</li>
<li>
<p>Alteration of Responses</p>
<p>There are three classes of operation on responses:</p>
<ol class="enumla">
<li>
<p>Restructuring content </p>
<p>
<a name="term-restructuring" id="term-restructuring" title="restructuring"
></a><b>Restructuring</b> content is a process whereby
the original layout is altered so that content is added or
removed or where the spatial or navigational relationship of
parts of content is altered, e.g. linearization
(i.e. reordering presentation elements, especially tables,
so that they fit on a narrow display and can be traversed
without horizontal scrolling) or pagination
(i.e. splitting a document too large to be stored
in or transmitted to the terminal in one piece,
so that it can be nevertheless accessed by browsing
through a succession of smaller interlinked documents).
It also includes rewriting URIs so that subsequent
requests are routed via the proxy handling the response.
</p>
</li>
<li>
<p>Recoding content</p>
<p>
<a name="term-recoding" id="term-recoding" title="recoding"></a><b>Recoding</b> content is a process whereby the
layout of the content remains the same, but details of its
encoding may be altered. Examples include re-encoding HTML
as XHTML, correcting invalid markup in HTML, conversion of
images between formats (but not, for example, reducing
animations to static images).
</p>
</li>
<li>
<p>Optimizing content</p>
<p>
<a name="term-optimizing" id="term-optimizing" title="optimizing"></a><b>Optimizing</b> content includes removing redundant
white space, re-compressing images (without loss of
fidelity) and compressing for transfer.
</p>
</li>
</ol>
</li>
</ol>
</div>
<div class="div2">
<h3><a name="sec-informing-the-user" id="sec-informing-the-user"></a>2.3 User Interaction
</h3>
<p>At various points in this document there is reference to "notifying the user", "informing the user" - in general making the
user aware that a situation exists or interacting with the user to solicit a choice of options. The expectation is that such
user interaction is conducted in a way that allows the user to perceive and interact with such information or choices in the
same way as they interact with the Web sites that they are visiting.
</p>
</div>
</div>
<div class="div1">
<h2><a name="sec-conformance" id="sec-conformance"></a>3 Conformance (Normative)</h2>
<div class="div2">
<h3><a name="sec-classes-of-product" id="sec-classes-of-product"></a>3.1 Classes of Product
</h3>
<p>The Content Transformation Guidelines specification has one class of products:</p>
<dl>
<dt class="label">Transformation Deployment</dt>
<dd>
<p>A Transformation Deployment is the provision of <a title="non-transparent proxy" href="#term-non-transparent">non-transparent</a> components
in the path of HTTP requests and responses. Provisions that are
applicable to a Transformation Deployment are identified in this
document by use of the term "transforming proxy" or "proxy" in the
singular or plural.
</p>
</dd>
</dl>
</div>
<div class="div2">
<h3><a name="sec-normative-and-informative-parts"
id="sec-normative-and-informative-parts"
></a>3.2 Normative and Informative Parts
</h3>
<p>Normative parts of this document are identified by the use of "(Normative)"
following the section name. Informative parts are identified by use of
"(Non-Normative)" following the section name.
</p>
</div>
<div class="div2">
<h3><a name="sec-rfc2119" id="sec-rfc2119"></a>3.3 Normative Language for Conformance Requirements
</h3>
<p>The key words <strong>must</strong>, <strong>must not</strong>,
<strong>required</strong>, <strong>shall</strong>, <strong>shall
not</strong>, <strong>should</strong>, <strong>should not</strong>,
<strong>recommended</strong>, <strong>not recommended</strong>, <strong>may</strong>, and
<strong>optional</strong> in this Recommendation have the meaning defined
in <a href="#ref-rfc-2119">[RFC 2119]</a>.
</p>
</div>
<div class="div2">
<h3><a name="sec-transformation-deployment-conformance"
id="sec-transformation-deployment-conformance"></a>3.4 Transformation Deployment Conformance
</h3>
<p>A Transformation Deployment conforms to these guidelines if it follows the
statements in <a href="#sec-transformation-deployment-conformance"><span class="specref">3.4 Transformation Deployment Conformance</span></a>, <a href="#sec-ProxyReqest"><span class="specref">4.1 Proxy Forwarding of Request</span></a>, <a href="#sec-Proxy-Response"><span class="specref">4.2 Proxy Forwarding of Response to User Agent</span></a> and <a href="#sec-testing"><span class="specref">5 Testing (Normative)</span></a>.
</p>
<p>A Transformation Deployment that wishes to claim conformance <strong>must</strong> make available a conformance statement <a href="#sec-ConformanceStatement"><span class="specref">B Conformance Statement</span></a> that specifies the reasons for non-compliance with any clauses containing the key words "<strong>should</strong>" and "<strong>should not</strong>", "<strong>recommended</strong>" and "<strong>not recommended</strong>".
</p>
<p>Conformance statements <strong>must</strong> be sent to <a href="mailto:public-content-transformation-conformance@w3.org">public-content-transformation-conformance@w3.org</a>. Public archive of this list may be found at <a href="http://lists.w3.org/Archives/Public/public-content-transformation-conformance/">http://lists.w3.org/Archives/Public/public-content-transformation-conformance/</a>.
</p>
</div>
</div>
<div class="div1">
<h2><a name="sec-Components" id="sec-Components"></a>4 Behavior of Components (Normative)</h2>
<div class="div2">
<h3><a name="sec-ProxyReqest" id="sec-ProxyReqest"></a>4.1 Proxy Forwarding of Request
</h3>
<div class="div3">
<h4><a name="sec-applicable-HTTP-methods" id="sec-applicable-HTTP-methods"
></a>4.1.1 Applicable HTTP Methods
</h4>
<p>User agents sometimes issue HTTP HEAD requests in order to determine if a
resource is of a type and/or size that they are capable of handling. A
transforming proxy <strong>may</strong> convert a HEAD request into a GET
request (in order to determine the characteristics of a transformed response
that it would return if the user agent subsequently issued a GET request for
the same resource).
</p>
<p>If the HTTP method is altered from HEAD to GET, proxies
<strong id="ta-49078">should</strong> (providing such action is in accordance with
normal HTTP caching rules) cache the response so that a second GET request
for the same content is not required (see also <a href="#sec-serving-cached-responses"><span class="specref">4.1.4 Serving Cached Responses</span></a>).
</p>
<p>Other than to convert between HEAD and GET proxies <strong id="ta-59418">must not</strong> alter request methods.
</p>
</div>
<div class="div3">
<h4><a name="sec-request-no-transform" id="sec-request-no-transform"></a>4.1.2 <code>no-transform</code> directive in Request
</h4>
<p>If the request contains a <code>Cache-Control: no-transform</code> directive, proxies <strong id="ta-41855">must not</strong> alter the request other than to comply with <a title="transparent proxy" href="#term-transparent">transparent</a> HTTP behavior defined in <a href="#ref-HTTP">[RFC 2616 HTTP]</a> sections <a href="http://tools.ietf.org/html/rfc2616.html#section-14.9.5">section 14.9.5</a> and <a href="http://tools.ietf.org/html/rfc2616.html#section-13.5.2">section 13.5.2</a> and to add header fields as described in <a href="#sec-additional-headers"><span class="specref">4.1.6 Additional HTTP Header Fields</span></a> below.
</p>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p>An example of the use of <code>Cache-Control: no-transform</code> is the
issuing of asynchronous HTTP requests, perhaps by means of
XMLHttpRequest <a href="#ref-XHR">[XHR]</a>, which may include such a
directive in order to prevent transformation of both the request and the
response.
</p>
</div>
</div>
<div class="div3">
<h4><a name="sec-non-web-browsers" id="sec-non-web-browsers"></a>4.1.3 Treatment of Requesters that are not Web browsers
</h4>
<p>Before altering aspects of HTTP requests and responses proxies need to take account of the fact that HTTP is used as a transport
mechanism for many applications other than "Traditional Browsing". Increasingly browser based applications involve exchanges
of data using XMLHttpRequest (see <a href="#sec-proxy-decision-to-transform"><span class="specref">4.2.8 Proxy Decision to Transform</span></a>) and alteration of such exchanges is likely to cause misoperation.
</p>
</div>
<div class="div3">
<h4><a name="sec-serving-cached-responses" id="sec-serving-cached-responses"
></a>4.1.4 Serving Cached Responses
</h4>
<p>Aside from the usual caching procedures defined in <a href="#ref-HTTP">[RFC 2616 HTTP]</a>, in some circumstances, proxies <strong>may</strong> paginate responses and
where this is the case a request may be for a subsequent page of a
previously requested resource. In this case proxies <strong>may</strong>
for the sake of consistency of representation serve stale data but when
doing so <strong id="ta-17538">should</strong> notify the user that this is the case and
<strong id="ta-19789">must</strong> provide a simple means of retrieving a fresh
copy.
</p>
</div>
<div class="div3">
<h4><a name="sec-altering-header-values" id="sec-altering-header-values"></a>4.1.5 Alteration of HTTP Header Field Values
</h4>
<p>Other than the modifications required by <a href="#ref-HTTP">[RFC 2616 HTTP]</a> proxies <strong id="ta-19234">should not</strong> modify the values of header fields other than
the <code>User-Agent</code>, <code>Accept</code>, <code>Accept-Charset</code>, <code>Accept-Encoding</code>, and <code>Accept-Language</code> header fields
and <strong id="ta-13875">must not</strong> delete header fields (see <a href="#sec-original-headers"><span class="specref">4.1.5.5 Original Header Fields</span></a>).
</p>
<p>Other than to comply with <a title="transparent proxy" href="#term-transparent">transparent</a> HTTP operation, proxies <strong id="ta-5564">should not</strong> modify <em>any</em> request header fields unless one of the following applies:
</p>
<ol class="enumar">
<li>
<p>the user would be prohibited from accessing content as a result of
the server responding that the request is "unacceptable" (see
<a href="#sec-unacceptable-response"><span class="specref">4.2.4 Server Rejection of HTTP Request</span></a>);
</p>
</li>
<li>
<p>the user has specifically requested a <a title="restructuring" href="#term-restructuring">restructured</a> desktop
experience (see <a href="#sec-user-selection"><span class="specref">4.1.5.3 User Selection of Restructured Experience</span></a>);
</p>
</li>
<li>
<p>the request is part of a sequence of requests comprising either included resources or linked resources
on the same Web site (see <a href="#sec-sequence-of-requests"><span class="specref">4.1.5.4 Sequence of Requests</span></a>).
</p>
</li>
</ol>
<p>These circumstances are detailed in the following sections.</p>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p>It is emphasized that requests <strong id="ta-32212">must not</strong> be altered in the presence of <code>Cache-Control: no-transform</code> as described under <a href="#sec-request-no-transform"><span class="specref">4.1.2 no-transform directive in Request</span></a>.
</p>
</div>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p id="term-web-site">In this section, the concept of "Web site" is used
(rather than "origin server") as some origin servers host many different
Web sites. Since the concept of "Web site" is not strictly defined,
proxies <strong id="ta-34769">should</strong> use heuristics including comparisons
of domain name to assess whether resources form part of the same "Web
site".
</p>
</div>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p>The URI referred to in the request plays no part in
determining whether or not to alter HTTP request header field values. In
particular the patterns mentioned in
<a href="#sec-proxy-decision-to-transform"><span class="specref">4.2.8 Proxy Decision to Transform</span></a> are not material.
</p>
</div>
<div class="div4">
<h5><a name="sec-content-tasting" id="sec-content-tasting"></a>4.1.5.1 Content Tasting
</h5>
<p>While complying with this section (<a href="#sec-altering-header-values"><span class="specref">4.1.5 Alteration of HTTP Header Field Values</span></a>) and section <a href="#sec-receipt-of-vary-header"><span class="specref">4.2.5 Receipt of Vary HTTP Header Field</span></a> proxies <strong id="ta-37267">should</strong> avoid making repeated requests for the same resource.
</p>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p>While HTTP does not prohibit repetition of GET requests, repeated requests place an unnecessary load on the network and server.
</p>
</div>
</div>
<div class="div4">
<h5><a name="sec-avoiding-request-unacceptable" id="sec-avoiding-request-unacceptable"
></a>4.1.5.2 Avoiding "Request Unacceptable" Responses
</h5>
<p>A proxy <strong>may</strong> reissue a request with altered HTTP header field
values if a previous request with unaltered values resulted in the
origin server rejecting the request as "unacceptable" (see <a href="#sec-unacceptable-response"><span class="specref">4.2.4 Server Rejection of HTTP Request</span></a>). A proxy <strong>may</strong> apply heuristics of
various kinds to assess, in advance of sending unaltered header field values,
whether the request is likely to cause a "request unacceptable"
response. If it determines that this is likely then it
<strong>may</strong> alter header field values without sending unaltered
values in advance, providing that it subsequently assesses the response
as described under <a href="#sec-receipt-of-vary-header"><span class="specref">4.2.5 Receipt of Vary HTTP Header Field</span></a> below,
and is prepared to reissue the request with unaltered header fields, and alter
its subsequent behavior in respect of the Web site so that unaltered
header fields are sent.
</p>
<p>A proxy <strong id="ta-8535">must not</strong> reissue a POST request as it is unsafe (see <a href="#ref-HTTP">[RFC 2616 HTTP]</a> <a href="http://tools.ietf.org/html/rfc2616#section-9.1.1">Section 9.1.1</a>).
</p>
</div>
<div class="div4">
<h5><a name="sec-user-selection" id="sec-user-selection"></a>4.1.5.3 User Selection of Restructured Experience
</h5>
<p>Proxies <strong id="ta-38106">must</strong> assume that by default users will wish
to receive a representation prepared by the Web site.
</p>
<p>Proxies <strong>may</strong> offer users an option to choose to view a
restructured experience even when a Web site offers a choice of user
experience. If a user has made such a choice then proxies
<strong>may</strong> alter header field values when requesting resources in
order to reflect that choice, but <strong id="ta-21844">must</strong>, on receipt of
an indication from a Web site that it offers alternative representations
(see <a href="#sec-use-of-link-element"><span class="specref">I.1.4.2 Indication of Intended Presentation Media Type of Representation</span></a>), inform the user of that
and allow them to select an alternative representation.
</p>
<p>Proxies
<strong id="ta-38061">must</strong> assess whether a user's expressed preference
for a restructured representation is still valid if a Web site changes
its choice of representations (see <a href="#sec-receipt-of-vary-header"><span class="specref">4.2.5 Receipt of Vary HTTP Header Field</span></a>).
</p>
</div>
<div class="div4">
<h5><a name="sec-sequence-of-requests" id="sec-sequence-of-requests"></a>4.1.5.4 Sequence of Requests
</h5>
<p>When requesting resources that are <a href="http://www.w3.org/TR/mobileOK-basic10-tests/#included_resources"
>included resources</a> (e.g. style sheets, images), proxies <strong id="ta-46682">should</strong>
make the request for such resources with the same <code>User-Agent</code> header field as the request
for the resource from which they are referenced.
</p>
<p>For the purpose of consistency of representation, proxies
<strong>may</strong> request linked resources (e.g. those referenced
using the <code>a</code> element) that form part of the same Web site as
a previously requested resource with the same header fields as the resource
from which they are referenced.
</p>
<p>When requesting linked resources that do not form part of the same Web
site as the resource from which they are linked, proxies <strong id="ta-7181">should
not</strong> base their choice of header fields on a consistency of
presentation premise.
</p>
</div>
<div class="div4">
<h5><a name="sec-original-headers" id="sec-original-headers"></a>4.1.5.5 Original Header Fields
</h5>
<p>When forwarding an HTTP request with altered HTTP header fields, in addition to complying with the rules of normal HTTP operation,
proxies
<strong id="ta-65343">must</strong> include in the request additional fields of the form <code>"X-Device-"<original
header name></code> whose values are verbatim copies of the corresponding
unaltered header field values, so that it is possible to reconstruct the original header fields. For example, if the <code>User-Agent</code>
header field has been altered, an <code>X-Device-User-Agent</code> header field
would be added with the value of the received
<code>User-Agent</code> header field.
</p>
<p>Specifically the following mapping <strong id="ta-23178">must</strong> be used:
</p>
<table>
<thead>
<tr>
<th rowspan="1" colspan="1">Original</th>
<th rowspan="1" colspan="1">Replacement</th>
<th rowspan="1" colspan="1">Ref</th>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="1" colspan="1"><code>User-Agent</code></td>
<td rowspan="1" colspan="1"><code>X-Device-User-Agent</code></td>
<td rowspan="1" colspan="1"><a href="http://tools.ietf.org/html/rfc2616#section-14.43">RFC2616 Section 14.43</a>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1"><code>Accept</code></td>
<td rowspan="1" colspan="1"><code>X-Device-Accept</code></td>
<td rowspan="1" colspan="1"><a href="http://tools.ietf.org/html/rfc2616#section-14.1">RFC2616 Section 14.1</a>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1"><code>Accept-Charset</code></td>
<td rowspan="1" colspan="1"><code>X-Device-Accept-Charset</code></td>
<td rowspan="1" colspan="1"><a href="http://tools.ietf.org/html/rfc2616#section-14.2">RFC2616 Section 14.2</a>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1"><code>Accept-Encoding</code></td>
<td rowspan="1" colspan="1"><code>X-Device-Accept-Encoding</code></td>
<td rowspan="1" colspan="1"><a href="http://tools.ietf.org/html/rfc2616#section-14.3">RFC2616 Section 14.3</a>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1"><code>Accept-Language</code></td>
<td rowspan="1" colspan="1"><code>X-Device-Accept-Language</code></td>
<td rowspan="1" colspan="1"><a href="http://tools.ietf.org/html/rfc2616#section-14.4">RFC2616 Section 14.4</a>
</td>
</tr>
</tbody>
</table>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p>The <code>X-Device-</code> prefixed header names listed in this section have been provisionally registered with IANA (see <a href="http://www.iana.org/assignments/message-headers/prov-headers.html"
>Provisional Message Header Field Names</a>).
</p>
</div>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p>The <code>X-Device-</code> prefix was chosen primarily on the basis
that this is an already existing convention. It is noted that the
values encoded in such header fields may not ultimately derive from a
device, they are merely received fields. The treatment of received
<code>X-Device</code> header fields, which may happen where there are
multiple transforming proxies, is undefined (see <a href="#sec-scope-for-future-work"><span class="specref">K Scope for Future Work</span></a>).
</p>
</div>
</div>
</div>
<div class="div3">
<h4><a name="sec-additional-headers" id="sec-additional-headers"></a>4.1.6 Additional HTTP Header Fields
</h4>
<p>Irrespective of the presence of a <code>no-transform</code> directive:
</p>
<ul>
<li>
<p>proxies <strong id="ta-12437">should</strong> add the IP address of the initiator
of the request to the end of a comma separated list in an
<code>X-Forwarded-For</code> HTTP header field;
</p>
</li>
<li>
<p>proxies <strong id="ta-14351">must</strong> (in accordance with RFC
2616) include a <code>Via</code> HTTP
header field (see <a href="#sec-via-headers"><span class="specref">4.1.6.1 Proxy Treatment of Via Header Field</span></a>).
</p>
</li>
</ul>
<div class="div4">
<h5><a name="sec-via-headers" id="sec-via-headers"></a>4.1.6.1 Proxy Treatment of <code>Via</code> Header Field
</h5>
<p>Proxies <strong id="ta-49612">should</strong> indicate their ability to transform content by including a comment in the <code>Via</code> HTTP
header field consisting of the URI "http://www.w3.org/ns/ct".
</p>
<p>When forwarding <code>Via</code> header fields, proxies <strong id="ta-41044">should
not</strong> alter them by removing comments from them.
</p>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p>According to <a href="#ref-HTTP">[RFC 2616 HTTP]</a>
<a href="http://tools.ietf.org/html/rfc2616#section-14.45">Section 14.45</a>
<code>Via</code> header field comments "<strong>may</strong> be removed
by any recipient prior to forwarding the message". However, the
justification for removing such comments is based on memory
limitations of early proxies. Most modern proxies do not suffer such
limitations.
</p>
</div>
</div>
</div>
</div>
<div class="div2">
<h3><a name="sec-Proxy-Response" id="sec-Proxy-Response"></a>4.2 Proxy Forwarding of Response to User Agent
</h3>
<p>In the following, proxies <strong id="ta-32045">must</strong> check for the presence of equivalent <code><meta http-equiv></code> elements in HTML content, if the relevant HTTP header field is not present.
</p>
<div class="div3">
<h4><a name="sec-administrative-arrangements" id="sec-administrative-arrangements"
></a>4.2.1 User Preferences
</h4>
<p>Proxies <strong id="ta-14363">must</strong> provide a means for users to express preferences for inhibiting content transformation even when content transformation has
been chosen by the user as the default behavior. Those preferences <strong id="ta-21589">must</strong> be maintained on a user by user and Web site by Web site basis.
</p>
<p>Proxies <strong id="ta-1707">must</strong> solicit re-expression of preferences in respect of a server if the server starts to indicate that it offers varying responses
as discussed under <a href="#sec-receipt-of-vary-header"><span class="specref">4.2.5 Receipt of Vary HTTP Header Field</span></a>.
</p>
</div>
<div class="div3">
<h4><a name="sec-receipt-of-cache-control-no-transform"
id="sec-receipt-of-cache-control-no-transform"
></a>4.2.2 Receipt of <code>Cache-Control: no-transform</code></h4>
<p>If the response includes a <code>Cache-Control: no-transform</code> directive
then proxies <strong id="ta-4894">must not</strong> alter it other than to comply with
<a title="transparent proxy" href="#term-transparent">transparent</a> HTTP behavior as described in <a href="#ref-HTTP">[RFC 2616 HTTP]</a> <a href="http://tools.ietf.org/html/rfc2616.html#section-13.5.2">Section 13.5.2</a> and <a href="http://tools.ietf.org/html/rfc2616.html#section-14.9.5">Section 14.9.5</a>.
</p>
</div>
<div class="div3">
<h4><a name="sec-proxy-use-of-no-transform" id="sec-proxy-use-of-no-transform"
></a>4.2.3 Use of <code>Cache-Control: no-transform</code></h4>
<p>Proxies <strong>may</strong> use <code>Cache-Control: no-transform</code> to inhibit transformation by further proxies.
</p>
</div>
<div class="div3">
<h4><a name="sec-unacceptable-response" id="sec-unacceptable-response"></a>4.2.4 Server Rejection of HTTP Request
</h4>
<p>Proxies <strong>may</strong>
treat responses with an HTTP 200 Status as though they were responses with
an HTTP 406 Status if it has determined that the content (e.g. "Your browser
is not supported") is equivalent to a response with an HTTP 406 Status.
</p>
</div>
<div class="div3">
<h4><a name="sec-receipt-of-vary-header" id="sec-receipt-of-vary-header"></a>4.2.5 Receipt of <code>Vary</code> HTTP Header Field
</h4>
<p>A proxy may not be carrying out content tasting as described under <a href="#sec-avoiding-request-unacceptable"><span class="specref">4.1.5.2 Avoiding "Request Unacceptable" Responses</span></a> if it anticipates receiving a "request unacceptable" response. However, if it makes a request with altered header fields
in these circumstances, and receives a response
containing a <code>Vary</code> header field referring to one of the altered
header fields then it <strong id="ta-58567">should</strong> request the resource again with
unaltered header fields. It <strong id="ta-52209">should</strong> also update whatever heuristics
it uses so that unaltered header fields are presented first in subsequent requests
for this resource.
</p>
</div>
<div class="div3">
<h4><a name="sec-receipt-of-link-to-handheld" id="sec-receipt-of-link-to-handheld"
></a>4.2.6 Link to "handheld" Representation
</h4>
<p>If the response is an HTML response and it contains a <code><link
rel="alternate" media="handheld" /></code> element (and the user agent is determined as being "handheld"), a proxy
<strong id="ta-43424">should</strong> request and process the referenced resource,
unless the resource referenced is the <a title="current representation" href="#term-current-representation">current representation</a>.
</p>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p><a name="term-current-representation" id="term-current-representation"
title="current representation"
></a>In this document the term <b>current representation</b> means a "same document reference" as defined in <a href="#ref-rfc-3986">[RFC 3986]</a> <a href="http://tools.ietf.org/html/rfc3986#section-4.4">Section 4.4</a>, with the addition that if a <code>Vary</code> HTTP header field was present on the response then it is the same representation if the values of the HTTP header fields
of the request have not been altered.
</p>
</div>
</div>
<div class="div3">
<h4><a name="sec-WML-content" id="sec-WML-content"></a>4.2.7 WML Content
</h4>
<p>If the content is WML proxies <strong id="ta-43472">should</strong> act in a <a title="transparent proxy" href="#term-transparent">transparent</a> manner.
</p>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p>This does not affect the operation of proxies that are also WAP Gateways.</p>
</div>
</div>
<div class="div3">
<h4><a name="sec-proxy-decision-to-transform" id="sec-proxy-decision-to-transform"
></a>4.2.8 Proxy Decision to Transform
</h4>
<p>In the absence of a <code>Vary</code> or <code>no-transform</code> directive
(or a <code>meta HTTP-Equiv</code> element containing <code>Cache-Control:
no-transform</code>) proxies <strong id="ta-64788">should not</strong> transform content matching any of the following rules unless the user has specifically requested transformation:
</p>
<ul>
<li>
<p>the content is HTML and contains <code><link rel="alternate" media="handheld"/></code> with a reference to the <a title="current representation" href="#term-current-representation">current representation</a>;
</p>
</li>
<li>
<p>the <code>DOCTYPE</code> of the content (if it has one) indicates XHTML-MP, XHTML Basic, WML or iMode as listed in <a href="#sec-Mobile-DOCTYPES"><span class="specref">E DOCTYPEs Associated with Mobile Content</span></a>;
</p>
</li>
<li>
<p>the <code>Content-Type</code> has a value listed in <a href="#sec-Mobile-Content-Types"><span class="specref">C Internet Content Types associated with Mobile Content</span></a>.
</p>
</li>
<li>
<p>the URI of the response (following redirection or as indicated by the
<code>Content-Location</code> HTTP header field) matches a pattern listed in <a href="#sec-Mobile-URI-Patterns"><span class="specref">F URI Patterns Associated with Mobile Web Sites</span></a>;
</p>
</li>
<li>
<p>the response contains a resource that is referenced as an <a href="http://www.w3.org/TR/mobileOK-basic10-tests/#included_resources"
>included resource</a> suitable for "handheld" in a resource that was itself handled transparently;
</p>
</li>
<li>
<p>the <code>Content-Type</code> indicates that the content is "data" - some values are listed in <a href="#sec-Data-Content-Types"><span class="specref">D Internet Content Types associated with Data Content</span></a>;
</p>
</li>
<li>
<p>a claim of mobileOK Basic <a href="#ref-mobileOK">[mobileOK Basic Tests]</a> conformance
is indicated (see <a href="#ref-mobileOK-scheme">[mobileOK Scheme]</a> for how such a claim may be indicated).
</p>
</li>
</ul>
<p>Other factors that a proxy <strong>may</strong> take into account:
</p>
<ul>
<li>
<p>The Web site (see <a href="#term-web-site">note</a>) has previously shown that it is
contextually aware, even if the present response does not indicate
this;
</p>
</li>
<li>
<p>the user agent has features (such as linearization or zoom, or is a desktop device using a mobile network for access) that
allow it to present the content unaltered;
</p>
</li>
<li>
<p>the response contains client side scripts that may misoperate if the
resource is restructured;
</p>
</li>
<li>
<p>the response is an HTML response and it includes
<code><link></code> elements specifying
alternatives according to presentation media type.
</p>
</li>
</ul>
<div class="div4">
<h5><a name="sec-alteration-of-response" id="sec-alteration-of-response"></a>4.2.8.1 Alteration of Response
</h5>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p>Other than as noted in this
section the nature of restructuring that is carried out, any character encoding alterations and what is
omitted and what is inserted is, as discussed in <a href="#sec-scope"><span class="specref">1.3 Scope</span></a>, out of scope of this document.
</p>
</div>
<p>If a proxy alters the response then:</p>
<ol class="enumar">
<li>
<p>It <strong id="ta-34526">must</strong> add a <code>Warning 214 Transformation
Applied</code> HTTP header field;
</p>
</li>
<li>
<p>The altered content <strong id="ta-55014">should</strong> validate according
to an appropriate published formal grammar and if XML <strong id="ta-10803">must</strong> be <a href="http://www.w3.org/TR/xml/#dt-wellformed">well-formed</a>;
</p>
</li>
<li>
<p>It <strong id="ta-39889">should</strong> indicate to the user that the
content has been transformed for mobile presentation and provide
an option to view the original, unmodified content.
</p>
</li>
</ol>
</div>
<div class="div4">
<h5><a name="sec-link-rewriting" id="sec-link-rewriting"></a>4.2.8.2 Link Rewriting
</h5>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p><a name="term-same-origin" id="term-same-origin" title="Same-Origin"></a>In this document two URIs have the <b>Same-Origin</b> if the <code>scheme</code> component and the <code>host</code> and <code>port</code> subcomponents, as defined in <a href="#ref-rfc-3986">[RFC 3986]</a>, all match. <a href="http://tools.ietf.org/html/rfc3986#section-6">Section 6</a> of <a href="#ref-rfc-3986">[RFC 3986]</a> discusses URI comparison.
</p>
</div>
<p>Some proxy deployments have to "rewrite" links in content in order for the user agent to request the referenced resources
through the proxy. In so doing, proxies make unrelated resources appear as though they have the <a title="Same-Origin" href="#term-same-origin">same-origin</a> and hence there is a danger of introducing security vulnerabilities.
</p>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p>This section (on link rewriting) refers also to insertion of links, frame flattening and any other techniques that introduces
the "same-origin" issue.
</p>
</div>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p>Link rewriting is always used by CT Proxies that are accessed as an origin server initially, e.g. which provide mobile adapted
web search and navigation to the web pages returned in the search results, or to which the browser is redirected through the
CT Proxy for adaptation of a web page. Link rewriting may be used by CT Proxies acting as normal HTTP proxies (e.g. configured
or transparent) for the browser, but may not be required since all browser requests flow through the CT Proxy.
</p>
</div>
<p>Proxies <strong id="ta-5078">must not</strong> rewrite links when content transformation is prohibited.
</p>
<p>Proxies <strong id="ta-18105">must</strong> preserve security between requests for domains that are not <a title="Same-Origin" href="#term-same-origin">same-origin</a> in respect of cookies and scripts.
</p>
</div>
<div class="div4">
<h5><a name="sec-https-link-rewriting" id="sec-https-link-rewriting"></a>4.2.8.3 HTTPS Link Rewriting
</h5>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p>For clarity it is emphasized that it is not possible for a
transforming proxy to transform content accessed via an HTTPS link
without breaking end-to-end security.
</p>
<p>Interception of HTTPS and the circumstances in which it might be permissible is not a "mobile" question, as such, but is highly
pertinent to this document. The BPWG is aware that interception of HTTPS happens in many networks today. Interception of HTTPS
is inherently problematic and may be unsafe. The BPWG would like to refer to protocol based "two party consent" mechanisms,
but such mechanisms do not exist at the time of writing of this document.
</p>
</div>
<p>The practice of intercepting HTTPS links is strongly <strong id="ta-43818">NOT RECOMMENDED</strong>.
</p>
<p>If a proxy rewrites HTTPS links, it
<strong id="ta-26858">must</strong> advise the user of the security implications
of doing so and <strong id="ta-17637">must</strong> provide the option to bypass it and to communicate with the server directly.
</p>
<p>Notwithstanding anything else in this document, proxies <strong id="ta-53227">must not</strong> rewrite HTTPS links in the presence of a <code>Cache-Control: no-transform</code> directive.
</p>
<p>If a proxy rewrites HTTPS links, replacement links
<strong id="ta-36041">must</strong> have the scheme <code>https</code>.
</p>
<p>When forwarding requests originating from HTTPS links proxies <strong id="ta-40493">must</strong> include a <code>Via</code> header field as discussed under <a href="#sec-via-headers"><span class="specref">4.1.6.1 Proxy Treatment of Via Header Field</span></a>.
</p>
<p>When forwarding responses from servers proxies <strong id="ta-10117">must</strong> notify the user of invalid server certificates.
</p>
</div>
</div>
</div>
</div>
<div class="div1">
<h2><a name="sec-testing" id="sec-testing"></a>5 Testing (Normative)</h2>
<p>Operators of content transformation proxies <strong id="ta-58462">should</strong>
make available an interface through which the functions of
the proxy can be exercised. The operations possible
through this interface <strong id="ta-4172">must</strong> cover those necessary to
settle the outcome of all conformance statements listed in
section B.
</p>
<p>The interface <strong id="ta-23958">must</strong> be reachable from terminals with
browsing capabilities connected to the Web via a
conventional Internet access environment at the tester's
premises; accessing the interface <strong>may</strong> necessitate
adjusting standard Web browsing configuration
parameters -- such as specifying a proxy IP address and
port on a desktop browser, or activating a WAP setting on
a mobile browser.
</p>
<p>Such access <strong id="ta-1181">must</strong> be granted under fair, reasonable and non-discriminatory conditions. In
particular:
</p>
<ul>
<li>
<p>it is available to all, worldwide, whether or not they are W3C Members;</p>
</li>
<li>
<p>it does not impose any further conditions or restrictions on the use of any
technology, intellectual property rights, or other restrictions on behaviour of the
tester, but may include reasonable, customary terms relating to operation or
maintenance of the relationship between tester and proxy operator such as the
following: choice of law and dispute resolution, confidentiality of parameters to
access the interface, disclaimer of liability.
</p>
</li>
</ul>
</div>
</div>
<div class="back">
<div class="div1">
<h2><a name="sec-references" id="sec-references"></a>A References</h2>
<dl>
<dt class="label"><a name="ref-CT-Landscape" id="ref-CT-Landscape"></a>CT Landscape
</dt>
<dd>Content
Transformation Landscape 1.0, Jo Rabin, Andrew Swainston (eds), W3C Working
Group Note 27 October 2009 (See <a href="http://www.w3.org/TR/2009/NOTE-ct-landscape-20091027/">http://www.w3.org/TR/2009/NOTE-ct-landscape-20091027/</a>)
</dd>
<dt class="label"><a name="ref-rfc-2119" id="ref-rfc-2119"></a>RFC 2119
</dt>
<dd>Key words for use in RFCs to Indicate
Requirement Levels, , Request for Comments: 2119, S. Bradner, March 1997 (See <a href="http://www.ietf.org/rfc/rfc2119.txt">http://www.ietf.org/rfc/rfc2119.txt</a>)
</dd>
<dt class="label"><a name="ref-HTTP" id="ref-HTTP"></a>RFC 2616 HTTP
</dt>
<dd> Hypertext Transfer Protocol --
HTTP/1.1 Request for Comments: 2616, R. Fielding, J. Gettys, J. Mogul, H.
Frystyk, L. Masinter, P. Leach, T. Berners-Lee, June 1999 (See <a href="http://tools.ietf.org/html/rfc2616">http://tools.ietf.org/html/rfc2616</a>)
</dd>
<dt class="label"><a name="ref-rfc-3986" id="ref-rfc-3986"></a>RFC 3986
</dt>
<dd>Uniform Resource Identifier (URI):
Generic Syntax, Request for Comments: 3986, T. Berners-Lee, R. Fielding, L.
Masinter, January 2005 (See <a href="http://tools.ietf.org/html/rfc3986">http://tools.ietf.org/html/rfc3986</a>)
</dd>
<dt class="label"><a name="ref-OPES" id="ref-OPES"></a>RFC 3238 OPES
</dt>
<dd>
IAB Architectural and Policy Considerations for Open Pluggable Edge Services, Request for Comments: 3238,
S. Floyd, L. Daigle, January 2002 (See <a href="http://tools.ietf.org/html/rfc3238">http://tools.ietf.org/html/rfc3238</a>)
</dd>
<dt class="label"><a name="ref-DIGLOSS" id="ref-DIGLOSS"></a>Device Independence Glossary
</dt>
<dd>W3C Glossary of Terms for Device Independence, Rhys Lewis
(ed), W3C Working Draft 18 January 2005
</dd>
<dt class="label"><a name="ref-BestPractices" id="ref-BestPractices"></a>Best Practices
</dt>
<dd>Mobile Web Best
Practices 1.0 Basic Guidelines, Jo Rabin, Charles McCathieNevile (eds), W3C
Recommendation, 29 July 2008 (See <a href="http://www.w3.org/TR/2008/REC-mobile-bp-20080729/">http://www.w3.org/TR/2008/REC-mobile-bp-20080729/</a>)
</dd>
<dt class="label"><a name="ref-mobileOK" id="ref-mobileOK"></a>mobileOK Basic Tests
</dt>
<dd>W3C mobileOK
Basic Tests 1.0, Sean Owen, Jo Rabin (eds), W3C Recommendation, 08 December 2008 (See <a href="http://www.w3.org/TR/2008/REC-mobileOK-basic10-tests-20081208/"
>http://www.w3.org/TR/2008/REC-mobileOK-basic10-tests-20081208/</a>)
</dd>
<dt class="label"><a name="ref-mobileOK-scheme" id="ref-mobileOK-scheme"></a>mobileOK Scheme
</dt>
<dd>W3C mobileOK
Scheme 1.0, Jo Rabin, Phil Archer (eds), W3C Note, 25 August 2009 (See <a href="http://www.w3.org/TR/2009/NOTE-mobileOK-20090825/">http://www.w3.org/TR/2009/NOTE-mobileOK-20090825/</a>)
</dd>
<dt class="label"><a name="ref-powder-grouping" id="ref-powder-grouping"></a>POWDER Resource Grouping
</dt>
<dd>Protocol for Web Description Resources (POWDER): Grouping of Resources, Phil Archer, Andrea Perego, Kevin Smith (eds), W3C
Recommendation, 1 September 2009 (See <a href="http://www.w3.org/TR/2009/REC-powder-grouping-20090901/">http://www.w3.org/TR/2009/REC-powder-grouping-20090901/</a>)
</dd>
<dt class="label"><a name="ref-XHR" id="ref-XHR"></a>XHR
</dt>
<dd>XMLHttpRequest, Anne van
Kesteren (ed), W3C Candidate Recommendation 3 August 2010 (See <a href="http://www.w3.org/TR/2010/CR-XMLHttpRequest-20100803/">http://www.w3.org/TR/2010/CR-XMLHttpRequest-20100803/</a>)
</dd>
<dt class="label"><a name="ref-XML" id="ref-XML"></a>XML
</dt>
<dd>Extensible Markup Language (XML) 1.0 (Fifth Edition), T. Bray, J. Paoli, C. Sperberg-McQueen, E. Maler, F. Yergeau (eds),
W3C Recommendation, 26 November 2008. (See <a href="http://www.w3.org/TR/2008/REC-xml-20081126/">http://www.w3.org/TR/2008/REC-xml-20081126/</a>)
</dd>
</dl>
</div>
<div class="div1">
<h2><a name="sec-ConformanceStatement" id="sec-ConformanceStatement"></a>B Conformance Statement</h2>
<p>See <a href="http://www.w3.org/TR/2010/NOTE-ct-guidelines-20101026/ics">http://www.w3.org/TR/2010/NOTE-ct-guidelines-20101026/ics</a>
</p>
</div>
<div class="div1">
<h2><a name="sec-Mobile-Content-Types" id="sec-Mobile-Content-Types"></a>C Internet Content Types associated with Mobile Content</h2>
<p>This list is not exhaustive and is likely to change.</p>
<div class="exampleInner"><pre>application/vnd.wap.xhtml+xml</pre></div>
<div class="exampleInner"><pre>text/vnd.wap.wml</pre></div>
<div class="exampleInner"><pre>application/vnd.wap.wmlc</pre></div>
<div class="exampleInner"><pre>text/vnd.wap.wml+xml</pre></div>
<div class="exampleInner"><pre>text/vnd.wap.wmlscript</pre></div>
<div class="exampleInner"><pre>application/vnd.wap.wmlscriptc</pre></div>
<div class="exampleInner"><pre>image/vnd.wap.wbmp</pre></div>
<div class="exampleInner"><pre>application/vnd.wap.wbxml</pre></div>
<div class="exampleInner"><pre>application/vnd.wap.multipart.mixed</pre></div>
<div class="exampleInner"><pre>application/vnd.wap.multipart.related</pre></div>
<div class="exampleInner"><pre>application/vnd.wap.multipart.alternative</pre></div>
<div class="exampleInner"><pre>application/vnd.wap.multipart.form-data</pre></div>
<div class="exampleInner"><pre>image/x-up-wpng</pre></div>
<div class="exampleInner"><pre>image/x-up-bmp</pre></div>
</div>
<div class="div1">
<h2><a name="sec-Data-Content-Types" id="sec-Data-Content-Types"></a>D Internet Content Types associated with Data Content</h2>
<p>This list is not exhaustive and is likely to change.</p>
<div class="exampleInner"><pre>application/json</pre></div>
<div class="exampleInner"><pre>application/soap+xml</pre></div>
<div class="exampleInner"><pre>application/soap+fastinfoset</pre></div>
<div class="exampleInner"><pre>application/fastsoap</pre></div>
<div class="exampleInner"><pre>application/fastinfoset</pre></div>
</div>
<div class="div1">
<h2><a name="sec-Mobile-DOCTYPES" id="sec-Mobile-DOCTYPES"></a>E DOCTYPEs Associated with Mobile Content</h2>
<p>This list is not exhaustive and is likely to change.</p>
<div class="exampleInner"><pre>-//OMA//DTD XHTML Mobile 1.2//EN</pre></div>
<div class="exampleInner"><pre>-//WAPFORUM//DTD XHTML Mobile 1.1//EN </pre></div>
<div class="exampleInner"><pre>-//WAPFORUM//DTD XHTML Mobile 1.0//EN</pre></div>
<div class="exampleInner"><pre>-//W3C//DTD XHTML Basic 1.1//EN</pre></div>
<div class="exampleInner"><pre>-//W3C//DTD XHTML Basic 1.0//EN</pre></div>
<div class="exampleInner"><pre>-//OPENWAVE//DTD XHTML 1.0//EN</pre></div>
<div class="exampleInner"><pre>-//OPENWAVE//DTD XHTML Mobile 1.0//EN</pre></div>
<div class="exampleInner"><pre>-//i-mode group (ja)//DTD XHTML i-XHTML (Locale/Ver.=ja/1.0) 1.0//EN</pre></div>
<div class="exampleInner"><pre>-//i-mode group (ja)//DTD XHTML i-XHTML (Locale/Ver.=ja/1.1) 1.0//EN</pre></div>
<div class="exampleInner"><pre>-//i-mode group (ja)//DTD XHTML i-XHTML (Locale/Ver.=ja/2.0) 1.0//EN</pre></div>
<div class="exampleInner"><pre>-//i-mode group (ja)//DTD XHTML i-XHTML (Locale/Ver.=ja/2.1) 1.0//EN</pre></div>
<div class="exampleInner"><pre>-//i-mode group (ja)//DTD XHTML i-XHTML (Locale/Ver.=ja/2.2) 1.0//EN</pre></div>
<div class="exampleInner"><pre>-//i-mode group (ja)//DTD XHTML i-XHTML (Locale/Ver.=ja/2.3) 1.0//EN</pre></div>
<div class="exampleInner"><pre>-//W3C//DTD Compact HTML 1.0 Draft//EN</pre></div>
<div class="exampleInner"><pre>-//BBSW//DTD Compact HTML 2.0//EN</pre></div>
<div class="exampleInner"><pre>-//WAPFORUM//DTD WML 1.0//EN</pre></div>
<div class="exampleInner"><pre>-//WAPFORUM//DTD WML 1.1//EN</pre></div>
<div class="exampleInner"><pre>-//WAPFORUM//DTD WML 1.2//EN</pre></div>
<div class="exampleInner"><pre>-//WAPFORUM//DTD WML 1.3//EN</pre></div>
<div class="exampleInner"><pre>-//WAPFORUM//DTD WML 2.0//EN</pre></div>
<div class="exampleInner"><pre>-//PHONE.COM//DTD WML 1.1//EN</pre></div>
<div class="exampleInner"><pre>-//OPENWAVE.COM//DTD WML 1.3//EN</pre></div>
</div>
<div class="div1">
<h2><a name="sec-Mobile-URI-Patterns" id="sec-Mobile-URI-Patterns"></a>F URI Patterns Associated with Mobile Web Sites</h2>
<p>Using the notation defined in <a href="#ref-powder-grouping">[POWDER Resource Grouping]</a>:
</p>
<div class="exampleInner"><pre><iriset>
<includehosts>mobi</includehosts>
</iriset></pre></div>
</div>
<div class="div1">
<h2><a name="sec-Summary-User-Preference-Handling" id="sec-Summary-User-Preference-Handling"></a>G Summary of User Preference Handling</h2>
<p>User expression of preferences is referred to in several sections in this document. Those sections are:</p>
<ol class="enumar">
<li>
<p><a href="#sec-priority-of-intention"><span class="specref">1.4.2 Priority of Intention</span></a></p>
</li>
<li>
<p><a href="#sec-serving-cached-responses"><span class="specref">4.1.4 Serving Cached Responses</span></a></p>
</li>
<li>
<p><a href="#sec-user-selection"><span class="specref">4.1.5.3 User Selection of Restructured Experience</span></a></p>
</li>
<li>
<p><a href="#sec-administrative-arrangements"><span class="specref">4.2.1 User Preferences</span></a></p>
</li>
<li>
<p><a href="#sec-receipt-of-cache-control-no-transform"><span class="specref">4.2.2 Receipt of Cache-Control: no-transform</span></a></p>
</li>
<li>
<p><a href="#sec-proxy-decision-to-transform"><span class="specref">4.2.8 Proxy Decision to Transform</span></a></p>
</li>
<li>
<p><a href="#sec-alteration-of-response"><span class="specref">4.2.8.1 Alteration of Response</span></a></p>
</li>
<li>
<p><a href="#sec-https-link-rewriting"><span class="specref">4.2.8.3 HTTPS Link Rewriting</span></a></p>
</li>
</ol>
<p>User preferences are also referred to non-normatively under <a href="#sec-varying-representations"><span class="specref">I.1.4 Varying Representations</span></a>.
</p>
</div>
<div class="div1">
<h2><a name="sec-example-transformation-interactions" id="sec-example-transformation-interactions"></a>H Example Transformation Interactions (Non-Normative)</h2>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p>The following examples refer to requests with the GET method.</p>
</div>
<div class="div2">
<h3><a name="sec-basic-content-tasting" id="sec-basic-content-tasting"></a>H.1 Basic Content Tasting by Proxy
</h3>
<div class="exampleOuter">
<p class="flow1">Request resource with original header fields</p>
<p class="flow1">If the response is a 406 response:</p>
<p class="flow2">If the response contains <code>Cache-Control:
no-transform</code>, forward it
</p>
<p class="flow2">Otherwise request again with altered header fields</p>
<p class="flow1">If the response is a 200 response:</p>
<p class="flow2">If the response contains <code>Vary: User-Agent</code>, an
appropriate <code>link</code> element or header field, or <code>Cache-Control:
no-transform</code>, forward it
</p>
<p class="flow2">Otherwise assess whether the 200 response is a form of "Request
Unacceptable"
</p>
<p class="flow3">If it is not, forward it</p>
<p class="flow3">If it is, request again with altered header fields</p>
</div>
</div>
<div class="div2">
<h3><a name="sec-proxy-a-priori-knowledge" id="sec-proxy-a-priori-knowledge"
></a>H.2 Optimization based on Previous Server Interaction
</h3>
<div class="exampleOuter">
<p class="flow1">Proxy receives a request for resource P that it has not
encountered before
</p>
<p class="flow1">Proxy forwards this request</p>
<p class="flow1">Response is 200 OK containing the text "Unsupported browser.
Please get a different one or use a CT proxy."
</p>
<p class="flow1">Proxy determines that this equates to a 406 Status and
requests the resource from the origin server again with altered header fields
(emulating a well known desktop browser)
</p>
<p class="flow1">Response is a desktop oriented representation of the resource</p>
<p class="flow1">Proxy transforms this response into content that the user agent
can display well and forwards it
</p>
<p class="flow1">Proxy receives a further request for the resource P</p>
<p class="flow1">Based on evidence from the previous interaction (e.g. that there
was no <code>Vary</code> header field, that the response was not targeted at only
the previous user in that there was no <code>Cache-Control: private</code>
directive) the CT proxy forwards the request with altered header fields
</p>
<p class="flow1">Response is a desktop oriented representation of the resource</p>
<p class="flow1">Proxy transforms this response into content that the user agent
can display well and forwards it
</p>
</div>
</div>
<div class="div2">
<h3><a name="sec-optimization-previous-interaction" id="sec-optimization-previous-interaction"></a>H.3 Optimization based on Previous Server Interaction, Server has Changed its
Operation
</h3>
<div class="exampleOuter">
<p class="flow1">Proxy receives a request for resource P, that it has previously
encountered as in <a href="#sec-proxy-a-priori-knowledge"><span class="specref">H.2 Optimization based on Previous Server Interaction</span></a></p>
<p class="flow1">Proxy forwards request with altered header fields</p>
<p class="flow1">Response is 200 OK containing a <code>Vary: User-Agent</code>
header field
</p>
<p class="flow1">Proxy notices that behavior has changed and reissues the request
with original header fields
</p>
<p class="flow1">Response is 200 OK and proxy forwards it</p>
</div>
</div>
<div class="div2">
<h3><a name="sec-representation-intended" id="sec-representation-intended"></a>H.4 Server Response Indicating that this Representation is Intended for the Target
Device
</h3>
<div class="exampleOuter">
<p class="flow1">Proxy receives a request for resource P</p>
<p class="flow1">Proxy forwards request with original header fields</p>
<p class="flow1">Response is 200 OK with <code>Vary: User-Agent</code> and
<code><link type="alternate" media="handheld" href="P#id"
/></code> where id is a document local reference
</p>
<p class="flow1">Proxy forwards response as designed specifically for the
requesting device
</p>
</div>
</div>
<div class="div2">
<h3><a name="sec-another-representation" id="sec-another-representation"></a>H.5 Server Response Indicating that another Representation is Intended for the Target Device</h3>
<div class="exampleOuter">
<p class="flow1">Proxy receives a request for resource P</p>
<p class="flow1">Proxy forwards request with original header fields</p>
<p class="flow1">Response is 200 OK with <code><link type="alternate"
media="handheld" href="Q" /></code> and Q is not P
</p>
<p class="flow1">Proxy requests Q with original header fields</p>
<p class="flow1">Response is 200 OK and proxy forwards it</p>
</div>
</div>
</div>
<div class="div1">
<h2><a name="sec-guidance-origin-servers" id="sec-guidance-origin-servers"></a>I Informative Guidance for Origin Servers (Non-Normative)</h2>
<p>Content providers may wish to follow these procedures in order to improve interoperability.</p>
<div class="div2">
<h3><a name="sec-ServerResponse" id="sec-ServerResponse"></a>I.1 Server Response to Proxy
</h3>
<div class="div3">
<h4><a name="sec-server-use-of-406" id="sec-server-use-of-406"></a>I.1.1 Use of HTTP 406 Status
</h4>
<p>Servers should consider using an HTTP 406 Status (and not an
HTTP 200 Status) if a request cannot be satisfied with content that meets
the criteria specified by values of the HTTP request header fields. However, some browsers do not display the content of HTTP
406 Status responses.
</p>
</div>
<div class="div3">
<h4><a name="sec-server-use-of-403" id="sec-server-use-of-403"></a>I.1.2 Use of HTTP 403 Status
</h4>
<p>Servers should consider using an HTTP 403 Status if concerned that the security of a link assumed to be private has been compromised
(for example this may be inferred by the presence of a <code>Via</code> HTTP header field in an HTTPS request).
</p>
</div>
<div class="div3">
<h4><a name="sec-cache-control-no-transform" id="sec-cache-control-no-transform"
></a>I.1.3 Server Origination of <code>Cache-Control: no-transform</code></h4>
<p>Servers should consider including a <code>Cache-Control:
no-transform</code> directive if one is received in the HTTP request, as it may be an indication that the client does not wish to receive a transformed
response.
</p>
<p>Include a <code>Cache-Control:
no-transform</code> directive if, for any reason,
transformation of the response is prohibited.
</p>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p id="wml-no-transform-note">Including a <code>Cache-Control:
no-transform</code> directive can disrupt the behavior of WAP Gateways,
because it can inhibit such proxies from converting WML to
WMLC.
</p>
<p>Including such a directive may also disrupt the behavior of a proxy based accessibility solution.</p>
</div>
</div>
<div class="div3">
<h4><a name="sec-varying-representations" id="sec-varying-representations"
></a>I.1.4 Varying Representations
</h4>
<p>It is good practice to take account of user agent capabilities and
formulate an appropriate experience according to those capabilities. It is good practice to provide a means for users to
select among
available representations, to default to the last
selected representation and to provide a means of
changing the selection.
</p>
<div class="div4">
<h5><a name="sec-use-of-vary-header" id="sec-use-of-vary-header"></a>I.1.4.1 Use of <code>Vary</code> HTTP Header Field
</h5>
<p>If a server varies its representation according to examination of
received HTTP header fields then <a href="#ref-HTTP">[RFC 2616 HTTP]</a> describes how to use the <code>Vary</code> header field to indicate this.
</p>
<p>Servers that are aware of the presence of a transforming proxy, as identified by a
<code>Via</code> HTTP Header field might alter their responses according to their knowledge of specific proxy behavior. When doing so it is
good practice to make sure that the
Internet content type for a response is correct for the actual content (e.g. a server should
not choose <code>Content-Type: application/vnd.wap.xhtml+xml</code>
because it suspects that proxies will not transform
content of this type, if its content is not valid XHTML-MP).
</p>
</div>
<div class="div4">
<h5><a name="sec-use-of-link-element" id="sec-use-of-link-element"></a>I.1.4.2 Indication of Intended Presentation Media Type of Representation
</h5>
<p>If a server has distinct representations that vary according to the
target presentation media type, it can inhibit
transformation of the response by including a <code>Cache-Control:
no-transform</code> directive (see <a href="#sec-cache-control-no-transform"><span class="specref">I.1.3 Server Origination of Cache-Control: no-transform</span></a>).
</p>
<p>In addition, in HTML content it can indicate the medium for
which the representation is intended by including a <code>link</code>
element identifying in its <code>media</code> attribute the target
presentation media types of this representation and setting the
<code>href</code> attribute to "Same-Document Reference" (see <a href="#ref-rfc-3986">[RFC 3986]</a> <a href="http://tools.ietf.org/html/rfc3986.html#section-4.4">section 4.4</a>) and in particular an empty <code>href</code> attribute is a "Same Document Reference".
</p>
<p>In addition it is good practice to include <code>link</code>
elements identifying the target presentation media types of other
available representations in a similar manner.
</p>
<p>If content for more than one presentation media type is served from the same URI, it is better not to use a link element identifying
the presentation media types as the URI will appear to be a "same document reference", indicating to a client that this representation
is suitable for all the named presentation media types. Instead, use a <code>Vary</code> HTTP header field indicating that the response varies according to the received <code>User-Agent</code> HTTP header field.
</p>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p>Some examples of the use of the <code>link</code> element are
included above in <a href="#sec-example-transformation-interactions"><span class="specref">H Example Transformation Interactions</span></a>.
</p>
</div>
</div>
</div>
</div>
</div>
<div class="div1">
<h2><a name="sec-applicability" id="sec-applicability"></a>J Applicability to Transforming Solutions which are Out of Scope (Non-Normative)</h2>
<p>There are a number of well-known examples of solutions that seem to their users as
though they are using a browser, but because the client software communicates
using proprietary protocols and techniques, it is the combination of the client and
the network component that is regarded as the HTTP User Agent. The communication
between the client and the network component is therefore out of scope of this
document.
</p>
<p>Additionally, where some kind of administrative arrangement exists between a
transforming proxy and an origin server for the purposes of transforming content on
the origin server's behalf, this is also out of scope of this document.
</p>
<p>In both of the above cases, it is good practice to adhere to the provisions of this document in
respect of providing information about the device and the original IP address.
</p>
</div>
<div class="div1">
<h2><a name="sec-scope-for-future-work" id="sec-scope-for-future-work"></a>K Scope for Future Work (Non-Normative)</h2>
<div class="div2">
<h3><a name="sec-powder" id="sec-powder"></a>K.1 POWDER
</h3>
<p>The BPWG believes that <a href="http://www.w3.org/2007/powder/">POWDER</a>
will represent a powerful mechanism by which
a server may express transformation preferences. Future work in this area may
recommend the use of POWDER to provide a mechanism for origin servers to
indicate more precisely which alternatives they have and what transformation
they are willing to allow on them, and in addition to provide for Content
Transformation proxies to indicate which services they are able to perform.
</p>
</div>
<div class="div2">
<h3><a name="sec-link-http-header" id="sec-link-http-header"></a>K.2 <code>link</code> HTTP Header Field
</h3>
<p>The BPWG believes that the <code>link</code> HTTP header field which was removed from
HTTP/1.1, and which is under discussion for reintroduction, would
represent a more general and flexible mechanism than use of the HTML
<code>link</code> element, as discussed in this recommendation.
</p>
</div>
<div class="div2">
<h3><a name="sec-sources-devinfo" id="sec-sources-devinfo"></a>K.3 Sources of Device Information
</h3>
<p>The process of adapting content at the origin server, or transforming it in a
proxy is likely to have a dependency on a repository of device descriptions. An
origin server's willingness to allow a transforming proxy to transform content
may depend on its evaluation of the trustworthiness of device description data
that is being used. There is scope for enhancement of the trust relationship by
some means of indicating this.
</p>
</div>
<div class="div2">
<h3><a name="sec-inter-proxy-comm" id="sec-inter-proxy-comm"></a>K.4 Inter Proxy Communication
</h3>
<p>There is scope for further work to define how multiple proxies may interoperate.
A common case of multiple proxies is where a network provider transforming proxy
and a search engine transforming proxy are both present.
</p>
</div>
<div class="div2">
<h3><a name="sec-explicit-consent" id="sec-explicit-consent"></a>K.5 Explicit Consent
</h3>
<p>Robust mechanisms are needed for indicating consent to or prohibition of transformation operations of various kinds, especially
HTTPS link rewriting (see <a href="#sec-https-link-rewriting"><span class="specref">4.2.8.3 HTTPS Link Rewriting</span></a>).
</p>
</div>
<div class="div2">
<h3><a name="sec-amendment-http" id="sec-amendment-http"></a>K.6 Amendment to and Refinement of HTTP
</h3>
<p>The BPWG believes that amendments to HTTP are needed to improve the interoperability of transforming proxies. For example,
HTTP does not provide a way to
distinguish between prohibition of any kind of transformation and the
prohibition only of restructuring (and not recoding or compression).
</p>
<p>At present HTTP does not provide a mechanism for communicating original header field
values. The scheme based on X-Device
prefixed fields described under <a href="#sec-altering-header-values"><span class="specref">4.1.5 Alteration of HTTP Header Field Values</span></a> records
and clarifies an approach used to achieve this effect by some content
transformation proxies. This scheme relies upon non-standard HTTP header fields which have been provisionally registered with
IANA. While the mechanism defined in that section, based on
current practice, applies to conforming transformation proxy deployments, it is possible that in future, in collaboration
with the IETF, this
approach will be reconsidered. This implies that the specified X-Device
prefixed fields may, at some time, become deprecated in favor of new
equivalent fields, or that an entirely different approach will be taken
to representing such values.
</p>
<p>A number of mechanisms exist in HTTP which might be exploited given more precise
definition of their operation - for example the <code>OPTIONS</code> method and
the HTTP 300 (Multiple Choices) Status.
</p>
</div>
</div>
<div class="div1">
<h2><a name="sec-acknowledgements" id="sec-acknowledgements"></a>L Acknowledgments (Non-Normative)</h2>
<p>The editor acknowledges contributions of various kinds from members of the <a href="http://www.w3.org/2005/MWI/BPWG/">Mobile Web Best Practices Working Group</a> and earlier from the
<a href="http://www.w3.org/2005/MWI/BPWG/Group/TaskForces/CT/">Content Transformation Task Force</a> of that group.
</p>
<p>The editor acknowledges significant written contributions from:</p>
<ul>
<li>François Daoust (Task Force Leader), W3C</li>
<li>Magnus Lönnroth, Ericsson (and previously at Drutt)</li>
<li>Bryan Sullivan, AT&T</li>
<li>Sean Patterson, Novarra</li>
<li>Aaron Kemp, Google</li>
<li>Rob Finean, Openwave</li>
<li>Heiko Gerlach, Vodafone</li>
<li>Martin Jones, Volantis</li>
<li>Tom Hume, W3C Invited Expert</li>
<li>Eduardo Casais, W3C Invited Expert</li>
</ul>
</div>
</div>
</body>
</html>