gpt4 book ai didi

json - 远程传输 session 在提供正确的 session ID 后没有响应

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:12:30 26 4
gpt4 key购买 nike

好吧,这将是一个相当晦涩的话题,但我会试一试,也许有人会知道答案。

我正在为 Transmission BitTorrent 客户端编写一个小型远程 Node.js 客户端。使用 JSON 对象通过 RPC 处理通信。

这是 specification .

还有我的代码(用 CoffeeScript 编写,如果这是一个问题,我也可以提供等效的 JavaScript 代码,只是不想让这个问题太长而无法阅读),重要的部分:

runRemoteCommand: (params) ->
# convert JSON object to string
params = JSON.stringify params #, null, " "

# set request options
options =
host: @config.host
port: @config.port
path: @config.rpcPath
auth: "#{@config.username}:#{@config.password}"
headers:
'Content-Type': 'application/json'
'Content-Length': params.length
method: 'GET'

# we don't know the session id yet
sessionId = false

# wrapped in a function so it could be run two times, not really a finished solution
run = () =>
# If the session id is provided, set the header, as in 2.3.1 of the specs
if sessionId
options.headers["X-Transmission-Session-Id"] = sessionId

# define the request object and a callback for the response
request = @http.get options, (response) =>
# log everything for debug purposes
console.log "STATUS: #{response.statusCode}"
console.log "HEADERS: #{JSON.stringify response.headers}"
response.setEncoding 'utf8'
response.on "data", (data) =>
console.log "BODY: #{data}"

# if status code is 409, use provided session id
if response.statusCode == 409
sessionId = response.headers["x-transmission-session-id"]
console.log "sessionId: #{sessionId}"
# running it immediately sometimes caused the remote server to provide a 501 error, so I gave it a timeout
setTimeout run, 5000

# no output here
request.on "error", (e) =>
console.log "ERROR: #{e}"

# actually send the request
request.write params
request.end()

# run our function
run()

params 变量定义为:

params =
"arguments":
"filename": link
"method": "torrent-add"
"tag": 6667

在我设置有效的 session ID 之前一切正常。第一次调用 run 函数时,我得到以下输出(对其进行了一些格式化以便更加直观):

STATUS: 409

HEADERS:

{
"server":"Transmission",
"x-transmission-session-id":"io4dOLm8Q33aSCEULW0iv74SeewJ3w1tP21L7qkdS4QktIkR",
"date":"Wed, 04 Apr 2012 08:37:37 GMT",
"content-length":"580",
"content-type":"text/html; charset=ISO-8859-1"
}

sessionId: io4dOLm8Q33aSCEULW0iv74SeewJ3w1tP21L7qkdS4QktIkR

BODY:

409: Conflict

Your request had an invalid session-id header.

To fix this, follow these steps:

  1. When reading a response, get its X-Transmission-Session-Id header and remember it
  2. Add the updated header to your outgoing requests
  3. When you get this 409 error message, resend your request with the updated header

This requirement has been added to help prevent CSRF attacks.

X-Transmission-Session-Id:
io4dOLm8Q33aSCEULW0iv74SeewJ3w1tP21L7qkdS4QktIkR

当没有提供 session ID 时,这正是远程服务器应该返回的内容。但是,在 header 中设置 session ID 后,服务器没有响应。第二个 run 调用被触发并且请求被发送(通过放置一些有用的 console.log 来确认),但是响应回调永远不会被触发。我没有收到来自远程服务器的响应,我的应用程序停止等待。

我很确定错误是在我这边,而不是在服务器端,因为开箱即用的 android 远程客户端在连接到同一远程 session 时工作正常。

我是否正确地执行了请求?尤其是 JSON 部分?

编辑:一个小测试

我已经编写了一个小的 php 脚本来测试 JSON 编码的请求是否正常,并将其用作“假”远程传输。在这里:

$headers = apache_request_headers();

// Simulate transmission's behavior
if (!isset($headers['X-Transmission-Session-Id'])) {
header("HTTP/1.0 409 Conflict");
header("X-Transmission-Session-Id: test");
}

print_r($headers);

// Is there a nicer way to get the raw request?
print_r(file_get_contents('php://input'));

而且,就我个人而言,我没有发现此测试输出的数据有任何问题。返回 409 状态代码后,Node.js 应用程序正确分配请求的 session ID。第一个 print_r 打印一个数组:

Array
(
[Content-type] => application/json
[Content-length] => 152
[X-Transmission-Session-Id] => test
[Host] => tp.localhost
[Connection] => keep-alive
)

第二个打印一个字符串,它是一个格式正确的 JSON 字符串(没有更多内容):

{
"arguments": {
"filename": "http://link-to-torrent"
},
"method": "torrent-add",
"tag": 6667
}

我真的看不出我做错了什么。我使用同一远程服务器测试的一些第三方客户端可以正常工作。

最佳答案

我在这门课上遇到了同样的问题。我在想更好的方法来做一个 getData 方法。但它有效。

http = require "http"
_ = require "underscore"

class Connect
constructor: (@login, @password, @host='127.0.0.1', @port=9091, @headers={}) ->

getData: (params)->
key = "x-transmission-session-id"

options = {
host: @host
port: @port
path: '/transmission/rpc',
method: 'POST',
headers: @headers || {},
auth: "#{ @login }:#{ @password }"
}

_.extend options, params || {}

req = http.request(options, (res)=>
if res.statusCode == 401
console.log "Auth errror"

else if res.statusCode == 409
auth_header={}
auth_header[key] = res.headers[key]

_.extend @headers, auth_header
@getData(params)

else if res.statusCode == 200
res.setEncoding 'utf8'
res.on('data', (chunk)->
#here should be an emmit of data
console.log chunk
)

else
console.log "Error #{ res.statusCode }"

)
req.write('data\n')
req.write('data\n')
req.end()

connector = new Connect "transmission", "password"

connector.getData()

关于json - 远程传输 session 在提供正确的 session ID 后没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10008268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com