6

Rebol/Core新しいサービスの場所へのリダイレクト リンクを含む、静的テキストを提供する一種の Web サーバーを作成するために (278-3-1) をいじっているときに、明らかにキャッチできないエラーが発生しました。

Carl Sassenrathエラーの特定の場所は、 2006 年に彼自身が書いたサンプル コードにあるようです。そのため、何年も経っても検出されないエラーが存在する可能性があることに少し困惑しています。

これらのスクリプトを 3 つ同時に実行し、3 つの個別のポートを監視しています。基本的に、スクリプトは正常に動作します...一度に複数のブラウザーで(すべての並列スクリプトで)繰り返しアクセスすると、かなり安定しているように見えます...しかし、次々と失敗します。場合によっては 2 分後、場合によっては 20 分後 - print ステートメントを追加した後、60 分後になることもありますが、最終的には次のように失敗します。

** スクリプト エラー: 範囲外または過去の終わり
** 場所: ずっと
** 近く: 空ではありませんか? リクエスト: 最初の http ポート

プログラム ループのほぼすべての部分を try[][exception] でラップしようとしましたが、それでもエラーが発生します。残念ながら、この時期は検索機能が弱いようです。問題を説明できるものは何も見つからなかったからです。

このコードは、Carl Sassenrath のTiny Web Serverの縮小版で、特定の IP にバインドし、ファイルをロードする代わりに HTML を出力するようにわずかに変更されています。

REBOL [title: "TestMovedServer"]
AppName: "Test"
NewSite: "http://test.myserver.org"

listen-port: open/lines tcp://:81   browse http://10.100.44.6?
buffer: make string! 1024  ; will auto-expand if needed

forever [
    http-port: first wait listen-port
    clear buffer

    while [not empty? request: first http-port][
        print request
        repend buffer [request newline]
        print "----------"
    ]
    repend buffer ["Address: " http-port/host newline] 
    print buffer
    Location: ""
    mime: "text/html"
    parse buffer ["get" ["http" | "/ " | copy Location to " "]]

    data: rejoin [{
        <HTML><HEAD><TITLE>Site Relocated</TITLE></HEAD>
        <BODY><CENTER><BR><BR><BR><BR><BR><BR>
        <H1>} AppName { have moved to <A HREF="} NewSite {">} NewSite {</A></H1>
        <BR><BR><BR>Please update the link you came from.
        <BR><BR><BR><BR><BR><A HREF="} NewSite Location {">(Continue directly to the requested page)</A>
        </CENTER></BODY></HTML>
    }]  
    insert data rejoin ["HTTP/1.0 200 OK^/Content-type: " mime "^/^/"]
    write-io http-port data length? data
    close http-port
    print "============"
]

皆さんがこれから何を作るかを楽しみにしています!

4

2 に答える 2

3

閉じた接続から読み取ろうとすると、エラーが発生します。これはうまくいくようです。

n: 0
forever [
   http-port: first wait listen-port
   clear buffer
   if attempt [all [request: first http-port  not empty? request]] [
      until [
        print request
        repend buffer [request newline]
        print "----------"
        any [not request: first http-port empty? request]
      ]
      repend buffer ["Address: " http-port/host newline] 
      print buffer
      Location: ""
      mime: "text/html"
      parse buffer ["get" ["http" | "/ " | copy Location to " "]]

      data: rejoin [{
        <HTML><HEAD><TITLE>Site Relocated</TITLE></HEAD>
        <BODY><CENTER><BR><BR><BR><BR><BR><BR>
        <H1>} AppName n: n + 1 { has moved to <A HREF="} NewSite {">} NewSite {</A></H1>
        <BR><BR><BR>Please update the link you came from.
        <BR><BR><BR><BR><BR><A HREF="} NewSite Location {">(Continue directly to the requested page)</A>
        </CENTER></BODY></HTML>
      }]  
      insert data rejoin ["HTTP/1.0 200 OK^/Content-type: " mime "^/^/"]
      write-io http-port data length? data
  ]
  attempt [close http-port]
  print "============"
]
于 2015-12-22T08:33:33.150 に答える
1

empty? のドキュメントを見てみましょう。概要:

シリーズが末尾にある場合は TRUE を返します。使用法:

空の?シリーズの引数:

series - シリーズ引数。(次のようにする必要があります: シリーズ ポート ビットセット)

そんなに空?シリーズ、ポート、ビットセット、または文字列引数が必要です。ポートへの接続が開いている限り、変数(request )はそれらのいずれかを取得しています。空の?その後、変数の末尾にあるかどうかを判断できます。接続が閉じられたり中断されたりすると、変数は何も受け取りませんが、ポートに接続する際にアクセス エラーが発生します。エラーにはテールがありません。空の?混乱してエラーでクラッシュします。

sqlab は空に置き換えられましたか? 試みながら

if attempt [all [request: first http-port  not empty? request]]

ATTEMPT 関数は、よくある次のケースのショートカットです。

error? try [block]

彼は間違いを防いでいるだけでなく、も守っていません。エラーが発生しなかった場合、ATTEMPT はブロックの結果を返します。エラーが発生した場合は、NONE が返されます。また、まで

any [not request: first http-port empty? request]

彼は両方を守っています。

したがって、彼のコードは機能しています。

于 2016-01-17T17:10:10.033 に答える