Git Product home page Git Product logo

rebol3's Introduction

Rebol CI Build Rebol Gitter Zulip Chocolatey Replit

Rebol [R3] Source Code Distribution

Purpose of this Rebol fork is to push Carl's original source to be at least as usable as Rebol 2 while keeping the source code clean and project easy to build. Use CHANGES.md file to see changes made in this branch.

Issue Reporting

Preferred way to report issues is using the dedicated issue repository. It's a fork of the original Rebol issue repository, which was filled with issues from the CureCode issue tracker, which was used before Rebol was on Github. I'm not using the original Rebol issue repository, because I was not allowed to even add labels to my own issues. It was later moved under Metaeducation account and is used for Ren-C development anyway.

Precompiled Binaries

There are available precompiled binaries for each release. So far there are 3 main build types:

  1. Base is a build with minimal additions (not much useful)
  2. Core includes a little bit more stuff than the Base
  3. Bulk is a build which includes almost everything.

And there is also the Host exe and the DLL - the Rebol library is separated and used from the host application. That is from times before open sourcing Rebol completely. Only host part was open and the library was still closed. In theory you can have one library and many tiny host applications. I'm building just the Core on Windows so far to see, if it is still working.

For macOS users on 10.15+, downloaded precompiled applications (and or extensions bellow) may not work properly unless the quarantine setting is removed:

xattr -d -r com.apple.quarantine /path/to/file

Rebol extensions

It is possible to extend Rebol functionality using external modules (native and or written in Rebol itself). Here are links to some of them:

It should be noted that on macOS it may be required to resign downloaded native extensions using command like:

codesign --sign "5D94...EED5" -f -o runtime /path/to/extension.rebx

To find a signing identity, use: security find-identity

Building Rebol

Rebol itself is not a compiler (like Red language) but just an interpreter. You must have some compiler of your choice to compile Rebol. For Windows you may want to use any of these:

  1. Microsoft Visual Studio
  2. CLANG
  3. GCC (Mingw)

Once you have any of these compilers, you must use Siskin Builder tool, which is actually a customised Rebol needed to preprocess it's own sources. It deserves own documentation as it's not mean to be used only to build Rebol. Meanwhile you may take a look at the source of the Github workflow file for building all Rebol variants used in the releases.

For a local use, you just do: siskin <SOME-NEST-FILE>, which starts CLI in an interactive mode.

The Siskin builder itself may be used as an example, how to build a custom utility based on Rebol sources. The specification is defined in this *.nest file, where important is CUSTOM_STARTUP define and some files, which should be included and some optional Rebol parts if needed.

Screenshots

Building a customized CLI application using compile DSL:

Other Rebol related projects

If you are looking for other Rebol like languages, you may want to check also:

  • Arturo language written in Nim
  • Boron language written in C
  • Red language written in Red bootstrapped from Rebol2
  • Red.js web runtime for Red written in Haxe
  • Ren-C another living Rebol3 fork
  • Rye language written in Go
  • Topaz experimental Rebol like language being compiled to JS
  • World language written in C

There is also Shinxin's fork, which I was initially using for chery-picking, as it contains modifications from Atronix and Saphirion. But its use is now limited as it depends on non-public modules and also there is not much life visible recently.

rebol3's People

Contributors

0branch avatar acook avatar angerangel avatar blackball avatar brianhawley avatar carls avatar ccx avatar dandlee avatar earl avatar gchiu avatar giuliolunati avatar gregit avatar hostilefork avatar johnk- avatar kealist avatar kjk avatar ladislav avatar nicolas42 avatar oldes avatar semarie avatar spytheman avatar tectorum avatar zsx avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rebol3's Issues

WASI Build

I don't know if this interests you, but it might:

https://github.com/metaeducation/ren-c/runs/7140995235?check_suite_focus=true#step:18:4

Building a .wasm file against WASI means it can execute inside runtimes like WasmEdge, Wasmer, or Wasmtime. These runtimes can do console I/O and are getting more capabilites over time...like file and network access (though the syscalls they implement are different from POSIX). But they are being standardized, and one could potentially give out a single %r3.wasm file and be run on desktop Linux, Windows, Mac... or in the cloud, etc.

There are two toolchains that can be used for this. One is emscripten's emcc in STANDALONE_WEBASSEMBLY mode. This has some drawbacks, for instance you will find that things like fopen() do not work...even though the WASI runtimes have the ability to do that:

https://v8.dev/blog/emscripten-standalone-wasm

The other is called wasi-sdk, and it has some releases here:

https://github.com/WebAssembly/wasi-sdk/releases

Unfortunately wasi-sdk does not currently have network support, even though WASI itself is starting to have the ability (and Rust's parallel to libc supports it, while wasi-sdk's libc does not). But this is a presumably temporary condition, as the network WASI stuff just started happening this year.

You'll have to remove setjmp()/longjmp() bits when you compile. There is no support for this on WASI (the way emscripten supports it is by using the browser's try {} catch {} Javascript under the hood, but with WASI there's no browser and no JavaScript). There is exception support in Wasm and it will be coming to the runtime, so Ren-C has a compile switch to use either setjmp/longjmp or try/catch.

Anyway, to build with the wasi-sdk you just get the compiler for your platform, then the sysroot file with the headers and libs for the runtime. You say --sysroot and give it the path to where you unpacked the sysroot. Things are missing and you'll have to avoid building the things that aren't there, or make stubs.

If you try to run in wasmedge without optimizing it will be slow. (The compiler optimization settings do not optimize for particular runtimes.) But if you use wasmedgec to optimize the executable I saw it be about 50% slower than a native optimized binary. e.g. would take 1.5 seconds to do something an -O2 native could do in 1. Which isn't terrible, considering the benefits and sandboxing.

Anyway, thought you might want to check it out. ๐Ÿคท

Forum post about why I think this is notable.

Sixel support [enhancement proposal]

Hi, what do you think about Sixel support for images/graphics in the terminal?

You already do ANSI stuff in the terminal anyway. There is a recent discussion on hackernews. You can find a list of compatible terminals at arewesixelyet.com - for MacOS you have to use iTerm2, for Windows mintty from MSYS2. Support for programming languages can be found at github.com/saitoha/libsixel with an extensive list of software that can use it (e.g. gnuplot, web browser, even full X11 client). More formal documentation seems to be at vt100.net.

You can probably use it as a poor man's graphics library till you have full GUI/graphics in your Rebol3.

I have made a proof of concept function for myself to convert binary images to sixel encoding but a proper codec(?) would probably be more appropriate. Unfortunately that is above my programming abilities..

sixel_image: funct [binaryimg /inline] [
  a: either (find get-env "TERM" "screen") ["^(esc)Ptmux;^(esc)^(esc)]"] ["^(esc)]"]
  b: "1337;File="
  d: ajoin ["size=" length? binaryimg]
  e: ajoin [";inline=" either inline [0] [1]]
  f: ":"
  g: enbase/flat binaryimg 64
  h: either (find get-env "TERM" "screen") ["^g^(esc)\"] [#"^g"]
  i: #"^n"
  ajoin [a b d e f g h i]
]

>> print sixel_image read http://www.rebol.com/graphics/reb-logo.gif
<image displayed here>
>> print sixel_image read %image.jpg
<image displayed here>

I have used code at imgcat.nu as a blueprint. I have kept the inline parameter even though it does not seem to work and the original source always keeps it at 1.

Thank you for your work and wish you all the best!

`compress` and `decompress` function should be revisited

At this moment there is:

compress: make native! [[
    {Compresses data. Default is deflate with Adler32 checksum and uncompressed size in last 4 bytes.}
    data [binary! string!] "If string, it will be UTF8 encoded"
    /part length "Length of source data"
    /zlib {Use ZLIB (Adler32 checksum) without uncompressed length appended}
    /gzip "Use ZLIB with GZIP envelope (using CRC32 checksum)"
    /lzma "Use LZMA compression"
    /level lvl [integer!] "Compression level 0-9"
]]

and

decompress: make native! [[
    "Decompresses data. Result is binary."
    data [binary!] "Source data to decompress"
    /part "Limits source data to a given length or position"
    length [number! series!] "Length of compressed data (must match end marker)"
    /zlib "Data are in ZLIB format with Adler32 checksum"
    /gzip "Data are in ZLIB format with CRC32 checksum"
    /lzma "Data are in LZMA format"
    /deflate "Data are raw DEFLATE data"
    /size
    bytes [integer!] {Number of decompressed bytes. If not used, size is detected from last 4 source data bytes.}
]]

The compress doc-string for /zlib refinement is wrong, as there is no difference between compress and compress/zlib:

>> compress "aha"
== #{789C4BCC4804000257012B03000000}

>> compress/zlib "aha"
== #{789C4BCC4804000257012B03000000}

In Red these functions are currently defined as:

compress: make native! [[
    {compresses data. return GZIP format (RFC 1952) by default.}
    data         [any-string! binary!] 
     /zlib      "Return ZLIB format (RFC 1950)."
     /deflate   "Return DEFLATE format (RFC 1951)."
]]
decompress: make native! [[
    {Decompresses data. Data in GZIP format (RFC 1952) by default. }
    data         [binary!] 
     /zlib      "Data in ZLIB format (RFC 1950)."
        size         [integer!] "Uncompressed data size. Use 0 if don't know."
     /deflate   "Data in DEFLATE format (RFC 1951)."
        size         [integer!] "Uncompressed data size. Use 0 if don't know."
]]

But I think that using refinements for (de)compression types is not the right way... these function should be flexible enough to handle more types once available :-/

Details on buid types for precompiled binaries

Please forgive me, if I might be missing something, but is there any detailed list of differences between the base, core and bulk precompiled binaries to be found? Even though I had some previous exposure to Rebol/Red some time ago, I am not sure I clearly understand what "minimal additions", "a little bit more" or "almost everything" mean on the main page.

Unable to get draw works

Hello! Downloaded windows x64 release 3.3.0 but unable to get draw works. Any suggestions? Thanks!

WHOIS lookup throws an error when used with IP

Current behaviour:

>> read whois://78.136.133.154
 [WHOIS] Query: 78.136.133.154 from: whois.iana.org
 [WHOIS] Result:
% IANA WHOIS server
% for more information on IANA, visit http://www.iana.org
% This query returned 1 object

refer:        whois.ripe.net

inetnum:      78.0.0.0 - 78.255.255.255
organisation: RIPE NCC
status:       ALLOCATED

whois:        whois.ripe.net

changed:      2006-08
source:       IANA


** Script error: find does not allow tuple! for its series argument
** Where: all if on-result either write read
** Near: all [
    parse result [
        [
            thru "^/whois...

There should not be any error!

import does not support join

Hello Oldes

I do not know if it is a bug, but I find it is a very strange behaviour.

When I want to import a module (e.g. sqlite3.rebx), it works fine if I write sqlite: import %path/to/sqlite3.rebx, but fails when I use 'join like this sqlite: import join library-path %sqlite3.rebx where library-path is set to the folder path where sqlite3.rebx resides.
I get the following error: ** access error: cannot open: join reason: "module not found"

Regards

Franรงois

How to embed script into Interpreter

Hi there,
Thank you very much for your Rebol fork. It's great and saves a lot of work!

The thing that I want to ask is that I have script that I can run with Rebol interpreter, but is it possible to somehow embed the script into the rebol executable file so that it could be run as an executable?
I found out that for Carl's Rebol there was something called encap:
http://www.rebol.com/docs/sdk/encap.html

Is something similar available here?

What to look for?

Thank you,

Build Failed Due to Missing Files

Looks like there has been some changes that haven't made it into the main branch?

Steps to reproduce:

git clone https://github.com/Oldes/Rebol3.git
cd Rebol3
siskin make/rebol3.nest

Output:

โ•โ•—
 โ•‘    .-.
 โ•‘   /'v'\   SISKIN-Framework Builder 0.10.3 Rebol 0.10.3
 โ•‘  (/uOu\)  https://github.com/Siskin-framework/Builder/
 โ•šโ•โ•โ•โ•"โ•"โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
 [SISKIN] Processing nest: /home/user/Source/Clones/Rebol3/make/rebol3.nest
 [SISKIN] Changed directory to: /home/user/Source/Clones/Rebol3/make/
 [SISKIN] Environment: ${NEST_ROOT} is "/home/user/Source/Clones/Rebol3/"
 [SISKIN] Changed directory to: /home/user/Source/Clones/Rebol3/

Found eggs:
  1:    Rebol/Base linux-x86
  2:    Rebol/Core linux-x86
  3:    Rebol/Bulk linux-x86
  4:    Rebol/Base linux-x64
  5:    Rebol/Core linux-x64
  6:    Rebol/Bulk linux-x64
  7:    Rebol/Base linux-armv6
  8:    Rebol/Core linux-armv6
  9:    Rebol/Bulk linux-armv6
  10:   Rebol/Base linux-armv7
  11:   Rebol/Core linux-armv7
  12:   Rebol/Bulk linux-armv7
  13:   Rebol/Base linux-arm64
  14:   Rebol/Core linux-arm64
  15:   Rebol/Bulk linux-arm64
  16:   Rebol/Base linux-mips64le
  17:   Rebol/Core linux-mips64le
  18:   Rebol/Bulk linux-mips64le
  19:   Rebol/Core linux-x64 shared library
  20:   Rebol/Core linux-x64 host application
  21:   Cross-compile Rebol/Base for Haiku x86
  22:   Cross-compile Rebol/Core for Haiku x86
  23:   Cross-compile Rebol/Bulk for Haiku x86
  24:   Cross-compile Rebol/Base for Haiku x64
  25:   Cross-compile Rebol/Core for Haiku x64
  26:   Cross-compile Rebol/Bulk for Haiku x64
  27:   Test extension 32bit
  28:   Test extension 64bit

Egg command: 6


Building: Rebol/Bulk linux-x64
 [SISKIN] ** Error: Source file not found:  /home/user/Source/Clones/Rebol3/src/core/b-boot.c
 [SISKIN] Environment: ${DEFINES} is {-DREBOL_OPTIONS_FILE=\"gen-config.h\" -D__LP64__ -D_FILE_OFFSET_BITS=64 -DENDIAN_LITTLE -DMBEDTLS_AES_C -DMBEDTLS_ASN1_PARSE_C -DMBEDTLS_ASN1_WRITE_C -DMBEDTLS_BIGNUM_C -DMBEDTLS_CTR_DRBG_C -DMBEDTLS_DHM_C -DMBEDTLS_ECDH_C -DMBEDTLS_ECDSA_C -DMBEDTLS_ECP_C -DMBEDTLS_ENTROPY_C -DMBEDTLS_OID_C -DMBEDTLS_PKCS1_V15 -DREB_EXE -DTEST_EXTENSIONS -DTO_LINUX}
 [SISKIN] Environment: ${INCLUDES} is "-Isrc/include/"
 [SISKIN] Environment: ${NEST_SPEC} is {/home/user/Source/Clones/Rebol3/make/tmp/gcc-x64/rebol3-bulk-linux-x64/spec.reb}
 [SISKIN] Evaluate pre-build scripts..
 [SISKIN] EVAL: /opt/pkg/siskin/siskin-linux-x64 --script make/pre-make.r3 /home/user/Source/Clones/Rebol3/make/tmp/gcc-x64/rebol3-bulk-linux-x64/spec.reb
 [SISKIN] ** Error:
 [SISKIN] ** syntax error: this script needs core 3.6.0 or better to run correctly
 [SISKIN] Environment: ${AR} is "/usr/bin/ar"
 [SISKIN] Cleaning...
 [SISKIN] Preparing objects dir...
 [SISKIN] Preparing output file name...
 [SISKIN] Environment: ${_} is "make/tmp/gcc-x64/rebol3-bulk-linux-x64"
 [SISKIN] Environment: ${CC} is "gcc"
 [SISKIN] Environment: ${CCPP} is "gcc"

Compiling 156 files:
 [   1% ] Building object: $_/home/user/Source/Clones/Rebol3/src/core/a-constants.c.o
<command-line>: fatal error: gen-config.h: No such file or directory
compilation terminated.
 [   1% ] Building object: $_/home/user/Source/Clones/Rebol3/src/core/a-globals.c.o
<command-line>: fatal error: gen-config.h: No such file or directory
compilation terminated.
 [   2% ] Building object: $_/home/user/Source/Clones/Rebol3/src/core/a-lib.c.o
<command-line>: fatal error: gen-config.h: No such file or directory
compilation terminated.
 [SISKIN] ** Error: Source file not found:  /home/user/Source/Clones/Rebol3/src/core/b-boot.c

           .-.
          /'v'\
         (/uOu\)
โ•[SISKIN]โ•โ•"โ•"โ•>  Build failed (1)

REBOL System Error #1405

On Win7-64 both Rebol_3.4.0_x64 and Rebol_3.4.0_x86 work correctly. Instead version 3.5 (x64 and x86) causes the error "REBOL System Error # 1405".

System crash when reading any http request

The recent change of handling event/offset values in this commit: a6c966f
is causing crash when reading any url.

With quick look at it, problem may be, that http protocol is using event/offset as a hacky way to report need of redirection:

Rebol3/src/mezz/prot-http.r

Lines 124 to 127 in cfc52b0

if all [event/offset event/offset/x = 300][
event/port/state/state: 'redirect
return true
]

system/script/args is a block when script called from command line

Create a script as follows:

Rebol []
print type? system/script/args

then invoke from command line with rebol3-base-windows-x64.exe script.r 1.

Note that under other Redbol variants (Atronix, Red) it is a string, and is also a string if called from another script using do/args.

HTTP redirection does not handle correctly locations with url-encoded content

Example is reading release files from GitHub:

>>  read https://github.com/upx/upx/releases/download/v3.96/upx-3.96-win32.zip
...
    Location: {https://github-releases.githubusercontent.com/67031040/2f297180-3d73-11ea-81eb-e3192446510e?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20210304%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210304T095933Z&X-Amz-Expires=300&X-Amz-Signature=daef518d6ed958abf0892144b2232041583129ef451be0f6e55f5ff5deafb3fb&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=67031040&response-content-disposition=attachment%3B%20filename%3Dupx-3.96-win32.zip&response-content-type=application%2Foctet-stream}
...
 [HTTP] Redirect to: https://github-releases.githubusercontent.com/67031040/2f297180-3d73-11ea-81eb-e3192446510e?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%252F20210304%252Fus-east-1%252Fs3%252Faws4_request&X-Amz-Date=20210304T095933Z&X-Amz-Expires=300&X-Amz-Signature=daef518d6ed958abf0892144b2232041583129ef451be0f6e55f5ff5deafb3fb&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=67031040&response-content-disposition=attachment%253B%2520filename%253Dupx-3.96-win32.zip&response-content-type=application%252Foctet-stream
...
** Access error: protocol error: "Server error: HTTP/1.1 400 Bad Request"

Notice that for example: application%2Foctet-stream from the location is converted to: application%252Foctet-stream, which is cause of the problem!

[TLS] Error reading elyptic curve

Occasionally reading an url over HTTPS fails with:

[TLS] Error reading elyptic curve
ERR is an error of value:
  code            integer!   329
  type            word!      Script
  id              word!      out-of-range
  arg1            word!      LENGTH
  arg2            none!      none
  arg3            none!      none
  near            block!     length: 22 [binary/read der [tag-pos: INDEX class: UB 2 constr: BIT tag: UB 5 length: LENGTH data-pos: INDEX] tag-name: switch class [0 [DER...
  where           block!     length: 49 [binary while decode if try switch switch TLS-parse-handshake-message switch while TLS-read-data try switch -apply- wake-up eithe...

[TLS] ERROR: User cancelled

White color of the banner's background fills full line on window resize (Windows)

The banner on Windows must be modified, because when there is used background color and wrap text is enabled, which seems to be default on Win10, the background color is used for complete row, when the cmd window is resized.

That seems to be Windows bug (so out of reach).
Fortunately when there is on the tail of line any char (except space!), the result is ok.

Unable to decompress data which are suppose to be GZIPed

data: 64#{
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
vOadlEcYsjYJinHknFlO4As/oayNLBBcKji/AMgVjPKNxS7sO1IGA9YzfNvFZ9OA
njh8QQryVKx8Y3N8okwkQ7rOZdDz01BMxNBEaKbYJveKN6CafZeUCvPYzQnJML3Z
byrCwk84oGmjP0tJm+++vACr0iNl8ORsq8CQSJf0B4arTTaHC1gn0UyZAuIobhiW
dcP1ktQQb2CGZmWpVOXt6l/Fz0I1ygPvM65LJEHS78ZsHT4RwaNlSXWZKMazpsAk
dc3d2AWsz50Wiju93KWrUM93beWOGvxolGdRB9w5Dx7cMp7g5dlzMMMrFSKzloG9
bkjLnSd9gyJ5cDq2Zwi8yWvJ8gqJyaaiv7cqfsw1Hk+Os8ZjaNKUEkugaNOUkqbL
MjAd6LYaeAnIZLwiTOjYhU2CJq1HCZ2KKr3I+OKQ7jx/4rmq4ISdiBOWze6DXXqV
tJ2nSEOvfGfr+s4zwsPW/d0d8XPvISHwfT3uH5fMcPF+59nzJ7HEefINWN2G4/OE
RxFY8hxiwmcM6SnfVFrlaoV5d3zj4KO3gyGYvJ2oQSG4bilekWf4p5fvySEJc4bu
9j2z9wLAf3dxnrTsw06uvVsVpJqPU8wrg+zoM9DjfHfhkJRajYZzXyLPp1STsi3B
eYcEcYDz841L+JbClCZMavUDtBcPyQ6zlHeXO1j5le0Sdk8xf+2euCUa3+4Q2w1L
TYNMhIZGCogrVhjY+enVziU5+f74qoT97L4U5TxcN+BLAVyMUIuc3jtoyMhuot5A
6lzKPvh5dL6GwBX+FIDoLfWpezbsAz0QkNVIykg28p8KF5w8Q9U0yjkuw0WzF5Fw
Whtk0JNYy+xRjFSX0E3jRyH7uRGVA+POzrTx8aPPJ2Ln4dzu23NUFRtiWngUG+r8
tBOZdTs/T6/uuyNZGfuLq8KoC6rcg459KyhyZuk2dvnbkxKm0/NHrwxmaq+p45UO
8KFmn7jQOCsd4ETbwwevDEsrHfDJBr91LI/We+mgdA4Mwb/Cc8M7vaeq/5r66iCq
LCLFRUHCS37ae/LbfJ28QgNlpl54yUW7OR1Sw5zahSj16ee9EH0hJvAW109FxEPx
GSuMgpXinT0SC2+w1bPnlOF9QuZC4Wr1ZTX6a9ex/iXMiuszy7s+fQc/M34dVIyY
5URMNWjoIO51noX1nb1U4xqYSvYI87ueadBia79efS0A6/755p9kCovVVlmwERZ8
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
AgA=
}
decompress/gzip data

results:

** Script error: maximum limit reached: 177011
** Where: decompress
** Near: decompress/gzip data

It is possible to decompress it using 7zip if written to a file with .gz extension.

read/system/input skips the last character when used in CGI context

I have been following the Creating and Processing Web Forms with CGI (Tutorial) for Rebol, rewriting the code where necessary to make it work with your Rebol3 fork.
I came across an issue when using read/system/input to read the data of a POST request: the last character is skipped.
E.g: the expected content is Submit=submit&firstname=Jon&lastname=Doom, but the string returned by read/system/input is Submit=submit&firstname=Jon&lastname=Doo without the last character ('m').

The workaround I found is to add a hidden field with a value of one character as the last of my form.

Regards

cgi-helpers.txt
greetings.txt
simple-webform.txt

[HTTP] exists? on not existing URL throws error instead of FALSE

>> exists? https://www.google.com/not-exists
 [HTTP] Opening connection: tls://www.google.com:443
 [HTTP] Request: {HEAD /not-exists HTTP/1.1^M
Accept: */*^M
Accept-charset: utf-8^M
Accept-Encoding: gzip,deflate^M
Host: www.google.com^M
User-Agent: REBOL^M
}
 [HTTP] Headers: [
    Content-Length: "1571"
    Content-Encoding: none
    Transfer-Encoding: none
    Last-Modified: none
    Content-Type: "text/html; charset=UTF-8"
    Referrer-Policy: "no-referrer"
    Date: "Sat, 15 Feb 2020 15:47:20 GMT"
    Alt-Svc: {quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000}
]
 [HTTP] Throwing error: Server error:  line
** Access error: protocol error: "Server error: HTTP/1.1 404 Not Found"

It should just return false.

Duplicate "split" tests

It seems to me that there are duplicate "split" tests in the series-test.r3 file.
Ex. line 1928 -> 1943
1929 -> 1944
1930 -> 1972
1932 -> 1987 ....

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.