martin 99/12/01 12:45:47
Modified: src CHANGES src/main http_protocol.c Log: EBCDIC: Fix Byte Ranges for EBCDIC platforms. The necessary switch between implied conversion for protocol parts and configured conversion for document data was missing. The effect of this was that PDF files could not be read by Acrobat Reader (which sends long lists of byte ranges in each request) when the server was apache on ebcdic machines. Submitted by: Oliver Reh <[EMAIL PROTECTED]> Reviewed by: Martin Kraemer Revision Changes Path 1.1466 +9 -0 apache-1.3/src/CHANGES Index: CHANGES =================================================================== RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v retrieving revision 1.1465 retrieving revision 1.1466 diff -u -r1.1465 -r1.1466 --- CHANGES 1999/12/01 20:33:58 1.1465 +++ CHANGES 1999/12/01 20:45:29 1.1466 @@ -1,5 +1,14 @@ Changes with Apache 1.3.10 + *) EBCDIC: Fix Byte Ranges for EBCDIC platforms. The necessary switch + between implied conversion for protocol parts and configured + conversion for document data was missing. The effect of this was that + PDF files could not be read by Acrobat Reader (which sends long + lists of byte ranges in each request) when the server was apache + on ebcdic machines. + [Noted by Oliver Reh <[EMAIL PROTECTED]>, solved by + Martin Kraemer] + *) Add IndexOptions FoldersFirst to allow fancy-indexed directory listings to have the subdirectories always listed at the top. [Ken Coar] 1.281 +22 -1 apache-1.3/src/main/http_protocol.c Index: http_protocol.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/main/http_protocol.c,v retrieving revision 1.280 retrieving revision 1.281 diff -u -r1.280 -r1.281 --- http_protocol.c 1999/11/05 15:41:03 1.280 +++ http_protocol.c 1999/12/01 20:45:41 1.281 @@ -212,6 +212,14 @@ { long range_start, range_end; char *range; +#ifdef CHARSET_EBCDIC + /* determine current setting of conversion flag, + * set to ON (protocol strings MUST be converted) + * and reset to original setting before returning + */ + int convert = ap_bgetflag(r->connection->client, B_EBCDIC2ASCII); + ap_bsetflag(r->connection->client, B_EBCDIC2ASCII, 1); +#endif /*CHARSET_EBCDIC*/ if (!**r_range) { if (r->byterange > 1) { @@ -220,14 +228,23 @@ else *tlength += 4 + strlen(r->boundary) + 4; } +#ifdef CHARSET_EBCDIC + if (!convert) + ap_bsetflag(r->connection->client, B_EBCDIC2ASCII, convert); +#endif /*CHARSET_EBCDIC*/ return 0; } range = ap_getword(r->pool, r_range, ','); - if (!parse_byterange(range, r->clength, &range_start, &range_end)) + if (!parse_byterange(range, r->clength, &range_start, &range_end)) { +#ifdef CHARSET_EBCDIC + if (!convert) + ap_bsetflag(r->connection->client, B_EBCDIC2ASCII, convert); +#endif /*CHARSET_EBCDIC*/ /* Skip this one */ return internal_byterange(realreq, tlength, r, r_range, offset, length); + } if (r->byterange > 1) { const char *ct = r->content_type ? r->content_type : ap_default_type(r); @@ -251,6 +268,10 @@ else { *tlength += range_end - range_start + 1; } +#ifdef CHARSET_EBCDIC + if (!convert) + ap_bsetflag(r->connection->client, B_EBCDIC2ASCII, convert); +#endif /*CHARSET_EBCDIC*/ return 1; }