HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0831
beatsockgetで取得したデータに混ざる文字列4解決


beat

リンク

2010/8/31(Tue) 12:30:24|NO.34731

はじめまして。
過去ログ等検索かけたのですが、どうも絞り込めず投稿します。

sockgetで取得したデータに以下のような文字列が挿入され、困っています。

 0D 0A ** ** ** ** 0D 0A (**は1〜4バイト程度の文字列(16進数?))

以下のスクリプトを実行しただけでも、HTMLが始まる直前に入っています。
ここだけなら別に構わないのですが、後のデータにも入るので処理に影響してしまいます。
単純なことなのかもしれませんが、よろしくお願いします。


#include "hspsock.as" host="hsp.tv" header ="GET / HTTP/1.1\n" header+="Host: "+host+"\n" header+="\n" sockopen 0,host,80 : sockput header,0 sdim res,$8000 : sdim t,$40 repeat $200 sockget t,$40 : if stat : return res+=t : await loop sockclose mes res



この記事に返信する


木村

リンク

2010/8/31(Tue) 21:23:30|NO.34761


HTTP/1.1 200 OK Date: Tue, 31 Aug 2010 12:11:16 GMT Server: Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e Transfer-Encoding: chunked Content-Type: text/html fe7 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> ………………以下長々とhtmlソースが続く

 上はbeatさんのサンプルを当方で流してみて、変数resに返ってきた内容の先端を表示した
ものです。恐らくbeatさんの言われるノイズ(=『0D 0A ** ** ** ** 0D 0A』)とは上記文で
言うところの『\nfe7\n』の部分ではないのでしょうか。
 だとすれば素直にresにnotesel命令を掛けてから、5〜6行目を削除(notedel命令)して
しまえば、beatさんの望む形になると思われます。

 もし、私の指摘した部分が見当違いならば、生じるノイズの領域を具体的に提示して
ください。メモリダンプ上からbeatさんの言われる『0D 0A ** ** ** ** 0D 0A』の部分を
探し出すのは非常に苦労です。



inovia

リンク

2010/8/31(Tue) 21:35:14|NO.34762


Transfer-Encoding: chunked
になっていますので、チャンク形式のデータになっています。
謎の16進数はデータサイズを表します。

詳しいことは以下を見てください。
http://www.tohoho-web.com/ex/http.htm#chunk



inovia

リンク

2010/8/31(Tue) 21:56:23|NO.34763

ちなみに HTTP/1.1 のところを HTTP/1.0 にすると
チャンク形式で返ってくることはありません。



beat

リンク

2010/9/1(Wed) 12:43:29|NO.34778

レスポンスに答えはちゃんと書かれていたんですね、お恥ずかしい。。

HTTP 1.0 でやりとりした方が手っ取り早そうですが、
チャンクサイズの除去は簡単そうなので、とりあえず書いてみました。

//ヘッダとチャンクサイズを除去 #defcfunc unchunked str p1 s=p1 : leng=strlen(s) : sdim buf,leng repeat leng p=lpeek(s,cnt) : if p=$0A0D0A0D : n=cnt+4 : break await loop repeat leng-n,n p=wpeek(s,cnt) : await if p=$0A0D { tmp="" : memcpy tmp,s,cnt-n,,n n=instr(tmp,0," ") : if n!-1 : tmp=strmid(tmp,0,n) //対策A p=int("$"+tmp) : if p=0 : break n=leng-cnt-2 : if (p>n) : p=n memcpy buf,s,p,i,cnt+2 : i+=p n=p+cnt+4 : continue n } loop sdim s return buf
ひどい突貫工事です。
もっと仕様を知る必要がありそうなので、この機会に調べてきます。
どうもありがとうございました!



ONION software Copyright 1997-2023(c) All rights reserved.