mirror of
https://github.com/wisdgod/cursor-api.git
synced 2025-10-06 07:06:51 +08:00
添加环境变量 TOKEN_DELIMITER
支持自定义分隔符
This commit is contained in:
@@ -47,3 +47,6 @@ REVERSE_PROXY_HOST=
|
|||||||
# 请求体大小限制(单位为MB)
|
# 请求体大小限制(单位为MB)
|
||||||
# 默认为2MB (2,097,152 字节)
|
# 默认为2MB (2,097,152 字节)
|
||||||
REQUEST_BODY_LIMIT_MB=2
|
REQUEST_BODY_LIMIT_MB=2
|
||||||
|
|
||||||
|
# OpenAI 请求时,token 和 checksum 的分隔符
|
||||||
|
TOKEN_DELIMITER=,
|
@@ -3,7 +3,7 @@ use crate::{
|
|||||||
CURSOR_API2_HOST, CURSOR_HOST, DEFAULT_TOKEN_FILE_NAME, DEFAULT_TOKEN_LIST_FILE_NAME,
|
CURSOR_API2_HOST, CURSOR_HOST, DEFAULT_TOKEN_FILE_NAME, DEFAULT_TOKEN_LIST_FILE_NAME,
|
||||||
EMPTY_STRING,
|
EMPTY_STRING,
|
||||||
},
|
},
|
||||||
common::utils::parse_string_from_env,
|
common::utils::{parse_char_from_env, parse_string_from_env},
|
||||||
};
|
};
|
||||||
use std::sync::LazyLock;
|
use std::sync::LazyLock;
|
||||||
|
|
||||||
@@ -49,12 +49,17 @@ pub fn get_start_time() -> chrono::DateTime<chrono::Local> {
|
|||||||
|
|
||||||
def_pub_static!(DEFAULT_INSTRUCTIONS, env: "DEFAULT_INSTRUCTIONS", default: "Respond in Chinese by default");
|
def_pub_static!(DEFAULT_INSTRUCTIONS, env: "DEFAULT_INSTRUCTIONS", default: "Respond in Chinese by default");
|
||||||
|
|
||||||
def_pub_static!(REVERSE_PROXY_HOST, env: "REVERSE_PROXY_HOST", default: "");
|
def_pub_static!(REVERSE_PROXY_HOST, env: "REVERSE_PROXY_HOST", default: EMPTY_STRING);
|
||||||
|
|
||||||
def_pub_static!(SHARED_AUTH_TOKEN, env: "SHARED_AUTH_TOKEN", default: EMPTY_STRING);
|
def_pub_static!(SHARED_AUTH_TOKEN, env: "SHARED_AUTH_TOKEN", default: EMPTY_STRING);
|
||||||
|
|
||||||
pub static USE_SHARE: LazyLock<bool> = LazyLock::new(|| !SHARED_AUTH_TOKEN.is_empty());
|
pub static USE_SHARE: LazyLock<bool> = LazyLock::new(|| !SHARED_AUTH_TOKEN.is_empty());
|
||||||
|
|
||||||
|
pub static TOKEN_DELIMITER: LazyLock<char> =
|
||||||
|
LazyLock::new(|| parse_char_from_env("TOKEN_DELIMITER", ','));
|
||||||
|
|
||||||
|
pub static TOKEN_DELIMITER_LEN: LazyLock<usize> = LazyLock::new(|| TOKEN_DELIMITER.len_utf8());
|
||||||
|
|
||||||
pub static USE_PROXY: LazyLock<bool> = LazyLock::new(|| !REVERSE_PROXY_HOST.is_empty());
|
pub static USE_PROXY: LazyLock<bool> = LazyLock::new(|| !REVERSE_PROXY_HOST.is_empty());
|
||||||
|
|
||||||
pub static CURSOR_API2_CHAT_URL: LazyLock<String> = LazyLock::new(|| {
|
pub static CURSOR_API2_CHAT_URL: LazyLock<String> = LazyLock::new(|| {
|
||||||
|
@@ -243,27 +243,6 @@ pub async fn handle_chat(
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 构建请求客户端
|
// 构建请求客户端
|
||||||
// let client_key = match generate_client_key(&checksum) {
|
|
||||||
// Some(key) => key,
|
|
||||||
// None => {
|
|
||||||
// let mut state = state.lock().await;
|
|
||||||
// if let Some(log) = state
|
|
||||||
// .request_logs
|
|
||||||
// .iter_mut()
|
|
||||||
// .rev()
|
|
||||||
// .find(|log| log.id == current_id)
|
|
||||||
// {
|
|
||||||
// log.status = STATUS_FAILED;
|
|
||||||
// log.error = Some(ERR_CHECKSUM_NO_GOOD.to_string());
|
|
||||||
// }
|
|
||||||
// state.active_requests -= 1;
|
|
||||||
// state.error_requests += 1;
|
|
||||||
// return Err((
|
|
||||||
// StatusCode::BAD_REQUEST,
|
|
||||||
// Json(ChatError::RequestFailed(ERR_CHECKSUM_NO_GOOD.to_string()).to_json()),
|
|
||||||
// ));
|
|
||||||
// }
|
|
||||||
// };
|
|
||||||
let client = build_client(&auth_token, &checksum);
|
let client = build_client(&auth_token, &checksum);
|
||||||
let response = client.body(hex_data).send().await;
|
let response = client.body(hex_data).send().await;
|
||||||
|
|
||||||
|
@@ -4,7 +4,10 @@ mod tokens;
|
|||||||
pub use tokens::*;
|
pub use tokens::*;
|
||||||
|
|
||||||
use super::models::userinfo::{StripeProfile, TokenProfile, UsageProfile, UserProfile};
|
use super::models::userinfo::{StripeProfile, TokenProfile, UsageProfile, UserProfile};
|
||||||
use crate::app::constant::{FALSE, TRUE};
|
use crate::app::{
|
||||||
|
constant::{FALSE, TRUE},
|
||||||
|
lazy::{TOKEN_DELIMITER, TOKEN_DELIMITER_LEN},
|
||||||
|
};
|
||||||
|
|
||||||
pub fn parse_bool_from_env(key: &str, default: bool) -> bool {
|
pub fn parse_bool_from_env(key: &str, default: bool) -> bool {
|
||||||
std::env::var(key)
|
std::env::var(key)
|
||||||
@@ -21,6 +24,20 @@ pub fn parse_string_from_env(key: &str, default: &str) -> String {
|
|||||||
std::env::var(key).unwrap_or_else(|_| default.to_string())
|
std::env::var(key).unwrap_or_else(|_| default.to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn parse_char_from_env(key: &str, default: char) -> char {
|
||||||
|
std::env::var(key)
|
||||||
|
.ok()
|
||||||
|
.and_then(|v| {
|
||||||
|
let chars: Vec<char> = v.chars().collect();
|
||||||
|
if chars.len() == 1 {
|
||||||
|
Some(chars[0])
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.unwrap_or(default)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn parse_usize_from_env(key: &str, default: usize) -> usize {
|
pub fn parse_usize_from_env(key: &str, default: usize) -> usize {
|
||||||
std::env::var(key)
|
std::env::var(key)
|
||||||
.ok()
|
.ok()
|
||||||
@@ -86,9 +103,9 @@ pub async fn get_user_profile(auth_token: &str) -> Option<UserProfile> {
|
|||||||
|
|
||||||
pub fn validate_token_and_checksum(auth_token: &str) -> Option<(String, String)> {
|
pub fn validate_token_and_checksum(auth_token: &str) -> Option<(String, String)> {
|
||||||
// 找最后一个逗号
|
// 找最后一个逗号
|
||||||
let comma_pos = auth_token.rfind(',')?;
|
let comma_pos = auth_token.rfind(*TOKEN_DELIMITER)?;
|
||||||
let (token_part, checksum) = auth_token.split_at(comma_pos);
|
let (token_part, checksum) = auth_token.split_at(comma_pos);
|
||||||
let checksum = &checksum[1..]; // 跳过逗号
|
let checksum = &checksum[*TOKEN_DELIMITER_LEN..]; // 跳过逗号
|
||||||
|
|
||||||
// 解析 token - 为了向前兼容,忽略最后一个:或%3A前的内容
|
// 解析 token - 为了向前兼容,忽略最后一个:或%3A前的内容
|
||||||
let colon_pos = token_part.rfind(':');
|
let colon_pos = token_part.rfind(':');
|
||||||
@@ -115,11 +132,12 @@ pub fn validate_token_and_checksum(auth_token: &str) -> Option<(String, String)>
|
|||||||
|
|
||||||
pub fn extract_token(auth_token: &str) -> Option<String> {
|
pub fn extract_token(auth_token: &str) -> Option<String> {
|
||||||
// 解析 token
|
// 解析 token
|
||||||
let token_part = match auth_token.rfind(',') {
|
let token_part = match auth_token.rfind(*TOKEN_DELIMITER) {
|
||||||
Some(pos) => &auth_token[..pos],
|
Some(pos) => &auth_token[..pos],
|
||||||
None => auth_token
|
None => auth_token,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 向前兼容
|
||||||
let colon_pos = token_part.rfind(':');
|
let colon_pos = token_part.rfind(':');
|
||||||
let encoded_colon_pos = token_part.rfind("%3A");
|
let encoded_colon_pos = token_part.rfind("%3A");
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user