author | Michael Krelin <hacker@klever.net> | 2007-12-29 21:10:48 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2008-01-04 18:21:38 (UTC) |
commit | ff04188567b117c28d54d6f81a9dca40ff0b1730 (patch) (unidiff) | |
tree | 80fe40af5c38a35f7cdfec710a6eb937fd14be88 /lib | |
parent | e429f672f681953cd3f9390482090e8f03cf2b45 (diff) | |
download | libopkele-ff04188567b117c28d54d6f81a9dca40ff0b1730.zip libopkele-ff04188567b117c28d54d6f81a9dca40ff0b1730.tar.gz libopkele-ff04188567b117c28d54d6f81a9dca40ff0b1730.tar.bz2 |
adjust w3c_to_time output by timezone, so that it returns local time
Signed-off-by: Michael Krelin <hacker@klever.net>
-rw-r--r-- | lib/util.cc | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/lib/util.cc b/lib/util.cc index e5ca62d..ee75d29 100644 --- a/lib/util.cc +++ b/lib/util.cc | |||
@@ -69,112 +69,122 @@ namespace opkele { | |||
69 | } | 69 | } |
70 | } | 70 | } |
71 | 71 | ||
72 | /* | 72 | /* |
73 | * big numerics | 73 | * big numerics |
74 | */ | 74 | */ |
75 | 75 | ||
76 | BIGNUM *base64_to_bignum(const string& b64) { | 76 | BIGNUM *base64_to_bignum(const string& b64) { |
77 | vector<unsigned char> bin; | 77 | vector<unsigned char> bin; |
78 | decode_base64(b64,bin); | 78 | decode_base64(b64,bin); |
79 | BIGNUM *rv = BN_bin2bn(&(bin.front()),bin.size(),0); | 79 | BIGNUM *rv = BN_bin2bn(&(bin.front()),bin.size(),0); |
80 | if(!rv) | 80 | if(!rv) |
81 | throw failed_conversion(OPKELE_CP_ "failed to BN_bin2bn()"); | 81 | throw failed_conversion(OPKELE_CP_ "failed to BN_bin2bn()"); |
82 | return rv; | 82 | return rv; |
83 | } | 83 | } |
84 | 84 | ||
85 | BIGNUM *dec_to_bignum(const string& dec) { | 85 | BIGNUM *dec_to_bignum(const string& dec) { |
86 | BIGNUM *rv = 0; | 86 | BIGNUM *rv = 0; |
87 | if(!BN_dec2bn(&rv,dec.c_str())) | 87 | if(!BN_dec2bn(&rv,dec.c_str())) |
88 | throw failed_conversion(OPKELE_CP_ "failed to BN_dec2bn()"); | 88 | throw failed_conversion(OPKELE_CP_ "failed to BN_dec2bn()"); |
89 | return rv; | 89 | return rv; |
90 | } | 90 | } |
91 | 91 | ||
92 | string bignum_to_base64(const BIGNUM *bn) { | 92 | string bignum_to_base64(const BIGNUM *bn) { |
93 | vector<unsigned char> bin(BN_num_bytes(bn)+1); | 93 | vector<unsigned char> bin(BN_num_bytes(bn)+1); |
94 | unsigned char *binptr = &(bin.front())+1; | 94 | unsigned char *binptr = &(bin.front())+1; |
95 | int l = BN_bn2bin(bn,binptr); | 95 | int l = BN_bn2bin(bn,binptr); |
96 | if(l && (*binptr)&0x80){ | 96 | if(l && (*binptr)&0x80){ |
97 | (*(--binptr)) = 0; ++l; | 97 | (*(--binptr)) = 0; ++l; |
98 | } | 98 | } |
99 | return encode_base64(binptr,l); | 99 | return encode_base64(binptr,l); |
100 | } | 100 | } |
101 | 101 | ||
102 | /* | 102 | /* |
103 | * w3c times | 103 | * w3c times |
104 | */ | 104 | */ |
105 | 105 | ||
106 | string time_to_w3c(time_t t) { | 106 | string time_to_w3c(time_t t) { |
107 | struct tm tm_t; | 107 | struct tm tm_t; |
108 | if(!gmtime_r(&t,&tm_t)) | 108 | if(!gmtime_r(&t,&tm_t)) |
109 | throw failed_conversion(OPKELE_CP_ "failed to BN_dec2bn()"); | 109 | throw failed_conversion(OPKELE_CP_ "failed to BN_dec2bn()"); |
110 | char rv[25]; | 110 | char rv[25]; |
111 | if(!strftime(rv,sizeof(rv)-1,"%Y-%m-%dT%H:%M:%SZ",&tm_t)) | 111 | if(!strftime(rv,sizeof(rv)-1,"%Y-%m-%dT%H:%M:%SZ",&tm_t)) |
112 | throw failed_conversion(OPKELE_CP_ "failed to strftime()"); | 112 | throw failed_conversion(OPKELE_CP_ "failed to strftime()"); |
113 | return rv; | 113 | return rv; |
114 | } | 114 | } |
115 | 115 | ||
116 | time_t w3c_to_time(const string& w) { | 116 | time_t w3c_to_time(const string& w) { |
117 | int fraction; | ||
117 | struct tm tm_t; | 118 | struct tm tm_t; |
118 | memset(&tm_t,0,sizeof(tm_t)); | 119 | memset(&tm_t,0,sizeof(tm_t)); |
119 | if( | 120 | if( ( |
121 | sscanf( | ||
122 | w.c_str(), | ||
123 | "%04d-%02d-%02dT%02d:%02d:%02dZ", | ||
124 | &tm_t.tm_year,&tm_t.tm_mon,&tm_t.tm_mday, | ||
125 | &tm_t.tm_hour,&tm_t.tm_min,&tm_t.tm_sec | ||
126 | ) != 6 | ||
127 | ) && ( | ||
120 | sscanf( | 128 | sscanf( |
121 | w.c_str(), | 129 | w.c_str(), |
122 | "%04d-%02d-%02dT%02d:%02d:%02dZ", | 130 | "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ", |
123 | &tm_t.tm_year,&tm_t.tm_mon,&tm_t.tm_mday, | 131 | &tm_t.tm_year,&tm_t.tm_mon,&tm_t.tm_mday, |
124 | &tm_t.tm_hour,&tm_t.tm_min,&tm_t.tm_sec | 132 | &tm_t.tm_hour,&tm_t.tm_min,&tm_t.tm_sec, |
125 | ) != 6 ) | 133 | &fraction |
134 | ) != 7 | ||
135 | ) ) | ||
126 | throw failed_conversion(OPKELE_CP_ "failed to sscanf()"); | 136 | throw failed_conversion(OPKELE_CP_ "failed to sscanf()"); |
127 | tm_t.tm_mon--; | 137 | tm_t.tm_mon--; |
128 | tm_t.tm_year-=1900; | 138 | tm_t.tm_year-=1900; |
129 | time_t rv = mktime(&tm_t); | 139 | time_t rv = mktime(&tm_t); |
130 | if(rv==(time_t)-1) | 140 | if(rv==(time_t)-1) |
131 | throw failed_conversion(OPKELE_CP_ "failed to mktime()"); | 141 | throw failed_conversion(OPKELE_CP_ "failed to mktime()"); |
132 | return rv; | 142 | return rv-timezone; |
133 | } | 143 | } |
134 | 144 | ||
135 | /* | 145 | /* |
136 | * | 146 | * |
137 | */ | 147 | */ |
138 | 148 | ||
139 | string url_encode(const string& str) { | 149 | string url_encode(const string& str) { |
140 | char * t = curl_escape(str.c_str(),str.length()); | 150 | char * t = curl_escape(str.c_str(),str.length()); |
141 | if(!t) | 151 | if(!t) |
142 | throw failed_conversion(OPKELE_CP_ "failed to curl_escape()"); | 152 | throw failed_conversion(OPKELE_CP_ "failed to curl_escape()"); |
143 | string rv(t); | 153 | string rv(t); |
144 | curl_free(t); | 154 | curl_free(t); |
145 | return rv; | 155 | return rv; |
146 | } | 156 | } |
147 | 157 | ||
148 | string long_to_string(long l) { | 158 | string long_to_string(long l) { |
149 | char rv[32]; | 159 | char rv[32]; |
150 | int r=snprintf(rv,sizeof(rv),"%ld",l); | 160 | int r=snprintf(rv,sizeof(rv),"%ld",l); |
151 | if(r<0 || r>=(int)sizeof(rv)) | 161 | if(r<0 || r>=(int)sizeof(rv)) |
152 | throw failed_conversion(OPKELE_CP_ "failed to snprintf()"); | 162 | throw failed_conversion(OPKELE_CP_ "failed to snprintf()"); |
153 | return rv; | 163 | return rv; |
154 | } | 164 | } |
155 | 165 | ||
156 | long string_to_long(const string& s) { | 166 | long string_to_long(const string& s) { |
157 | char *endptr = 0; | 167 | char *endptr = 0; |
158 | long rv = strtol(s.c_str(),&endptr,10); | 168 | long rv = strtol(s.c_str(),&endptr,10); |
159 | if((!endptr) || endptr==s.c_str()) | 169 | if((!endptr) || endptr==s.c_str()) |
160 | throw failed_conversion(OPKELE_CP_ "failed to strtol()"); | 170 | throw failed_conversion(OPKELE_CP_ "failed to strtol()"); |
161 | return rv; | 171 | return rv; |
162 | } | 172 | } |
163 | 173 | ||
164 | /* | 174 | /* |
165 | * Normalize URL according to the rules, described in rfc 3986, section 6 | 175 | * Normalize URL according to the rules, described in rfc 3986, section 6 |
166 | * | 176 | * |
167 | * - uppercase hex triplets (e.g. %ab -> %AB) | 177 | * - uppercase hex triplets (e.g. %ab -> %AB) |
168 | * - lowercase scheme and host | 178 | * - lowercase scheme and host |
169 | * - decode %-encoded characters, specified as unreserved in rfc 3986, section 2.3, | 179 | * - decode %-encoded characters, specified as unreserved in rfc 3986, section 2.3, |
170 | * that is - [:alpha:][:digit:]._~- | 180 | * that is - [:alpha:][:digit:]._~- |
171 | * - remove dot segments | 181 | * - remove dot segments |
172 | * - remove empty and default ports | 182 | * - remove empty and default ports |
173 | * - if there's no path component, add '/' | 183 | * - if there's no path component, add '/' |
174 | */ | 184 | */ |
175 | string rfc_3986_normalize_uri(const string& uri) { | 185 | string rfc_3986_normalize_uri(const string& uri) { |
176 | static const char *whitespace = " \t\r\n"; | 186 | static const char *whitespace = " \t\r\n"; |
177 | string rv; | 187 | string rv; |
178 | string::size_type ns = uri.find_first_not_of(whitespace); | 188 | string::size_type ns = uri.find_first_not_of(whitespace); |
179 | if(ns==string::npos) | 189 | if(ns==string::npos) |
180 | throw bad_input(OPKELE_CP_ "Can't normalize empty URI"); | 190 | throw bad_input(OPKELE_CP_ "Can't normalize empty URI"); |