- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这个 stackoverflow 问题 - How do I pass a URL a cookie using Rebol 3? - 几乎回答了我的问题,但我不确定如何从响应中捕获 cookie。
我想做的是调用传递 cookie(和 header )的 URL 并能够查看响应和 cookie(和 header )。
我想我需要做的是打开
端口然后我可以查询
响应。像这样:
site: open http://rebol.com
write site [ GET [ Cookie: {test=1}] ]
query site
close site
这是最好的方法吗?
最佳答案
我使用已修改为的 http 协议(protocol)执行此操作
文件位于:
https://raw.githubusercontent.com/gchiu/Rebol3/master/protocols/prot-http.r3
>> do https://raw.githubusercontent.com/gchiu/Rebol3/master/protocols/prot-http.r3
>> a: write http://stackoverflow.com [ headers "" ]
>> probe a/spec/debug/headers/set-cookie
[{__cfduid=d349046701c0e9fd9f8858fa4b406ff141438752651; expires=Thu, 04-Aug-16 0
5:30:51 GMT; path=/; domain=.stackoverflow.com; HttpOnly} {prov=f1a9c7a9-cd49-44
82-94e0-4594c7991c19; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:
00 GMT; path=/; HttpOnly}]
这是一个.patch 文件,它与Atronix 当前使用的http.r 不同。和 Ren/C :
diff --git a/src/mezz/prot-http.r b/src/mezz/prot-http.r
index 426f115..dfa344a 100644
--- a/src/mezz/prot-http.r
+++ b/src/mezz/prot-http.r
@@ -11,16 +11,27 @@ REBOL [
}
Name: 'http
Type: 'module
- Version: 0.1.4
- File: %prot-http.r
+ Version: 0.1.45
+ File: %prot-http.r3
Purpose: {
This program defines the HTTP protocol scheme for REBOL 3.
}
- Author: ["Gabriele Santilli" "Richard Smolak"]
- Date: 26-Nov-2012
+ Author: ["Gabriele Santilli" "Richard Smolak" "Graham Chiu"]
+ notes: {modified to return an error object with the info object when manual redirect required - Graham}
+ Date: 27-April-2014
]
-sync-op: func [port body /local state] [
+digit: charset [ #"0" - #"9" ]
+alpha: charset [ #"a" - #"z" #"A" - #"Z" ]
+idate-to-date: func [ date [string!] /local day month year time zone]
+[
+ either parse date [ 5 skip copy day 2 digit space copy month 3 alpha space copy year 4 digit space copy time to space space copy zone to end ][
+ if zone = "GMT" [ zone: copy "+0" ]
+ to date! ajoin [ day "-" month "-" year "/" time zone ]
+ ][ none ]
+]
+
+sync-op: func [port body /local state ] [
unless port/state [open port port/state/close?: yes]
state: port/state
state/awake: :read-sync-awake
@@ -35,7 +46,11 @@ sync-op: func [port body /local state] [
]
body: copy port
if state/close? [close port]
- body
+ either port/spec/debug [
+ state/connection/locals
+ ][
+ body
+ ]
]
read-sync-awake: func [event [event!] /local error] [
switch/default event/type [
@@ -111,12 +126,34 @@ http-awake: func [event /local port http-port state awake res] [
make-http-error: func [
"Make an error for the HTTP protocol"
message [string! block!]
+ /inf obj
+ /otherhost new-url [url!]
] [
if block? message [message: ajoin message]
- make error! [
- type: 'Access
- id: 'Protocol
- arg1: message
+ case [
+ inf [
+ make error! [
+ type: 'Access
+ id: 'Protocol
+ arg1: message
+ arg2: obj
+ ]
+ ]
+ otherhost [
+ make error! [
+ type: 'Access
+ id: 'Protocol
+ arg1: message
+ arg3: new-url
+ ]
+ ]
+ true [
+ make error! [
+ type: 'Access
+ id: 'Protocol
+ arg1: message
+ ]
+ ]
]
]
http-error: func [
@@ -174,9 +211,11 @@ do-request: func [
make-http-request spec/method to file! any [spec/path %/]
spec/headers spec/content
]
-parse-write-dialect: func [port block /local spec] [
+parse-write-dialect: func [port block /local spec debug] [
spec: port/spec
- parse block [[set block word! (spec/method: block) | (spec/method: 'post)]
+ parse block [
+ opt [ 'headers ( spec/debug: true ) ]
+ [set block word! (spec/method: block) | (spec/method: 'post)]
opt [set block [file! | url!] (spec/path: block)] [set block block! (spec/headers: block) | (spec/headers: [])] [set block [any-string! | binary!] (spec/content: block) | (spec/content: none)]
]
]
@@ -197,7 +236,7 @@ check-response: func [port /local conn res headers d1 d2 line info state awake s
info/headers: headers: construct/with d1 http-response-headers
info/name: to file! any [spec/path %/]
if headers/content-length [info/size: headers/content-length: to integer! headers/content-length]
- if headers/last-modified [info/date: attempt [to date! headers/last-modified]]
+ if headers/last-modified [info/date: attempt [idate-to-date headers/last-modified]]
remove/part conn/data d2
state/state: 'reading-data
]
@@ -237,6 +276,9 @@ check-response: func [port /local conn res headers d1 d2 line info state awake s
| (info/response-parsed: 'version-not-supported)
]
]
+ if all [logic? spec/debug true? spec/debug] [
+ spec/debug: info
+ ]
switch/all info/response-parsed [
ok [
either spec/method = 'head [
@@ -276,7 +318,7 @@ check-response: func [port /local conn res headers d1 d2 line info state awake s
] [
res: do-redirect port headers/location
] [
- state/error: make-http-error "Redirect requires manual intervention"
+ state/error: make-http-error/inf "Redirect requires manual intervention" info
res: awake make event! [type: 'error port: port]
]
]
@@ -364,7 +406,7 @@ do-redirect: func [port [port!] new-uri [url! string! file!] /local spec state]
do-request port
false
] [
- state/error: make-http-error "Redirect to other host - requires custom handling"
+ state/error: make-http-error/otherhost "Redirect to other host - requires custom handling" to-url rejoin [new-uri/scheme "://" new-uri/host new-uri/path]
state/awake make event! [type: 'error port: port]
]
]
@@ -449,6 +491,7 @@ sys/make-scheme [
headers: []
content: none
timeout: 15
+ debug: none
]
info: make system/standard/file-info [
response-line:
关于http - 如何使用 Rebol 3 将 URL 传递给 cookie 并获取响应 cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31823358/
我知道你可以输入声明参数并返回函数 some-func: function [ "some func" number [ integer! ] ] [ resul
我在 REBOL3 REPL 中遇到的一个烦人的问题是它不接受多行语句。例如,我想输入 "some_obj: make obj! [",按回车键,然后继续该语句。 这对我来说很重要,因为我使用 Vim
我尝试使用 find函数检查字符串 "ll" 的出现在字符串中 "hello" ,但它返回 "ll"而不是 true或 false : "This prints 'll'" print find "h
我创造了这个 cloneset: :set set: func[word [word!] value][ if/else (type? get word) = list! [ print "l
我还没有弄清楚如何以更简洁的方式拆分字符串。 ref: copy/part (find line "#") -15 rest2: copy/part (skip (find line "#") 1
这适用于外壳级别: >> a: "hello" == "hello" >> get to-lit-word "a" == "hello" 但是在这样的函数中: f: func [ arg1 ] [
想象一下下面的 REBOL 代码: foo: 上下文 [bar: 3] 我现在有一个上下文 foo其中'bar被定义为。我怎样才能在这个上下文中动态地注入(inject)一个新词?是否可以? 我试过了
我们可以通过 input 从控制台获取输入或 ask ,表示按键盘上的某些键并按“Enter”键终止输入。 我想知道是否有一种方法可以获得按键输入,也就是说,只需按下键盘上的一个键,然后就会发生一些事
鉴于您可以将函数的参数限制为特定数据类型,因此您可能想要定义自己的数据类型是合情合理的,但我在 Rebol 文档中看不到任何内容表明这是该语言的一个特性(除非我没有)看起来很好)。 我期望的是能够执行
我正在我的脚本中连接到多台服务器,目前如果其中一台发生故障,我会收到 ** Access Error: Network timeout错误,脚本停止。我宁愿能够发现并继续前进,而不是让它完全放弃。 有
在 R2 和 R3 中,我可以使用 unique从系列中删除重复项: >> a: [1 2 2 3] >> length? a == 4 >> length? unique a == 3 如何对一系列
有没有办法避免这个问题? 最佳答案 这是 Rebol v2.x 网络协议(protocol)中的一个错误。这是一个有效的网址!类型。通常,你可以这样做: >> type? http://user:pa
可以覆盖 rebol 系统单词,如 print、make 等,那么是否可以对路径运算符执行相同的操作?那么语法是什么? 最佳答案 另一种可能的方法是使用 REBOL 元编程功能并预处理您自己的代码以捕
在另一个问题中,我看到了以下语法: #[未设置!] 那是什么?如果我说 type? #[unset!] 在 R3 中,它告诉我 unset!,但它并没有解开 #[] 是什么的谜团。 很好奇。 最佳答案
我想要这样的东西: >> op : infix-func [self x] [ 2 * x + self ] >> 3 op 2 == 7 有可能吗? 最佳答案 目前不可能,不。您可以将现有运算符分配
我知道,我知道。 “什么换行状态?”,你问。好吧,让我告诉你: append [] w: first new-line [hello] on == [ hello ] W 现在是一个词,在附加
我试图在 REBOL 编程语言中将函数作为参数传递,但我还没有找到正确的语法: doSomething: func [a b] [ a b a b ] doSomething prin
我正在执行一些代码,然后等待 1 秒到 1 分钟。我目前正在使用 random 0:01:00/seed,但我真正需要的是能够设置一个楼层,使其等待 30 秒到 1 分钟。 最佳答案 如果您希望 0:
新手问题在这里... 我想将“what”函数的输出写入文本文件。 所以这就是我所做的: 我创建了一个名为“text”的变量并将“what”的输出分配给它 文字:[什么] 现在我想将“text”变量的内
为了逐行读取文本文件,而不将整个文件加载到内存中,在 Rebol 中这样做的常用方法是什么? 我正在执行以下操作,但我认为(如果我错了,请纠正我)它首先将整个文件加载到内存中: foreach lin
我是一名优秀的程序员,十分优秀!