Changeset 775047f


Ignore:
Timestamp:
Apr 24, 2014 1:25:50 AM (7 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
0d4f597
Parents:
1e4b433
Message:
  • SusiMail?:
    • Fix HeaderLine? decoder going past the headers, which was causing corruption in forwarded mails
    • More efficient output buffer allocation in HeaderLine? decoder
File:
1 edited

Legend:

Unmodified
Added
Removed
  • apps/susimail/src/src/i2p/susi/webmail/encoding/HeaderLine.java

    r1e4b433 r775047f  
    2929
    3030import java.io.ByteArrayInputStream;
     31import java.io.ByteArrayOutputStream;
    3132import java.io.IOException;
    3233import java.io.InputStream;
     
    151152                return out.toString();
    152153        }
     154
    153155        /* (non-Javadoc)
    154156         * @see i2p.susi.webmail.encoding.Encoding#decode(java.lang.String)
     
    157159                return decode( in, 0, in.length );
    158160        }
     161
    159162        /* (non-Javadoc)
    160163         * @see i2p.susi.webmail.encoding.Encoding#decode(java.lang.String)
    161164         */
    162165        public ReadBuffer decode( byte in[], int offset, int length ) throws DecodingException {
    163                 byte[] out = new byte[length];
     166                ByteArrayOutputStream out = new ByteArrayOutputStream(4096);
    164167                int written = 0;
    165168                int end = offset + length;
     
    213216                                                                                                        for( int j = 0; j < tmp.length; j++ ) {
    214217                                                                                                                byte d = tmp.content[ tmp.offset + j ];
    215                                                                                                                 out[written++] = ( d == '_' ? 32 : d );
     218                                                                                                                out.write( d == '_' ? 32 : d );
    216219                                                                                                        }
    217220                                                                                                } else {
     
    222225                                                                                                        for( int j = 0; j < utf8.length; j++ ) {
    223226                                                                                                                byte d = utf8[j];
    224                                                                                                                 out[written++] = ( d == '_' ? 32 : d );
     227                                                                                                                out.write( d == '_' ? 32 : d );
    225228                                                                                                        }
    226229                                                                                                }
     
    247250                                         */
    248251                                        linebreak = true;
     252                                        // The ReadBuffer can contain the body too.
     253                                        // If we just had a linebreak, we are done...
     254                                        // don't keep parsing!
     255                                        if( length > 2 && in[offset+1] == '\r' && in[offset+2] == '\n')
     256                                                break;
    249257                                        length--;
    250258                                        offset++;
     
    259267                                         * long line
    260268                                         */
    261                                         out[written++] = '\r';
    262                                         out[written++] = '\n';
     269                                        out.write('\r');
     270                                        out.write('\n');
    263271                                        lastSkip = 0;
    264272                                }
    265273                                else {
    266274                                        if( !lastCharWasQuoted )
    267                                                 out[written++] = ' ';
     275                                                out.write(' ');
    268276                                        /*
    269277                                         * skip whitespace
     
    287295                         * print out everything else literally
    288296                         */
    289                         out[written++] = c;
     297                        out.write(c);
    290298                        lastCharWasQuoted = false;
    291299                }
    292300                if( linebreak ) {
    293                         out[written++] = '\r';
    294                         out[written++] = '\n';
    295                         lastSkip = 0;
     301                        out.write('\r');
     302                        out.write('\n');
    296303                }
    297304                       
    298                 return new ReadBuffer(out, 0, written);
     305                return new ReadBuffer(out.toByteArray(), 0, out.size());
    299306        }
    300307
Note: See TracChangeset for help on using the changeset viewer.