Code archives/Networking/Improved HTTP Streams
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| This HTTP stream type allows you to easily request web documents. The functions allow use of different request methods, GET, HEAD and POST, and also support authentication. This is a module, and requires Brucey's Base64 module for authentication. See first post for a non-module version without authentication. | |||||
SuperStrict
Rem
bbdoc: HTTP Streams
End Rem
Module Otus.HttpStream
ModuleInfo "Version: 1.00"
ModuleInfo "Author: Jan Varho"
ModuleInfo "License: Public domain"
Import BRL.SocketStream
Import BaH.Base64
Rem
bbdoc: Wrapper stream for HTTP requests
about:
The following HTTP methods are supported: GET, HEAD and POST.
An example:
<pre>Local s:TStream = THttpStream.Get("www.google.com")
While Not s.Eof()
Print s.ReadLine()
Wend</pre>
End Rem
Type THttpStream Extends TStreamWrapper
Rem
bbdoc: The HTTP User-Agent
about:
Only sent if you provide a non-empty value.
End Rem
Global user_agent:String = ""
Rem
bbdoc: HTTP headers sent by the server
about:
An example:
<pre>Local s:THttpStream = THttpStream.Head("www.google.com")
For h:string = EachIn s.headers
Print h
Next</pre>
End Rem
Field headers:String[]
Method _ReceiveHeaders()
Local l:String = _stream.ReadLine()
headers = [l]
l = _stream.ReadLine()
While l<>""
headers = headers + [l]
l = _stream.ReadLine()
Wend
End Method
Method _SendHeaders()
If user_agent _stream.WriteLine "User-Agent: "+user_agent
If headers
For Local h:String = EachIn headers
_stream.WriteLine h
Next
End If
_stream.WriteLine ""
End Method
Rem
bbdoc: Requests an URL using GET
about:
A convieniency function that allows you to easily GET an URL.
The http-prefix is optional and you can also supply authentication details:
<pre>Local s:TStream = THttpStream.GetURL("http://user:password@www.example.com/file.html")</pre>
End Rem
Function GetURL:THttpStream(url:String)
If url.StartsWith("http://") url = url[7..]
Local at:Int = url.Find("@"), auth:String
If at <> -1
auth = url[..at]
Local c:Byte Ptr = auth.ToCString()
auth = TBase64.Encode(c, auth.length)
MemFree c
auth = "Authorization: Basic "+auth
url = url[at+1..]
End If
at = url.Find("/")
Local server:String, file:String
If at = -1
server = url
file = "/"
Else
server = url[..at]
file = url[at..]
End If
If auth Return Get(server, 80, file, [auth])
Return Get(server, 80, file)
End Function
Rem
bbdoc: HTTP GET method
about:
Requests a file on a server with GET method. You can also supply your own additional headers.
End Rem
Function Get:THttpStream(server:String, port:Int=80, file:String="/", headers:String[]=Null)
Local stream:TStream=TSocketStream.CreateClient( server, port )
If Not stream Return Null
stream.WriteLine "GET "+file+" HTTP/1.0"
stream.WriteLine "Host: "+server
Local h:THttpStream = New THttpStream
h._stream = stream
h.headers = headers
h._SendHeaders
h._ReceiveHeaders
Return h
End Function
Rem
bbdoc: GET with authentication
about:
Requests a file on a server with GET method.
You can supply authentication details and also additional headers.
End Rem
Function GetAuth:THttpStream(server:String, user:String, pass:String, port:Int=80,..
file:String="/", headers:String[]=Null)
Local auth:String = user+":"+pass
Local c:Byte Ptr = auth.ToCString()
auth = TBase64.Encode(c, auth.length)
MemFree c
If headers
headers = headers + ["Authorization: Basic "+auth]
Else
headers = ["Authorization: Basic "+auth]
End If
Return Get(server, port, file, headers)
End Function
Rem
bbdoc: HTTP HEAD method
about:
Requests the headers for a file on a server. Use #headers to read them.
End Rem
Function Head:THttpStream(server:String, port:Int=80, file:String="/", headers:String[]=Null)
Local stream:TStream=TSocketStream.CreateClient( server, port )
If Not stream Return Null
stream.WriteLine "HEAD "+file+" HTTP/1.0"
stream.WriteLine "Host: "+server
Local h:THttpStream = New THttpStream
h._stream = stream
h.headers = headers
h._SendHeaders
h._ReceiveHeaders
Return h
End Function
Rem
bbdoc: HEAD with authentication
about:
Requests headers for a file on a server with HEAD method.
You can supply authentication details and also additional headers.
End Rem
Function HeadAuth:THttpStream(server:String, user:String, pass:String, port:Int=80,..
file:String="/", headers:String[]=Null)
Local auth:String = user+":"+pass
Local c:Byte Ptr = auth.ToCString()
auth = TBase64.Encode(c, auth.length)
MemFree c
If headers
headers = headers + ["Authorization: Basic "+auth]
Else
headers = ["Authorization: Basic "+auth]
End If
Return Head(server, port, file, headers)
End Function
Rem
bbdoc: HTTP POST method
about:
POST sends data to the server. You must specify the length any content of data.
Example:
<pre>Local s:String = "userid=admin&password=admin"
Local data:Byte Ptr = s.ToCString()
Local s:TStream = THttpStream.Post("www.example.com", data, s.length,..
"application/x-www-form-urlencoded", 80, "/auth.php")</pre>
End Rem
Function Post:THttpStream(server:String, content:Byte Ptr, clength:Int, ctype:String,..
port:Int=80, file:String="/", headers:String[]=Null)
Local stream:TStream=TSocketStream.CreateClient( server, port )
If Not stream Return Null
stream.WriteLine "POST "+file+" HTTP/1.0"
stream.WriteLine "Host: "+server
stream.WriteLine "Content-Length: "+clength
stream.WriteLine "Content-Type: "+ctype
Local h:THttpStream = New THttpStream
h._stream = stream
h.headers = headers
h._SendHeaders
stream.Write content, clength
stream.WriteLine ""
h._ReceiveHeaders
Return h
End Function
Rem
bbdoc: POST with authentication
about:
An authenticated version of #Post.
End Rem
Function PostAuth:THttpStream(server:String, content:Byte Ptr, clength:Int, ctype:String,..
user:String, pass:String, port:Int=80, file:String="/", headers:String[]=Null)
Local auth:String = user+":"+pass
Local c:Byte Ptr = auth.ToCString()
auth = TBase64.Encode(c, auth.length)
MemFree c
If headers
headers = headers + ["Authorization: Basic "+auth]
Else
headers = ["Authorization: Basic "+auth]
End If
Return Post(server, content, clength, ctype, port, file, headers)
End Function
End Type |
Comments
| ||
| Non-module without authentication (and dependencies): |
Code Archives Forum