wi_string_t * wi_socket_read_to_string(wi_socket_t *socket, wi_time_interval_t timeout, wi_string_t *separator) { wi_string_t *string, *substring; wi_uinteger_t index; index = wi_string_index_of_string(socket->buffer, separator, 0); if(index != WI_NOT_FOUND) { substring = wi_string_substring_to_index(socket->buffer, index + wi_string_length(separator)); wi_mutable_string_delete_characters_in_range(socket->buffer, wi_make_range(0, wi_string_length(substring))); return substring; } while((string = wi_socket_read_string(socket, timeout))) { if(wi_string_length(string) == 0) return string; wi_mutable_string_append_string(socket->buffer, string); index = wi_string_index_of_string(socket->buffer, separator, 0); if(index == WI_NOT_FOUND) { if(wi_string_length(socket->buffer) > _WI_SOCKET_BUFFER_MAX_SIZE) { wi_error_set_libwired_error_with_format(WI_ERROR_SOCKET_OVERFLOW, WI_STR("Buffer is %u bytes"), wi_string_length(socket->buffer)); wi_mutable_string_set_string(socket->buffer, WI_STR("")); return NULL; } } else { substring = wi_string_substring_to_index(socket->buffer, index + wi_string_length(separator)); wi_mutable_string_delete_characters_in_range(socket->buffer, wi_make_range(0, wi_string_length(substring))); return substring; } } return NULL; }
wi_date_t * wi_date_init_with_rfc3339_string(wi_date_t *date, wi_string_t *string) { wi_mutable_string_t *fullstring; wi_string_t *timezone; if(wi_string_length(string) >= 19) { fullstring = wi_autorelease(wi_mutable_copy(string)); timezone = wi_string_substring_from_index(fullstring, 19); if(wi_is_equal(timezone, WI_STR("Z"))) { wi_mutable_string_delete_characters_in_range(fullstring, wi_make_range(19, 1)); return wi_date_init_with_string(date, fullstring, WI_STR("%Y-%m-%dT%H:%M:%S")); } else if(wi_string_length(timezone) == 6) { wi_mutable_string_delete_characters_in_range(fullstring, wi_make_range(22, 1)); return wi_date_init_with_string(date, fullstring, WI_STR("%Y-%m-%dT%H:%M:%S%z")); } } wi_release(date); return NULL; }