Changeset 6591


Ignore:
Timestamp:
Aug 19, 2008, 11:11:35 PM (13 years ago)
Author:
charles
Message:

(libT) do proper JSON escaping

Location:
trunk/libtransmission
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/bencode-test.c

    r6490 r6591  
    1616            fprintf( stderr, "PASS test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \
    1717    } else { \
    18         if( VERBOSE ) \
    19             fprintf( stderr, "FAIL test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \
     18        fprintf( stderr, "FAIL test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \
    2019        return test; \
    2120    } \
  • trunk/libtransmission/bencode.c

    r6584 r6591  
    1919
    2020#include <event.h> /* evbuffer */
     21
     22#include "ConvertUTF.h"
    2123
    2224#include "transmission.h"
     
    11531155{
    11541156    struct jsonWalk * data = vdata;
    1155     const char *it, *end;
     1157    const unsigned char *it, *end;
    11561158    evbuffer_add_printf( data->out, "\"" );
    1157     for( it=val->val.s.s, end=it+val->val.s.i; it!=end; ++it )
     1159    for( it=(const unsigned char*)val->val.s.s, end=it+val->val.s.i; it!=end; ++it )
    11581160    {
    11591161        switch( *it ) {
     
    11661168            case '"' : evbuffer_add_printf( data->out, "\\\"" ); break;
    11671169            case '\\': evbuffer_add_printf( data->out, "\\\\" ); break;
    1168             default:   evbuffer_add_printf( data->out, "%c", *it );
     1170            default:
     1171                if( isascii( *it ) ) {
     1172                    /*fprintf( stderr, "[%c]\n", *it );*/
     1173                    evbuffer_add_printf( data->out, "%c", *it );
     1174                } else {
     1175                    const UTF8 * tmp = it;
     1176                    UTF32 buf = 0;
     1177                    UTF32 * u32 = &buf;
     1178                    ConvertUTF8toUTF32( &tmp, end, &u32, &buf+1, 0 );
     1179                    evbuffer_add_printf( data->out, "\\u%04x", buf );
     1180                    it = tmp - 1;
     1181                    /*fprintf( stderr, "[\\u%04x]\n", buf );*/
     1182                }
    11691183        }
    11701184    }
  • trunk/libtransmission/json-test.c

    r6584 r6591  
    2020}
    2121
     22#include "ConvertUTF.h"
     23
    2224static int
    2325test_utf8( void )
     
    2628    tr_benc top;
    2729    const char * str;
    28     const int err = tr_jsonParse( in, strlen(in), &top, NULL );
     30    char * json;
     31    int json_len;
     32    int err;
    2933
     34    err = tr_jsonParse( in, strlen(in), &top, NULL );
    3035    check( !err );
    3136    check( tr_bencIsDict( &top ) );
    3237    check( tr_bencDictFindStr( &top, "key", &str ) );
    3338    check( !strcmp( str, "Letöltések" ) );
    34 
    3539    if( !err )
    3640        tr_bencFree( &top );
     41
     42    in = "{ \"key\": \"\\u005C\" }";
     43    err = tr_jsonParse( in, strlen( in ), &top, NULL );
     44    check( !err );
     45    check( tr_bencIsDict( &top ) );
     46    check( tr_bencDictFindStr( &top, "key", &str ) );
     47    check( !strcmp( str, "\\" ) );
     48    if( !err )
     49        tr_bencFree( &top );
     50
     51    /**
     52     * 1. Feed it JSON-escaped nonascii to the JSON decoder.
     53     * 2. Confirm that the result is UTF-8.
     54     * 3. Feed the same UTF-8 back into the JSON encoder.
     55     * 4. Confirm that the result is JSON-escaped.
     56     * 5. Dogfood that result back into the parser.
     57     * 6. Confirm that the result is UTF-8.
     58     */
     59    in = "{ \"key\": \"Let\\u00f6lt\\u00e9sek\" }";
     60    err = tr_jsonParse( in, strlen(in), &top, NULL );
     61    check( !err );
     62    check( tr_bencIsDict( &top ) );
     63    check( tr_bencDictFindStr( &top, "key", &str ) );
     64    check( !strcmp( str, "Letöltések" ) );
     65    json = tr_bencSaveAsJSON( &top, &json_len );
     66    if( !err )
     67        tr_bencFree( &top );
     68    check( json );
     69    check( strstr( json, "\\u00f6" ) != NULL );
     70    check( strstr( json, "\\u00e9" ) != NULL );
     71    err = tr_jsonParse( json, json_len, &top, NULL );
     72    check( !err );
     73    check( tr_bencIsDict( &top ) );
     74    check( tr_bencDictFindStr( &top, "key", &str ) );
     75    check( !strcmp( str, "Letöltések" ) );
     76    if( !err )
     77        tr_bencFree( &top );
     78    tr_free( json );
    3779
    3880    return 0;
     
    93135        return i;
    94136
    95     if(( i = test_utf8( )))
    96         return i;
    97 
    98137    if(( i = test1( )))
    99138        return i;
Note: See TracChangeset for help on using the changeset viewer.